From: Hyung-Seok H. <hyu...@ib...> - 2012-08-27 05:15:17
|
Hi, I'm trying to expose QuantLib's TreeSwaptionEngine and TimeGrid in PricingEngine to QuantLibXL. Think it is supposed to be easy, but it keeps me the following error. Compiling... 3>create_pricingengines.cpp 3>\quantlibaddin\qlo\serialization\create\create_pricingengines.cpp(721) : error C2664: 'QuantLibAddin::TreeSwaptionEngine::TreeSwaptionEngine(const boost::shared_ptr<T> &,const boost::shared_ptr<QuantLib::OneFactorAffineModel> &,const QuantLib::TimeGrid &,bool)' : Can't conver to parameter 3 from 'QuantLib::Handle<T>' to 'const QuantLib::TimeGrid &' 3> with 3> [ 3> T=ObjectHandler::ValueObject 3> ] 3> and 3> [ 3> T=QuantLib::TimeGrid 3> ] 3> reason: Can't convert from 'QuantLib::Handle<T>' to 'const QuantLib::TimeGrid' 3> with 3> [ 3> T=QuantLib::TimeGrid 3> ] Here is the relevant files I've either created or modified. 1. create_pricingengine.cpp that generates the error message boost::shared_ptr<ObjectHandler::Object> create_qlTreeSwaptionEngine( const boost::shared_ptr<ObjectHandler::ValueObject> &valueObject) { // convert input datatypes to C++ datatypes std::string HandleModel = ObjectHandler::convert2<std::string>(valueObject->getProperty("HandleModel")); std::string TimeGrid = ObjectHandler::convert2<std::string>(valueObject->getProperty("TimeGrid")); bool Permanent = ObjectHandler::convert2<bool>(valueObject->getProperty("Permanent")); // convert object IDs into library objects OH_GET_REFERENCE(HandleModelLibObjPtr, HandleModel, QuantLibAddin::OneFactorAffineModel, QuantLib::OneFactorAffineModel) OH_GET_OBJECT(TimeGridCoerce, TimeGrid, ObjectHandler::Object) QuantLib::Handle<QuantLib::TimeGrid> TimeGridLibObj = QuantLibAddin::CoerceHandle< QuantLibAddin::TimeGrid, QuantLib::TimeGrid>()( TimeGridCoerce); // update value object precedent IDs (if any) valueObject->processPrecedentID(HandleModel); valueObject->processPrecedentID(TimeGrid); // construct and return the object boost::shared_ptr<ObjectHandler::Object> object( new QuantLibAddin::TreeSwaptionEngine( valueObject, HandleModelLibObjPtr, TimeGridLibObj, Permanent)); return object; } 2. pricingengines.xml <Category name='pricingengines'> <description>functions to construct and use PricingEngine objects.</description> <displayName>Pricing Engines</displayName> <xlFunctionWizardCategory>QuantLib - Financial</xlFunctionWizardCategory> <serializationIncludes> <include>qlo/pricingengines.hpp</include> <include>qlo/termstructures.hpp</include> <include>qlo/shortratemodels.hpp</include> <include>qlo/payoffs.hpp</include> <include>qlo/marketmodels.hpp</include> <include>qlo/processes.hpp</include> <include>qlo/timegrid.hpp</include> <include>ql/pricingengines/blackformula.hpp</include> <include>ql/pricingengines/blackscholescalculator.hpp</include> <include>ql/pricingengines/swaption/treeswaptionengine.hpp</include> <include>ql/termstructures/volatility/optionlet/optionletvolatilitystructure.hpp</include> <include>ql/termstructures/volatility/swaption/swaptionvolstructure.hpp</include> </serializationIncludes> <addinIncludes> <include>qlo/pricingengines.hpp</include> <include>qlo/termstructures.hpp</include> <include>qlo/shortratemodels.hpp</include> <include>qlo/payoffs.hpp</include> <include>qlo/marketmodels.hpp</include> <include>qlo/processes.hpp</include> <include>qlo/timegrid.hpp</include> <include>ql/pricingengines/blackformula.hpp</include> <include>ql/pricingengines/blackscholescalculator.hpp</include> <include>ql/pricingengines/swaption/treeswaptionengine.hpp</include> <include>ql/termstructures/volatility/optionlet/optionletvolatilitystructure.hpp</include> <include>ql/termstructures/volatility/swaption/swaptionvolstructure.hpp</include> </addinIncludes> <copyright> Copyright (C) 2006, 2007, 2008 Ferdinando Ametrano Copyright (C) 2007 Eric Ehlers </copyright> <Functions> ... <Constructor name='qlTreeSwaptionEngine'> <libraryFunction>TreeSwaptionEngine</libraryFunction> <SupportedPlatforms> <!--SupportedPlatform name='Excel' calcInWizard='false'/--> <SupportedPlatform name='Excel'/> <SupportedPlatform name='Calc'/> <SupportedPlatform name='Cpp'/> </SupportedPlatforms> <ParameterList> <Parameters> <Parameter name='HandleModel'> <type>QuantLib::OneFactorAffineModel</type> <tensorRank>scalar</tensorRank> <description>One Factor Hull and White Swaption Pricing object ID.</description> </Parameter> <Parameter name='TimeGrid'> <type>QuantLib::TimeGrid</type> <superType>libToHandle</superType> <tensorRank>scalar</tensorRank> <description>TimeGrid object.</description> </Parameter> </Parameters> </ParameterList> </Constructor> 3. pricingengine.hpp class TreeSwaptionEngine : public PricingEngine { public: TreeSwaptionEngine( const boost::shared_ptr<ObjectHandler::ValueObject>& properties, const boost::shared_ptr<QuantLib::OneFactorAffineModel>& model, const QuantLib::TimeGrid& timegrid, bool permanent); }; 4. pricingengine.cpp TreeSwaptionEngine::TreeSwaptionEngine( const boost::shared_ptr<ObjectHandler::ValueObject>& properties, const boost::shared_ptr<QuantLib::OneFactorAffineModel>& model, const QuantLib::TimeGrid& timegrid, bool permanent) : PricingEngine(properties, permanent) { libraryObject_ = boost::shared_ptr<QuantLib::PricingEngine>(new QuantLib::TreeSwaptionEngine(model,timegrid)); } Any tip would be appreciated. Thanks! - Hyung |