std::vector<boost::shared_ptr<CashFlow> > RiskyBond::expectedCashflows() { std::vector<boost::shared_ptr<CashFlow> > expected; std::vector<boost::shared_ptr<CashFlow> > cf = cashflows(); Date today = Settings::instance().evaluationDate(); Date npvDate = calendar_.advance(today, settlementDays_, Days); Date d1 = effectiveDate(); for (Size i = 0; i < cf.size(); i++) { Date d2 = cf[i]->date(); if (d2 > npvDate) { d1 = max(npvDate, d1); Date defaultDate = d1 + (d2-d1)/2; Real coupon = cf[i]->amount() * defaultTS_->survivalProbability(d2); Real recovery = notional(defaultDate) * recoveryRate_ * (defaultTS_->survivalProbability(d1) -defaultTS_->survivalProbability(d2)); boost::shared_ptr<CashFlow> flow1(new SimpleCashFlow(coupon, d2)); expected.push_back(flow1); boost::shared_ptr<CashFlow> flow2(new SimpleCashFlow(recovery, defaultDate)); expected.push_back(flow2); } d1 = d2; } return expected; }
TER Taker::cross (Offer const& leg1, Offer const& leg2) { assert (!done ()); assert (leg1.amount ().out.isNative ()); assert (leg2.amount ().in.isNative ()); Amounts amount1 (leg1.amount()); Amounts amount2 (leg2.amount()); if (m_options.sell) amount1 = leg1.quality().ceil_in (amount1, m_remain.in); else amount2 = leg2.quality().ceil_out (amount2, m_remain.out); if (amount1.out <= amount2.in) amount2 = leg2.quality().ceil_in (amount2, amount1.out); else amount1 = leg1.quality().ceil_out (amount1, amount2.in); assert (amount1.out == amount2.in); // As written, flow can't handle a 3-party transfer, but this works for // us because the output of leg1 and the input leg2 are XRP. Amounts flow1 (flow (amount1, leg1, m_account)); amount2 = leg2.quality().ceil_in (amount2, flow1.out); Amounts flow2 (flow (amount2, leg2, m_account)); m_remain.out -= amount2.out; m_remain.in -= amount1.in; return fill (leg1, flow1, leg2, flow2); }
void runlogic() { init_script(); flow2(); ns_exit_session(); }