Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

OptionStrategy.cpp

Go to the documentation of this file.
00001 #include ".\optionstrategy.h"
00002 
00003 OptionStrategy::OptionStrategy(void)
00004 {
00005         _nbOptions=0;
00006         _insideOptions.resize(maxNbOptions);
00007         _insideQuantities.resize(maxNbOptions);
00008 }
00009 
00010 OptionStrategy::~OptionStrategy(void)
00011 {
00012 }
00013 
00014 Real OptionStrategy::returnPrice()
00015 {
00016         return _price;
00017 }
00018 
00019 Real OptionStrategy::recalcPrice()
00020 {
00021         Real result=0;
00022         for (unsigned int i=0;i<_nbOptions;i++) {
00023                 result+=_insideQuantities[i]*_insideOptions[i]->getPrice();
00024         }
00025         _price=result;
00026         return result;
00027 }
00028 
00029 void OptionStrategy::addOneOptionToStrategy(Real spot, Real vol,bool isVol, Real r, Real K, Real T, TypeOptionBS type, Real Quantity) {
00030         BlackScholes* bs= new BlackScholes(spot,vol,isVol,r,K,T,type);
00031         _insideOptions[_nbOptions]=bs;
00032         _insideQuantities[_nbOptions]=Quantity;
00033         _price+=Quantity*bs->getPrice();
00034         _nbOptions++;
00035 }
00036 
00037 void OptionStrategy::addOneBlackScholesObject(BlackScholes* bs, Real Quantity) {
00038         _insideOptions[_nbOptions]=bs;
00039         _insideQuantities[_nbOptions]=Quantity;
00040         _price+=Quantity*bs->getPrice();
00041         _nbOptions++;
00042 }
00043 
00044 void OptionStrategy::addLongCallSpread(Real spot,Real volStrike1,bool isVol1,Real volStrike2,bool isVol2,Real r, Real K1, Real K2, Real T,Real Quantity) {
00046         if (K2>=K1) {
00047                 addOneOptionToStrategy(spot,volStrike1,isVol1,r,K1,T,Call,Quantity);
00048                 addOneOptionToStrategy(spot,volStrike2,isVol2,r,K2,T,Call,-Quantity);
00049         }
00050         else {
00051                 addOneOptionToStrategy(spot,volStrike1,isVol1,r,K1,T,Call,-Quantity);
00052                 addOneOptionToStrategy(spot,volStrike2,isVol2,r,K2,T,Call,Quantity);
00053         }
00054 }
00055 
00056 void OptionStrategy::addLongStraddle(Real spot,Real vol,bool isVol, Real r, Real K, Real T,Real Quantity) {
00057         addOneOptionToStrategy(spot,vol,isVol,r,K,T,Call,Quantity);
00058         addOneOptionToStrategy(spot,vol,isVol,r,K,T,Put,Quantity);
00059 }
00060 
00061 void OptionStrategy::addLongStrangle(Real spot,Real volStrike1,bool isVol1,Real volStrike2,bool isVol2,Real r, Real K1, Real K2, Real T,Real Quantity) {
00062         if (K2>=K1) {
00063                 addOneOptionToStrategy(spot,volStrike1,isVol1,r,K1,T,Put,Quantity);
00064                 addOneOptionToStrategy(spot,volStrike2,isVol2,r,K2,T,Call,Quantity);
00065         }
00066         else {
00067                 addOneOptionToStrategy(spot,volStrike2,isVol2,r,K2,T,Put,Quantity);
00068                 addOneOptionToStrategy(spot,volStrike1,isVol1,r,K1,T,Call,Quantity);
00069         }
00070 }
00071 
00072 void OptionStrategy::addLongButterflySpread(Real spot,Real volStrike1,bool isVol1,Real volStrike2,bool isVol2,Real volStrike3,bool isVol3, Real r, Real K1, Real K2, Real T,Real Quantity) {
00073         addOneOptionToStrategy(spot, volStrike3, isVol3, r, (K1+K2)/2, T, Call, -2*Quantity);
00074         addOneOptionToStrategy(spot, volStrike1, isVol1, r, K1, T, Call, Quantity);
00075         addOneOptionToStrategy(spot, volStrike2, isVol2, r, K2, T, Call, Quantity);
00076 }
00077 
00078 void OptionStrategy::addLongButterflySpread(Real spot,Real volStrike1,bool isVol1,Real volStrike2,bool isVol2,Real volStrike3,bool isVol3, Real r, Real K1, Real K2, Real K3, Real T,Real Quantity) {
00079         addOneOptionToStrategy(spot, volStrike3, isVol3, r, K3, T, Call, -2*Quantity);
00080         addOneOptionToStrategy(spot, volStrike1, isVol1, r, K1, T, Call, Quantity);
00081         addOneOptionToStrategy(spot, volStrike2, isVol2, r, K2, T, Call, Quantity);
00082 }
00083 
00084 void OptionStrategy::addLongRatioCallSpread(Real spot,Real volStrike1,bool isVol1,Real volStrike2,bool isVol2, Real r, Real K1, Real K2, Real T,Real Quantity) {
00085         if (K2>=K1) {
00086                 addOneOptionToStrategy(spot,volStrike1,isVol1,r,K1,T,Call,Quantity);
00087                 addOneOptionToStrategy(spot,volStrike2,isVol2,r,K2,T,Call,-2*Quantity);
00088         }
00089         else {
00090                 addOneOptionToStrategy(spot,volStrike1,isVol1,r,K1,T,Call,-2*Quantity);
00091                 addOneOptionToStrategy(spot,volStrike2,isVol2,r,K2,T,Call,Quantity);
00092         }
00093 }
00094 
00095 void OptionStrategy::addLongPutSpread(Real spot,Real volStrike1,bool isVol1,Real volStrike2,bool isVol2,Real r, Real K1, Real K2, Real T,Real Quantity) {
00096         if (K2>=K1) {
00097                 addOneOptionToStrategy(spot,volStrike1,isVol1,r,K1,T,Put,-Quantity);
00098                 addOneOptionToStrategy(spot,volStrike2,isVol2,r,K2,T,Put,Quantity);
00099         }
00100         else {
00101                 addOneOptionToStrategy(spot,volStrike1,isVol1,r,K1,T,Put,Quantity);
00102                 addOneOptionToStrategy(spot,volStrike2,isVol2,r,K2,T,Put,-Quantity);
00103         }
00104 }
00105 
00106 Real OptionStrategy::getGlobalDelta() {
00107         Real Result=0;
00108         for (unsigned int i=0;i<_nbOptions;i++) {
00109                 Result+=_insideQuantities[i]*(_insideOptions[i])->getDelta();
00110         }
00111         return Result;
00112 }
00113 
00114 Real OptionStrategy::getGlobalGamma() {
00115         Real Result=0;
00116         for (unsigned int i=0;i<_nbOptions;i++) {
00117                 Result+=_insideQuantities[i]*(_insideOptions[i])->getGamma();
00118         }
00119         return Result;
00120 }
00121 
00122 Real OptionStrategy::getGlobalVega() {
00123         Real Result=0;
00124         for (unsigned int i=0;i<_nbOptions;i++) {
00125                 Result+=_insideQuantities[i]*(_insideOptions[i])->getVega();
00126         }
00127         return Result;
00128 }
00129 
00130 Real OptionStrategy::getGlobalTheta() {
00131         Real Result=0;
00132         for (unsigned int i=0;i<_nbOptions;i++) {
00133                 Result+=_insideQuantities[i]*(_insideOptions[i])->getTheta();
00134         }
00135         return Result;
00136 }
00137 
00138 Real OptionStrategy::getGlobalRho() {
00139         Real Result=0;
00140         for (unsigned int i=0;i<_nbOptions;i++) {
00141                 Result+=_insideQuantities[i]*(_insideOptions[i])->getRho();
00142         }
00143         return Result;
00144 }
00145 
00146 
00147 Natural OptionStrategy::returnNbOptions() const{
00148         return _nbOptions;
00149 }
00150 
00151 BlackScholes* OptionStrategy::returnOption(Natural i) const{
00152         if (i<_insideOptions.size()) return _insideOptions[i];
00153         else return NULL;
00154 }
00155 
00156 Real OptionStrategy::returnOptionQuantity(Natural i) const{
00157         if (i<_insideOptions.size()) return _insideQuantities[i];
00158         else return NULL;
00159 }
00160 
00161 void OptionStrategy::changeRate(Real addConstant) {
00162         for (unsigned int i=0;i<_nbOptions;i++) {
00163                 BlackScholes& bs=*_insideOptions[i];
00164                 bs.changeRate(bs.getRate()+addConstant);
00165         }
00166 }
00167 
00168 void OptionStrategy::changeVol(Real addConstant) {
00169         for (unsigned int i=0;i<_nbOptions;i++) {
00170                 BlackScholes& bs=*_insideOptions[i];
00171                 bs.changeVol(bs.getVolatility()+addConstant);
00172         }
00173 }
00174 
00175 void OptionStrategy::changeMaturity(Real addConstant) {
00176         for (unsigned int i=0;i<_nbOptions;i++) {
00177                 BlackScholes& bs=*_insideOptions[i];
00178                 bs.changeMaturity(bs.getMaturity()+addConstant);
00179         }
00180 }
00181 
00182 void OptionStrategy::changeSpot(Real addConstant) {
00183         for (unsigned int i=0;i<_nbOptions;i++) {
00184                 BlackScholes& bs=*_insideOptions[i];
00185                 bs.changeSpot(bs.getSpot()+addConstant);
00186         }
00187 }
00188 
00189 void OptionStrategy::changeStrike(Real addConstant) {
00190         for (unsigned int i=0;i<_nbOptions;i++) {
00191                 BlackScholes& bs=*_insideOptions[i];
00192                 bs.changeStrike(bs.getStrike()+addConstant);
00193         }
00194 }
00195 
00196 ostream& operator << (ostream &os, const OptionStrategy &optionStrategy) {
00197         os << "Qty,\tType,\tSpot,\tStrike,\tVolatility,\tRate,\t\tExp" << endl;
00198         char* type=new char[4];
00199         for (Natural i=0;i<optionStrategy.returnNbOptions(); i++) {
00200                 if (optionStrategy.returnOption(i)->isCall())   sprintf(type,"Call");
00201                 else sprintf(type,"Put");
00202                 os << optionStrategy.returnOptionQuantity(i)<<",\t" << type << ",\t" << optionStrategy.returnOption(i)->getSpot() << ",\t" << optionStrategy.returnOption(i)->getStrike() << ",\t" << optionStrategy.returnOption(i)->getVolatility() << ",\t" << optionStrategy.returnOption(i)->getRate() << ",\t"<< optionStrategy.returnOption(i)->getMaturity() << endl;
00203         }
00204         return os;
00205 }

Note: Generated nightly - reload for latest version
Generated on Thu Dec 22 23:12:36 2005 for terreneuve by doxygen 1.3.6