//+------------------------------------------------------------------+ //| AlgLibTest.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Arthur Albano" #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Script program start function | //+------------------------------------------------------------------+ #include //+------------------------------------------------------------------+ //| Derived class from CNDimensional_PFunc | //+------------------------------------------------------------------+ class CNDimensional_CX_2_Func : public CNDimensional_PFunc { public: CNDimensional_CX_2_Func(void); ~CNDimensional_CX_2_Func(void); virtual void PFunc(double &c[], double &K[], double &func, CObject &obj); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CNDimensional_CX_2_Func::CNDimensional_CX_2_Func(void) {} //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CNDimensional_CX_2_Func::~CNDimensional_CX_2_Func(void) {} //+------------------------------------------------------------------+ //| This callback calculates option premiums not distinguishing american/european | //+------------------------------------------------------------------+ void CNDimensional_CX_2_Func::PFunc(double &m[], double &K[], double &func, CObject &obj) { double d1 = (m[0]*K[0] - m[1]*_S + m[3]); double c = 4.0*(_T)*pow(m[2]*_S,2.0); double d2 = (m[0]*K[0] - m[1]*_S + m[3]); func = (1.0/2.0)*sqrt(pow(d1,2.0)+c) - _Z * (d2) / 2.0; } //+------------------------------------------------------------------+ //| Nonlinear fitting using function value only | //+------------------------------------------------------------------+ double LSFit_OPTIONS() { //--- create variables CMatrixDouble K; //strikes (K) double y[]; //premiums (X0) double c[]; //overfitting coeffs double w[]; //weights (deals, for day close) CObject obj; CNDimensional_CX_2_Func fcx2func; CNDimensional_Rep frep; //--- load options symbols MqlTick _MqlTicks[]; int lTicksReceived=0; int iPutCount=0; string strISIN,strSymbol; string strS=StringSubstr(SymbolInfoString(_SYMBOL,SYMBOL_ISIN),2,5); if(StringSubstr(strS,4,1)=="9") strS=StringSubstr(SymbolInfoString(_SYMBOL,SYMBOL_ISIN),2,4)+"11"; SymbolSelect(strS,true); double dbPrice=0.0; for(int i=0; i0.0)&& (SymbolInfoInteger(strSymbol,SYMBOL_EXPIRATION_TIME)==SymbolInfoInteger(_SYMBOL,SYMBOL_EXPIRATION_TIME))&& (SymbolInfoInteger(strSymbol,SYMBOL_OPTION_MODE)==SymbolInfoInteger(_SYMBOL,SYMBOL_OPTION_MODE)) ) { SymbolSelect(strSymbol,true); lTicksReceived=CopyTicks(strSymbol,_MqlTicks,COPY_TICKS_ALL,Today()); dbPrice=SymbolPrice(strSymbol,inpCalcMode); if( (dbPrice>0) && (Day(SymbolInfoInteger(strSymbol,SYMBOL_TIME))==Day(SymbolInfoInteger(strS,SYMBOL_TIME))) && ((InpFilterBE==true)?(_Z*(SymbolInfoDouble(strS,SYMBOL_LAST)-SymbolInfoDouble(strSymbol,SYMBOL_OPTION_STRIKE))