/* Copyright (C) 2016 -2017 Jerry Jin */ #include #include #include "exercise.hpp" #include #include #include #include #include #include #include #include "../loop.hpp" void AmericanExerciseWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes QuantLib::Date EarliestDateLib = ObjectHandler::convert2( mEarliestDate, "EarliestDate"); // convert input datatypes to QuantLib datatypes QuantLib::Date LatestDateLib = ObjectHandler::convert2( mLatestDate, "LatestDate"); // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlAmericanExercise( mObjectID, mEarliestDate, mLatestDate, mPayoffAtExpiry, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::AmericanExercise( valueObject, EarliestDateLib, LatestDateLib, mPayoffAtExpiry, 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 AmericanExerciseWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::AmericanExercise) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 3 || !info[3]->IsBoolean()) { return Nan::ThrowError("PayoffAtExpiry 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 EarliestDateCpp = ObjectHandler::property_t(static_cast(Nan::To(info[1]).FromJust())); // convert js argument to c++ type ObjectHandler::property_t LatestDateCpp = ObjectHandler::property_t(static_cast(Nan::To(info[2]).FromJust())); // convert js argument to c++ type bool PayoffAtExpiryCpp = Nan::To(info[3]).FromJust(); // declare callback Nan::Callback *callback = new Nan::Callback(info[4].As()); // launch Async worker Nan::AsyncQueueWorker(new AmericanExerciseWorker( callback ,ObjectIDCpp ,EarliestDateCpp ,LatestDateCpp ,PayoffAtExpiryCpp )); } //AmericanExerciseWorker::~AmericanExerciseWorker(){ // //} //void AmericanExerciseWorker::Destroy(){ // //} void EuropeanExerciseWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes QuantLib::Date ExpiryDateLib = ObjectHandler::convert2( mExpiryDate, "ExpiryDate"); // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlEuropeanExercise( mObjectID, mExpiryDate, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::EuropeanExercise( valueObject, ExpiryDateLib, 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 EuropeanExerciseWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::EuropeanExercise) { // 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 ExpiryDateCpp = 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 EuropeanExerciseWorker( callback ,ObjectIDCpp ,ExpiryDateCpp )); } //EuropeanExerciseWorker::~EuropeanExerciseWorker(){ // //} //void EuropeanExerciseWorker::Destroy(){ // //} void BermudanExerciseWorker::Execute(){ try{ // convert input datatypes to QuantLib datatypes std::vector DatesLib = ObjectHandler::vector::convert2( mDates, "Dates"); // Construct the Value Object boost::shared_ptr valueObject( new QuantLibAddin::ValueObjects::qlBermudanExercise( mObjectID, mDates, mPayoffAtExpiry, false )); // Construct the Object boost::shared_ptr object( new QuantLibAddin::BermudanExercise( valueObject, DatesLib, mPayoffAtExpiry, 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 BermudanExerciseWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue).ToLocalChecked() }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::BermudanExercise) { // validate js arguments if (info.Length() == 0 || !info[0]->IsString()) { return Nan::ThrowError("ObjectID is required."); } if (info.Length() == 1 || !info[1]->IsArray()) { return Nan::ThrowError("Dates is required."); } if (info.Length() == 2 || !info[2]->IsBoolean()) { return Nan::ThrowError("PayoffAtExpiry is required."); } // convert js argument to c++ type String::Utf8Value strObjectID(info[0]->ToString()); string ObjectIDCpp(strdup(*strObjectID)); // convert js argument to c++ type std::vectorDatesCpp; Local DatesArray = info[1].As(); for (unsigned int i = 0; i < DatesArray->Length(); i++){ ObjectHandler::property_t tmp = ObjectHandler::property_t(static_cast(Nan::To(Nan::Get(DatesArray, i).ToLocalChecked()).FromJust())); DatesCpp.push_back(tmp); } // convert js argument to c++ type bool PayoffAtExpiryCpp = Nan::To(info[2]).FromJust(); // declare callback Nan::Callback *callback = new Nan::Callback(info[3].As()); // launch Async worker Nan::AsyncQueueWorker(new BermudanExerciseWorker( callback ,ObjectIDCpp ,DatesCpp ,PayoffAtExpiryCpp )); } //BermudanExerciseWorker::~BermudanExerciseWorker(){ // //} //void BermudanExerciseWorker::Destroy(){ // //} void ExerciseDatesWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::Exercise, QuantLib::Exercise) // loop on the input parameter and populate the return vector std::vector returnValue = ObjectIDLibObjPtr->dates( ); mReturnValue = QuantLibAddin::libraryToVector(returnValue); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void ExerciseDatesWorker::HandleOKCallback(){ Nan::HandleScope scope; Local tmpArray = Nan::New(mReturnValue.size()); for (unsigned int i = 0; i < mReturnValue.size(); i++) { Nan::Set(tmpArray,i,Nan::New(mReturnValue[i])); } Local argv[2] = { Nan::New(mError).ToLocalChecked(), tmpArray }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::ExerciseDates) { // 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 ExerciseDatesWorker( callback ,ObjectIDCpp )); } //ExerciseDatesWorker::~ExerciseDatesWorker(){ // //} //void ExerciseDatesWorker::Destroy(){ // //} void ExerciseLastDateWorker::Execute(){ try{ // convert object IDs into library objects OH_GET_REFERENCE(ObjectIDLibObjPtr, mObjectID, QuantLibAddin::Exercise, QuantLib::Exercise) // invoke the member function QuantLib::Date returnValue = ObjectIDLibObjPtr->lastDate( ); mReturnValue = QuantLibAddin::libraryToScalar(returnValue); }catch(const std::exception &e){ mError = e.what(); }catch (...){ mError = "unkown error"; } } void ExerciseLastDateWorker::HandleOKCallback(){ Nan::HandleScope scope; Local argv[2] = { Nan::New(mError).ToLocalChecked(), Nan::New(mReturnValue) }; callback->Call(2, argv); } NAN_METHOD(QuantLibNode::ExerciseLastDate) { // 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 ExerciseLastDateWorker( callback ,ObjectIDCpp )); } //ExerciseLastDateWorker::~ExerciseLastDateWorker(){ // //} //void ExerciseLastDateWorker::Destroy(){ // //}