/* Copyright (C) 2016 -2017 Jerry Jin */ #include #include #include "assetswap.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include "../loop.hpp" void AssetSwapWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(BondLibObjPtr, mBond, QuantLibAddin::Bond, QuantLib::Bond) // convert object IDs into library objects OH_GET_REFERENCE(IborIndexLibObjPtr, mIborIndex, QuantLibAddin::IborIndex, QuantLib::IborIndex) // convert object IDs into library objects OH_GET_REFERENCE(FloatingLegScheduleLibObjPtr, mFloatingLegSchedule, QuantLibAddin::Schedule, QuantLib::Schedule) // convert input datatypes to QuantLib enumerated datatypes QuantLib::DayCounter FloatingLegDayCounterEnum = ObjectHandler::Create()(mFloatingLegDayCounter); // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlAssetSwap( mObjectID, mPayBondCoupon, mBond, mCleanPrice, mIborIndex, mSpread, mFloatingLegSchedule, mFloatingLegDayCounter, mParAssetSwap, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::AssetSwap( valueObject, mPayBondCoupon, BondLibObjPtr, mCleanPrice, IborIndexLibObjPtr, mSpread, FloatingLegScheduleLibObjPtr, FloatingLegDayCounterEnum, mParAssetSwap, false )); // Store the Object in the Repository mReturnValue = ObjectHandler::Repository::instance().storeObject(mObjectID, object, false, valueObject); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void AssetSwapWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::AssetSwap) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsBoolean()) { return Nan::ThrowError("PayBondCoupon is required."); } if (info.Length() == 2 || !info[2]->IsString()) { return Nan::ThrowError("Bond is required."); } if (info.Length() == 3 || !info[3]->IsNumber()) { return Nan::ThrowError("CleanPrice is required."); } if (info.Length() == 4 || !info[4]->IsString()) { return Nan::ThrowError("IborIndex is required."); } if (info.Length() == 5 || !info[5]->IsNumber()) { return Nan::ThrowError("Spread is required."); } if (info.Length() == 6 || !info[6]->IsString()) { return Nan::ThrowError("FloatingLegSchedule is required."); } if (info.Length() == 7 || !info[7]->IsString()) { return Nan::ThrowError("FloatingLegDayCounter is required."); } if (info.Length() == 8 || !info[8]->IsBoolean()) { return Nan::ThrowError("ParAssetSwap is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type bool PayBondCouponCpp = Nan::To(info[1]).FromJust(); // convert js argument to c++ type String::Utf8Value strBond(info[2]->ToString()); string BondCpp(strdup(*strBond)); // convert js argument to c++ type double CleanPriceCpp = Nan::To(info[3]).FromJust(); // convert js argument to c++ type String::Utf8Value strIborIndex(info[4]->ToString()); string IborIndexCpp(strdup(*strIborIndex)); // convert js argument to c++ type double SpreadCpp = Nan::To(info[5]).FromJust(); // convert js argument to c++ type String::Utf8Value strFloatingLegSchedule(info[6]->ToString()); string FloatingLegScheduleCpp(strdup(*strFloatingLegSchedule)); // convert js argument to c++ type String::Utf8Value strFloatingLegDayCounter(info[7]->ToString()); string FloatingLegDayCounterCpp(strdup(*strFloatingLegDayCounter)); // convert js argument to c++ type bool ParAssetSwapCpp = Nan::To(info[8]).FromJust(); // declare callback Nan::Callback *callback = new Nan::Callback(info[9].As()); // launch Async worker Nan::AsyncQueueWorker(new AssetSwapWorker( callback ,ObjectIDCpp ,PayBondCouponCpp ,BondCpp ,CleanPriceCpp ,IborIndexCpp ,SpreadCpp ,FloatingLegScheduleCpp ,FloatingLegDayCounterCpp ,ParAssetSwapCpp )); } //AssetSwapWorker::~AssetSwapWorker(){ // //} //void AssetSwapWorker::Destroy(){ // //} void AssetSwap2Worker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(BondLibObjPtr, mBond, QuantLibAddin::Bond, QuantLib::Bond) // convert object IDs into library objects OH_GET_REFERENCE(IborIndexLibObjPtr, mIborIndex, QuantLibAddin::IborIndex, QuantLib::IborIndex) // convert input datatypes to QuantLib enumerated datatypes QuantLib::DayCounter FloatingLegDayCounterEnum = ObjectHandler::Create()(mFloatingLegDayCounter); // convert input datatypes to QuantLib datatypes QuantLib::Date DealMaturityLib = ObjectHandler::convert2( mDealMaturity, "DealMaturity"); // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlAssetSwap2( mObjectID, mParAssetSwap, mBond, mCleanPrice, mNonParRepayment, mGearing, mIborIndex, mSpread, mFloatingLegDayCounter, mDealMaturity, mPayBondCoupon, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::AssetSwap( valueObject, mParAssetSwap, BondLibObjPtr, mCleanPrice, mNonParRepayment, mGearing, IborIndexLibObjPtr, mSpread, FloatingLegDayCounterEnum, DealMaturityLib, mPayBondCoupon, false )); // Store the Object in the Repository mReturnValue = ObjectHandler::Repository::instance().storeObject(mObjectID, object, false, valueObject); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void AssetSwap2Worker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::AssetSwap2) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsBoolean()) { return Nan::ThrowError("ParAssetSwap is required."); } if (info.Length() == 2 || !info[2]->IsString()) { return Nan::ThrowError("Bond is required."); } if (info.Length() == 3 || !info[3]->IsNumber()) { return Nan::ThrowError("CleanPrice is required."); } if (info.Length() == 4 || !info[4]->IsNumber()) { return Nan::ThrowError("NonParRepayment is required."); } if (info.Length() == 5 || !info[5]->IsNumber()) { return Nan::ThrowError("Gearing is required."); } if (info.Length() == 6 || !info[6]->IsString()) { return Nan::ThrowError("IborIndex is required."); } if (info.Length() == 7 || !info[7]->IsNumber()) { return Nan::ThrowError("Spread is required."); } if (info.Length() == 8 || !info[8]->IsString()) { return Nan::ThrowError("FloatingLegDayCounter is required."); } if (info.Length() == 10 || !info[10]->IsBoolean()) { return Nan::ThrowError("PayBondCoupon is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type bool ParAssetSwapCpp = Nan::To(info[1]).FromJust(); // convert js argument to c++ type String::Utf8Value strBond(info[2]->ToString()); string BondCpp(strdup(*strBond)); // convert js argument to c++ type double CleanPriceCpp = Nan::To(info[3]).FromJust(); // convert js argument to c++ type double NonParRepaymentCpp = Nan::To(info[4]).FromJust(); // convert js argument to c++ type double GearingCpp = Nan::To(info[5]).FromJust(); // convert js argument to c++ type String::Utf8Value strIborIndex(info[6]->ToString()); string IborIndexCpp(strdup(*strIborIndex)); // convert js argument to c++ type double SpreadCpp = Nan::To(info[7]).FromJust(); // convert js argument to c++ type String::Utf8Value strFloatingLegDayCounter(info[8]->ToString()); string FloatingLegDayCounterCpp(strdup(*strFloatingLegDayCounter)); // convert js argument to c++ type ObjectHandler::property_t DealMaturityCpp = ObjectHandler::property_t(static_cast(Nan::To(info[9]).FromJust())); // convert js argument to c++ type bool PayBondCouponCpp = Nan::To(info[10]).FromJust(); // declare callback Nan::Callback *callback = new Nan::Callback(info[11].As()); // launch Async worker Nan::AsyncQueueWorker(new AssetSwap2Worker( callback ,ObjectIDCpp ,ParAssetSwapCpp ,BondCpp ,CleanPriceCpp ,NonParRepaymentCpp ,GearingCpp ,IborIndexCpp ,SpreadCpp ,FloatingLegDayCounterCpp ,DealMaturityCpp ,PayBondCouponCpp )); } //AssetSwap2Worker::~AssetSwap2Worker(){ // //} //void AssetSwap2Worker::Destroy(){ // //} void AssetSwapBondLegAnalysisWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes QuantLib::Date AfterDateLib = ObjectHandler::convert2( mAfterDate, "AfterDate"); // convert object IDs into library objects OH_GET_OBJECT(ObjectIDObjPtr, mObjectID, QuantLibAddin::AssetSwap) std::vector< std::vector > returnValue; // invoke the member function returnValue = ObjectIDObjPtr->bondLeg( AfterDateLib ); mReturnValue = ObjectHandler::matrix::convert2(returnValue,"returnValue"); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void AssetSwapBondLegAnalysisWorker::HandleOKCallback(){ Nan::HandleScope scope; Local tmpMatrix = Nan::New(mReturnValue.size()); for (unsigned int i = 0; i < mReturnValue.size(); i++) { Local tmpArray = Nan::New(mReturnValue[i].size()); for (unsigned int j = 0; j < mReturnValue[i].size(); j++) { Nan::Set(tmpArray,j,Nan::New(mReturnValue[i][j]).ToLocalChecked()); } Nan::Set(tmpMatrix,i,tmpArray); } Local argv[2] = { Nan::New(mError).ToLocalChecked(), tmpMatrix }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::AssetSwapBondLegAnalysis) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type ObjectHandler::property_t AfterDateCpp = ObjectHandler::property_t(static_cast(Nan::To(info[1]).FromJust())); // declare callback Nan::Callback *callback = new Nan::Callback(info[2].As()); // launch Async worker Nan::AsyncQueueWorker(new AssetSwapBondLegAnalysisWorker( callback ,ObjectIDCpp ,AfterDateCpp )); } //AssetSwapBondLegAnalysisWorker::~AssetSwapBondLegAnalysisWorker(){ // //} //void AssetSwapBondLegAnalysisWorker::Destroy(){ // //} void AssetSwapFloatingLegAnalysisWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes QuantLib::Date AfterDateLib = ObjectHandler::convert2( mAfterDate, "AfterDate"); // convert object IDs into library objects OH_GET_OBJECT(ObjectIDObjPtr, mObjectID, QuantLibAddin::AssetSwap) std::vector< std::vector > returnValue; // invoke the member function returnValue = ObjectIDObjPtr->floatingLeg( AfterDateLib ); mReturnValue = ObjectHandler::matrix::convert2(returnValue,"returnValue"); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void AssetSwapFloatingLegAnalysisWorker::HandleOKCallback(){ Nan::HandleScope scope; Local tmpMatrix = Nan::New(mReturnValue.size()); for (unsigned int i = 0; i < mReturnValue.size(); i++) { Local tmpArray = Nan::New(mReturnValue[i].size()); for (unsigned int j = 0; j < mReturnValue[i].size(); j++) { Nan::Set(tmpArray,j,Nan::New(mReturnValue[i][j]).ToLocalChecked()); } Nan::Set(tmpMatrix,i,tmpArray); } Local argv[2] = { Nan::New(mError).ToLocalChecked(), tmpMatrix }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::AssetSwapFloatingLegAnalysis) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type ObjectHandler::property_t AfterDateCpp = ObjectHandler::property_t(static_cast(Nan::To(info[1]).FromJust())); // declare callback Nan::Callback *callback = new Nan::Callback(info[2].As()); // launch Async worker Nan::AsyncQueueWorker(new AssetSwapFloatingLegAnalysisWorker( callback ,ObjectIDCpp ,AfterDateCpp )); } //AssetSwapFloatingLegAnalysisWorker::~AssetSwapFloatingLegAnalysisWorker(){ // //} //void AssetSwapFloatingLegAnalysisWorker::Destroy(){ // //} void AssetSwapFairSpreadWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::AssetSwap, QuantLib::AssetSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->fairSpread( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void AssetSwapFairSpreadWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::AssetSwapFairSpread) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new AssetSwapFairSpreadWorker( callback ,ObjectIDCpp )); } //AssetSwapFairSpreadWorker::~AssetSwapFairSpreadWorker(){ // //} //void AssetSwapFairSpreadWorker::Destroy(){ // //} void AssetSwapFloatingLegBPSWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::AssetSwap, QuantLib::AssetSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->floatingLegBPS( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void AssetSwapFloatingLegBPSWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::AssetSwapFloatingLegBPS) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new AssetSwapFloatingLegBPSWorker( callback ,ObjectIDCpp )); } //AssetSwapFloatingLegBPSWorker::~AssetSwapFloatingLegBPSWorker(){ // //} //void AssetSwapFloatingLegBPSWorker::Destroy(){ // //} void AssetSwapFairCleanPriceWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::AssetSwap, QuantLib::AssetSwap) // invoke the member function QuantLib::Real returnValue = ObjectIDLibObjPtr->fairCleanPrice( ); mReturnValue = returnValue; }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void AssetSwapFairCleanPriceWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::AssetSwapFairCleanPrice) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new AssetSwapFairCleanPriceWorker( callback ,ObjectIDCpp )); } //AssetSwapFairCleanPriceWorker::~AssetSwapFairCleanPriceWorker(){ // //} //void AssetSwapFairCleanPriceWorker::Destroy(){ // //} void AssetSwapFairNonParRepaymentWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::AssetSwap, QuantLib::AssetSwap) // invoke the member function QuantLib::Real returnValue = ObjectIDLibObjPtr->fairNonParRepayment( ); mReturnValue = returnValue; }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void AssetSwapFairNonParRepaymentWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::AssetSwapFairNonParRepayment) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new AssetSwapFairNonParRepaymentWorker( callback ,ObjectIDCpp )); } //AssetSwapFairNonParRepaymentWorker::~AssetSwapFairNonParRepaymentWorker(){ // //} //void AssetSwapFairNonParRepaymentWorker::Destroy(){ // //} void AssetSwapParSwapWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::AssetSwap, QuantLib::AssetSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->parSwap( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void AssetSwapParSwapWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::AssetSwapParSwap) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new AssetSwapParSwapWorker( callback ,ObjectIDCpp )); } //AssetSwapParSwapWorker::~AssetSwapParSwapWorker(){ // //} //void AssetSwapParSwapWorker::Destroy(){ // //} void AssetSwapPayBondCouponWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::AssetSwap, QuantLib::AssetSwap) // invoke the member function mReturnValue = ObjectIDLibObjPtr->payBondCoupon( ); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void AssetSwapPayBondCouponWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::AssetSwapPayBondCoupon) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // declare callback Nan::Callback *callback = new Nan::Callback(info[1].As()); // launch Async worker Nan::AsyncQueueWorker(new AssetSwapPayBondCouponWorker( callback ,ObjectIDCpp )); } //AssetSwapPayBondCouponWorker::~AssetSwapPayBondCouponWorker(){ // //} //void AssetSwapPayBondCouponWorker::Destroy(){ // //}