MG_XLObjectPtr VolatilityCurve_Create ( const MG_Date & aAsOf , const CellMatrix& aMaturities , const CellMatrix& aTenors , const CellMatrix& aVolatilities , const string& aCcy , const string& aUnderIndex , const CellMatrix& aInterpolMeths) { if (aVolatilities.Size() != aTenors.Size()*aMaturities.Size()) MG_THROW("Volatilities matrix size and (Maturities,Tenors) size are not consistent"); vector<double> vMaturities = FromCellMatrixToVectorDouble(aMaturities, 0); vector<double> vTenors = FromCellMatrixToVectorDouble(aTenors, 0); MG_Matrix vVols = FromCellMatrixToMGMatrix (aVolatilities); vector<int> vInterpolMeths = vector<int>(2, LINEAR_INTERPOL); if (!aInterpolMeths(0,0).IsEmpty()) vInterpolMeths = FromCellMatrixToInterpolVector(aInterpolMeths); if (vInterpolMeths.size() == 1) vInterpolMeths.push_back(vInterpolMeths[0]); long vInterpolCode = MG_Interpolator::CreateInterpolCode(vInterpolMeths); return MG_XLObjectPtr(new MG_IRVolatilityCurve(aAsOf, vMaturities, vTenors, vVols, aCcy, aUnderIndex, vInterpolCode)); }
MG_XLObjectPtr DividendsTable_Create ( const MG_Date & aAsOf , const CellMatrix & aExDivDates , const CellMatrix & aPaymentDates , const CellMatrix & aDividends , const string & aCcy , const string & aUnderIndex , const MG_XLObjectPtr& aZC) { if (aExDivDates.Size() != aExDivDates.Size()) MG_THROW("Ex dividends dates and payments days should be equal"); vector<MG_Date> vExDivDates = FromCellMatrixToVectorDate(aExDivDates, 0); vector<MG_Date> vPaymentDates = FromCellMatrixToVectorDate(aPaymentDates, 0); vector<double> vDividends = FromCellMatrixToVectorDouble(aDividends, 0); return MG_XLObjectPtr(new MG_DividendsTable(aAsOf, vExDivDates, vPaymentDates, vDividends, aCcy, aUnderIndex, aZC)); }
MG_XLObjectPtr ZeroCurve_Create ( const MG_Date & aAsOf , const CellMatrix& aMaturities , const CellMatrix& aZeroRates , const string & aCcy , const string & aUnderIndex , const string & aInterpolMeth) { if (aZeroRates.Size() != aMaturities.Size()) MG_THROW("Zero vector size and Maturities size are not consistent"); vector<double> vMaturities = FromCellMatrixToVectorDouble(aMaturities, 0); vector<double> vZeroRates = FromCellMatrixToVectorDouble(aZeroRates, 0); int vInterpolCode = InterpolMethodConvertor[aInterpolMeth]; return MG_XLObjectPtr(new MG_ZeroCurve(aAsOf, vMaturities, vZeroRates, aCcy, aUnderIndex, vInterpolCode)); }
/* converting a CellMatrix of interpolation types to a sid::vector<int> */ vector<int> FromCellMatrixToInterpolVector(const CellMatrix& aCM) { if (aCM.Size() > maxInterpoltypesNb) { ostringstream vOs; vOs << "Maximum number of interpolations is " << maxInterpoltypesNb << ", please advise."; MG_THROW(vOs.str()); } vector<string> vInterpolTypesStr = FromCellMatrixToVectorStr(aCM); size_t vSize(vInterpolTypesStr.size()); vector<int> vInterpolTypesInt(vSize); for(size_t i=0; i<vSize; ++i) vInterpolTypesInt[i] = InterpolMethodConvertor[vInterpolTypesStr[i]]; return vInterpolTypesInt; }