#include #include #include #include #include #include Bond::Bond(void) : Instrument(StraightBond), mPar(0.00), mYTM(0), mYield(0.00) { } Bond::Bond(const Bond &bond) { *this=bond; } Bond::Bond(double par,const Coupon &coupon,int ytm,double price) { Instrument::price(price); Instrument::coupon(coupon); Instrument::type(StraightBond); Bond::par(par); Bond::ytm(ytm); Bond::yield(0.00); } Bond::~Bond() { } Bond &Bond::operator=(const Bond &bond) { par(bond.par()); ytm(bond.ytm()); price(bond.price()); coupon(bond.coupon()); yield(bond.yield()); type(StraightBond); return *this; } BOOL Bond::operator==(const Bond &bond)const { return (par()==bond.par()&& ytm()==bond.ytm()&& price()==bond.price()&& coupon()==bond.coupon()&& yield()==bond.yield()&& type()==bond.type()); } double Bond::par(void)const { return mPar; } void Bond::par(double par) { mPar=par; } const Rate &Bond::yield(void)const { return mYield; } void Bond::yield(const Rate &yield) { mYield=yield; } int Bond::ytm(void)const { return mYTM; } void Bond::ytm(int ytm) { mYTM=ytm; } // virtuals BOOL Bond::cashflows(GlobalData &cashflows) { double semiAnnualPmt; int periods; Coupon coupon(coupon()); coupon.makeSemiAnnual(); periods=coupon.frequency()*ytm(); semiAnnualPmt=par()*coupon.decimalRate(); cashflows.size(periods); for(int period=0;periodprice()) { maxGuess=guess; guess.rate((guess.rate()+minGuess.rate())/2.00); } else { minGuess=guess; guess.rate((guess.rate()+maxGuess.rate())/2.00); } printf("calculated price:%lf market price:%lf\n",price(),market); } yield(guess); return yield(); }