public double callOptionRate()
{
double callOptionRate = 0.0;
if (hasCallStrike_)
{
// Step function
callOptionRate = isCallCashOrNothing_ ? callDigitalPayoff_ : callStrike_;
CappedFlooredCoupon next = new CappedFlooredCoupon(underlying_, callStrike_ + callRightEps_);
CappedFlooredCoupon previous = new CappedFlooredCoupon(underlying_, callStrike_ - callLeftEps_);
callOptionRate *= (next.rate() - previous.rate()) / (callLeftEps_ + callRightEps_);
if (!isCallCashOrNothing_)
{
// Call
CappedFlooredCoupon atStrike = new CappedFlooredCoupon(underlying_, callStrike_);
double call = underlying_.rate() - atStrike.rate();
// Sum up
callOptionRate += call;
}
}
return callOptionRate;
}