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 }