#include #include #include Portfolio::Portfolio(void) { } Portfolio::Portfolio(const Portfolio &portfolio) { // private implementation *this=portfolio; } Portfolio::~Portfolio() { } Portfolio &Portfolio::operator=(const Portfolio &/*portfolio*/) { // private implementation return *this; } BOOL Portfolio::operator==(const Portfolio &portfolio)const { return FALSE; } double Portfolio::discount(Rate yield,GlobalData &cashflows) { double price(0.00); yield.makeSemiAnnual(); for(int index=0;indexcoupon(); rate.makeAnnual(); weighted+=rate.decimalRate()*operator[](index)->par(); parValue+=operator[](index)->par(); } weighted/=parValue; return Rate(weighted*100.00,Annual); } Rate Portfolio::discount(double market,GlobalData &cashflows) { Rate guess(wac()); Rate maxGuess; Rate minGuess; double price; int maxPly=50; int ply=0; maxGuess=guess; minGuess=guess; maxGuess.rate(guess.rate()+12.00); minGuess.rate(guess.rate()-12.00); if(minGuess.rate()<0.00)minGuess.rate(1.00); while(TRUE) { price=discount(guess,cashflows); if(price==market||(price-market<0.00?market-price:price-market)<1.00)break; if(market>price) { maxGuess=guess; guess.rate((guess.rate()+minGuess.rate())/2.00); } else { minGuess=guess; guess.rate((guess.rate()+maxGuess.rate())/2.00); } if(++ply>maxPly)return Rate(0.00); printf("calculated price:%lf market price:%lf\n",price,market); } return guess; } int Portfolio::getCashflows(GlobalData &sumCashflows) { GlobalData > cashflows; int maxFlows(0); cashflows.size(size()); for(int index=0;indexcashflows(cashflows[index]); for(index=0;indexmaxFlows)maxFlows=cashflows[index].size(); } sumCashflows.size(maxFlows); for(int pIndex=0;pIndex &cashflow=cashflows[pIndex]; for(int index=0;index cashflows; double price(0.00); getCashflows(cashflows); for(int index=0;indexprice(); return Rate(discount(price,cashflows)); }