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 }