protected virtual double optionletPrice(Option.Type optionType, double effStrike)
{
Date fixingDate = coupon_.fixingDate();
if (fixingDate <= Settings.evaluationDate())
{
// the amount is determined
double a, b;
if (optionType == Option.Type.Call)
{
a = coupon_.indexFixing();
b = effStrike;
}
else
{
a = effStrike;
b = coupon_.indexFixing();
}
return Math.Max(a - b, 0.0) * coupon_.accrualPeriod() * discount_;
}
else
{
// not yet determined, use Black/DD1/Bachelier/whatever from Impl
if (capletVolatility().empty())
throw new ApplicationException("missing optionlet volatility");
double stdDev =
Math.Sqrt(capletVolatility().link.totalVariance(fixingDate, effStrike));
double fixing = optionletPriceImp(optionType,
effStrike,
adjustedFixing(),
stdDev);
return fixing * coupon_.accrualPeriod() * discount_;
}
}