diff --git a/ql/quotes/futuresconvadjustmentquote.cpp b/ql/quotes/futuresconvadjustmentquote.cpp index 44e22f6ba06..003dd988d67 100644 --- a/ql/quotes/futuresconvadjustmentquote.cpp +++ b/ql/quotes/futuresconvadjustmentquote.cpp @@ -36,6 +36,7 @@ namespace QuantLib { registerWith(futuresQuote_); registerWith(volatility_); registerWith(meanReversion_); + registerWith(Settings::instance().evaluationDate()); } FuturesConvAdjustmentQuote::FuturesConvAdjustmentQuote(const ext::shared_ptr& index, @@ -50,19 +51,22 @@ namespace QuantLib { registerWith(futuresQuote_); registerWith(volatility_); registerWith(meanReversion_); + registerWith(Settings::instance().evaluationDate()); } Real FuturesConvAdjustmentQuote::value() const { - - Date settlementDate = Settings::instance().evaluationDate(); - Time startTime = dc_.yearFraction(settlementDate, futuresDate_); - Time indexMaturity = dc_.yearFraction(settlementDate, - indexMaturityDate_); - return HullWhite::convexityBias(futuresQuote_->value(), - startTime, - indexMaturity, - volatility_->value(), - meanReversion_->value()); + if (rate_ == Null()) { + Date settlementDate = Settings::instance().evaluationDate(); + Time startTime = dc_.yearFraction(settlementDate, futuresDate_); + Time indexMaturity = dc_.yearFraction(settlementDate, + indexMaturityDate_); + rate_ = HullWhite::convexityBias(futuresQuote_->value(), + startTime, + indexMaturity, + volatility_->value(), + meanReversion_->value()); + } + return rate_; } bool FuturesConvAdjustmentQuote::isValid() const { diff --git a/ql/quotes/futuresconvadjustmentquote.hpp b/ql/quotes/futuresconvadjustmentquote.hpp index 0c2e8c9f477..78ce8c45f0c 100644 --- a/ql/quotes/futuresconvadjustmentquote.hpp +++ b/ql/quotes/futuresconvadjustmentquote.hpp @@ -29,6 +29,7 @@ #include #include #include +#include namespace QuantLib { @@ -65,11 +66,13 @@ namespace QuantLib { Handle futuresQuote_; Handle volatility_; Handle meanReversion_; + mutable Real rate_ = Null(); }; // inline - inline void FuturesConvAdjustmentQuote::update(){ + inline void FuturesConvAdjustmentQuote::update() { + rate_ = Null(); notifyObservers(); }