@@ -52,7 +52,8 @@ template <class T, typename... Args> class CachingOptionEngineBuilder : public C
5252 boost::shared_ptr<QuantLib::GeneralizedBlackScholesProcess> getBlackScholesProcess (const string& assetName,
5353 const Currency& ccy,
5454 const AssetClass& assetClassUnderlying,
55- const std::vector<Time>& timePoints = {}) {
55+ const std::vector<Time>& timePoints = {},
56+ const bool useFxSpot = true ) {
5657
5758 using VVTS = QuantExt::BlackMonotoneVarVolTermStructure;
5859 string config = this ->configuration (ore::data::MarketContext::pricing);
@@ -74,9 +75,15 @@ template <class T, typename... Args> class CachingOptionEngineBuilder : public C
7475 vol = Handle<BlackVolTermStructure>(boost::make_shared<VVTS>(vol, timePoints));
7576 vol->enableExtrapolation ();
7677 }
78+ if (useFxSpot) {
79+ return boost::make_shared<QuantLib::GeneralizedBlackScholesProcess>(
80+ this ->market_ ->fxSpot (ccyPairCode, config), this ->market_ ->discountCurve (assetName, config),
81+ this ->market_ ->discountCurve (ccy.code (), config), vol);
82+ }
7783 return boost::make_shared<QuantLib::GeneralizedBlackScholesProcess>(
78- this ->market_ ->fxSpot (ccyPairCode, config), this ->market_ ->discountCurve (assetName, config),
84+ this ->market_ ->fxRate (ccyPairCode, config), this ->market_ ->discountCurve (assetName, config),
7985 this ->market_ ->discountCurve (ccy.code (), config), vol);
86+
8087
8188 } else if (assetClassUnderlying == AssetClass::COM) {
8289
@@ -109,25 +116,26 @@ template <class T, typename... Args> class CachingOptionEngineBuilder : public C
109116 \ingroup builders
110117 */
111118class VanillaOptionEngineBuilder
112- : public CachingOptionEngineBuilder<string, const string&, const Currency&, const AssetClass&, const Date&> {
119+ : public CachingOptionEngineBuilder<string, const string&, const Currency&, const AssetClass&, const Date&, const bool > {
113120public:
114121 VanillaOptionEngineBuilder (const string& model, const string& engine, const set<string>& tradeTypes,
115122 const AssetClass& assetClass, const Date& expiryDate)
116123 : CachingOptionEngineBuilder(model, engine, tradeTypes, assetClass), expiryDate_(expiryDate) {}
117124
118- boost::shared_ptr<PricingEngine> engine (const string& assetName, const Currency& ccy, const Date& expiryDate) {
125+ boost::shared_ptr<PricingEngine> engine (const string& assetName, const Currency& ccy, const Date& expiryDate, const bool useFxSpot = true ) {
119126 return CachingPricingEngineBuilder<string, const string&, const Currency&, const AssetClass&,
120- const Date&>::engine (assetName, ccy, assetClass_, expiryDate);
127+ const Date&, const bool >::engine (assetName, ccy, assetClass_, expiryDate, useFxSpot );
121128 }
122129
123- boost::shared_ptr<PricingEngine> engine (const Currency& ccy1, const Currency& ccy2, const Date& expiryDate) {
130+ boost::shared_ptr<PricingEngine> engine (const Currency& ccy1, const Currency& ccy2, const Date& expiryDate,
131+ const bool useFxSpot = true ) {
124132 return CachingPricingEngineBuilder<string, const string&, const Currency&, const AssetClass&,
125- const Date&>::engine (ccy1.code (), ccy2, assetClass_, expiryDate);
133+ const Date&, const bool >::engine (ccy1.code (), ccy2, assetClass_, expiryDate, useFxSpot );
126134 }
127135
128136protected:
129137 virtual string keyImpl (const string& assetName, const Currency& ccy, const AssetClass& assetClassUnderlying,
130- const Date& expiryDate) override {
138+ const Date& expiryDate, const bool useFxSpot ) override {
131139 return assetName + " /" + ccy.code () + " /" + to_string (expiryDate);
132140 }
133141
@@ -147,7 +155,7 @@ class EuropeanOptionEngineBuilder : public VanillaOptionEngineBuilder {
147155protected:
148156 virtual boost::shared_ptr<PricingEngine> engineImpl (const string& assetName, const Currency& ccy,
149157 const AssetClass& assetClassUnderlying,
150- const Date& expiryDate) override {
158+ const Date& expiryDate, const bool useFxSpot ) override {
151159 boost::shared_ptr<QuantLib::GeneralizedBlackScholesProcess> gbsp =
152160 getBlackScholesProcess (assetName, ccy, assetClassUnderlying);
153161 Handle<YieldTermStructure> discountCurve =
@@ -168,8 +176,8 @@ class EuropeanForwardOptionEngineBuilder : public VanillaOptionEngineBuilder {
168176
169177protected:
170178 virtual boost::shared_ptr<PricingEngine> engineImpl (const string& assetName, const Currency& ccy,
171- const AssetClass& assetClassUnderlying,
172- const Date& expiryDate ) override {
179+ const AssetClass& assetClassUnderlying, const Date& expiryDate,
180+ const bool useFxSpot ) override {
173181 boost::shared_ptr<QuantLib::GeneralizedBlackScholesProcess> gbsp =
174182 getBlackScholesProcess (assetName, ccy, assetClassUnderlying);
175183 Handle<YieldTermStructure> discountCurve =
@@ -188,8 +196,8 @@ class EuropeanCSOptionEngineBuilder : public VanillaOptionEngineBuilder {
188196
189197protected:
190198 virtual boost::shared_ptr<PricingEngine> engineImpl (const string& assetName, const Currency& ccy,
191- const AssetClass& assetClassUnderlying,
192- const Date& expiryDate ) override {
199+ const AssetClass& assetClassUnderlying, const Date& expiryDate,
200+ const bool useFxSpot ) override {
193201 boost::shared_ptr<QuantLib::GeneralizedBlackScholesProcess> gbsp =
194202 getBlackScholesProcess (assetName, ccy, assetClassUnderlying);
195203 Handle<YieldTermStructure> discountCurve =
@@ -223,7 +231,8 @@ class AmericanOptionFDEngineBuilder : public AmericanOptionEngineBuilder {
223231
224232protected:
225233 virtual boost::shared_ptr<PricingEngine> engineImpl (const string& assetName, const Currency& ccy,
226- const AssetClass& assetClass, const Date& expiryDate) override {
234+ const AssetClass& assetClass, const Date& expiryDate,
235+ const bool useFxSpot) override {
227236 // We follow the way FdBlackScholesBarrierEngine determines maturity for time grid generation
228237 Handle<YieldTermStructure> riskFreeRate =
229238 market_->discountCurve (ccy.code (), configuration (ore::data::MarketContext::pricing));
@@ -271,7 +280,8 @@ class AmericanOptionBAWEngineBuilder : public AmericanOptionEngineBuilder {
271280
272281protected:
273282 virtual boost::shared_ptr<PricingEngine> engineImpl (const string& assetName, const Currency& ccy,
274- const AssetClass& assetClass, const Date& expiryDate) override {
283+ const AssetClass& assetClass, const Date& expiryDate,
284+ const bool useFxSpot) override {
275285 boost::shared_ptr<QuantLib::GeneralizedBlackScholesProcess> gbsp = getBlackScholesProcess (assetName, ccy, assetClass);
276286 return boost::make_shared<QuantExt::BaroneAdesiWhaleyApproximationEngine>(gbsp);
277287 }
0 commit comments