//+------------------------------------------------------------------+ //| Vertex_mod.mq5 | //| Naguisa Unada | //| https://www.mql5.com/en/users/unadajapon/news | //+------------------------------------------------------------------+ #property copyright "Naguisa Unada" #property link "https://www.mql5.com/en/users/unadajapon/news" #property version "1.00" #property indicator_separate_window #property indicator_buffers 4 #property indicator_plots 4 #property indicator_level1 10 #property indicator_level2 0 #property indicator_level3 -10 #property indicator_levelcolor clrDimGray #property indicator_levelstyle STYLE_DOT //--- plot Vertex_ #property indicator_label1 "Vertex_" #property indicator_type1 DRAW_LINE #property indicator_color1 clrRed #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot signal_ #property indicator_label2 "signal" #property indicator_type2 DRAW_LINE #property indicator_color2 clrRoyalBlue #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- plot band_up_ #property indicator_label3 "band_up" #property indicator_type3 DRAW_LINE #property indicator_color3 clrGray #property indicator_style3 STYLE_SOLID #property indicator_width3 1 //--- plot band_down_ #property indicator_label4 "band_up" #property indicator_type4 DRAW_LINE #property indicator_color4 clrGray #property indicator_style4 STYLE_SOLID #property indicator_width4 1 enum enTimeFrames { tf_cu = PERIOD_CURRENT, // Current time frame tf_m1 = PERIOD_M1, // 1 minute tf_m2 = PERIOD_M2, // 2 minutes tf_m3 = PERIOD_M3, // 3 minutes tf_m4 = PERIOD_M4, // 4 minutes tf_m5 = PERIOD_M5, // 5 minutes tf_m6 = PERIOD_M6, // 6 minutes tf_m10 = PERIOD_M10, // 10 minutes tf_m12 = PERIOD_M12, // 12 minutes tf_m15 = PERIOD_M15, // 15 minutes tf_m20 = PERIOD_M20, // 20 minutes tf_m30 = PERIOD_M30, // 30 minutes tf_h1 = PERIOD_H1, // 1 hour tf_h2 = PERIOD_H2, // 2 hours tf_h3 = PERIOD_H3, // 3 hours tf_h4 = PERIOD_H4, // 4 hours tf_h6 = PERIOD_H6, // 6 hours tf_h8 = PERIOD_H8, // 8 hours tf_h12 = PERIOD_H12, // 12 hours tf_d1 = PERIOD_D1, // daily tf_w1 = PERIOD_W1, // weekly tf_mn = PERIOD_MN1, // monthly tf_cp1 = -1, // Next higher time frame tf_cp2 = -2, // Second higher time frame tf_cp3 = -3 // Third higher time frame }; enum stdMethods { std_custSam, // Custom - with sample correction std_custNos // Custom - without sample correction }; input enTimeFrames inpTimeFrame = tf_cu; // Time frame //--- input parameters input int Control_Period = 14; //Period input int Signal_Period = 5; //input int Signal_Method = MODE_SMA; input int BB_Up_Period = 12; input int BB_Up_Deviation = 2; input int BB_Dn_Period = 12; input int BB_Dn_Deviation = 2; input bool DeviationSample = false; // Deviation sample correction? input int DRAW_BEGIN= 4500; enum enIterpolate { interolate_yes=(int)true, // Interpolate data when in multi time frame interolate_no =(int)false // Do not interpolate data when in multi time frame }; input enIterpolate inpInterpolate = interolate_no; // Interpolation //--- indicator buffers double Vertex_Buffer[]; double signal[]; double band_up[]; double band_dn[]; ENUM_TIMEFRAMES _indicatorTimeFrame; string _indicatorName; int _indicatorMtfHandle; #define _mtfCall iCustom(_Symbol,_indicatorTimeFrame,_indicatorName,0,Control_Period,Signal_Period,BB_Up_Period,BB_Up_Deviation,BB_Dn_Period,BB_Dn_Deviation,DeviationSample,DRAW_BEGIN,inpInterpolate ) //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0, Vertex_Buffer, INDICATOR_DATA); SetIndexBuffer(1, signal, INDICATOR_DATA); SetIndexBuffer(2, band_up, INDICATOR_DATA); SetIndexBuffer(3, band_dn, INDICATOR_DATA); //IndicatorSetInteger(INDICATOR_LEVELS,5); // IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-10); // IndicatorSetDouble(INDICATOR_LEVELVALUE,1,-6); // IndicatorSetDouble(INDICATOR_LEVELVALUE,2,0); // IndicatorSetDouble(INDICATOR_LEVELVALUE,3,6); // IndicatorSetDouble(INDICATOR_LEVELVALUE,4,10); //--- set maximum and minimum for subwindow // IndicatorSetDouble(INDICATOR_MINIMUM,-15); // IndicatorSetDouble(INDICATOR_MAXIMUM,15); // IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrPurple); // IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrPurple); // IndicatorSetInteger(INDICATOR_LEVELCOLOR,2,clrGray); // IndicatorSetInteger(INDICATOR_LEVELCOLOR,3,clrPurple); // IndicatorSetInteger(INDICATOR_LEVELCOLOR,4,clrPurple); // PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DRAW_BEGIN); // PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,DRAW_BEGIN);//c // PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,DRAW_BEGIN);//c2 // PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,DRAW_BEGIN);// // IndicatorSetInteger(INDICATOR_LEVELSTYLE,0,STYLE_SOLID); // IndicatorSetInteger(INDICATOR_LEVELSTYLE,1,STYLE_SOLID); // IndicatorSetInteger(INDICATOR_LEVELSTYLE,2,STYLE_DOT); // IndicatorSetInteger(INDICATOR_LEVELSTYLE,3,STYLE_SOLID); // IndicatorSetInteger(INDICATOR_LEVELSTYLE,4,STYLE_SOLID); // IndicatorSetInteger(INDICATOR_LEVELWIDTH,1); IndicatorSetInteger(INDICATOR_DIGITS,4); IndicatorSetString(INDICATOR_SHORTNAME, "Vertex_mod(" + (string)Control_Period + ")"); _indicatorTimeFrame = MathMax(_Period,timeFrameGet(inpTimeFrame)); if (_indicatorTimeFrame != _Period) { _indicatorName = getIndicatorName(); _indicatorMtfHandle = _mtfCall; if (!_checkHandle(_indicatorMtfHandle,"Target time frame instance")) return(INIT_FAILED); } //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ double work[][6]; #define _v1 0//sig #define _v2 1//sig #define _v3 2//sig #define _sig 3//sig #define _bu 4 //bup #define _bd 5 //bd int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { if(_indicatorTimeFrame!=_Period) { double result[1]; if (CopyBuffer(_indicatorMtfHandle,4,0,1,result)<0) result[0] = rates_total; // //--- // #define _mtfRatio (double)PeriodSeconds((ENUM_TIMEFRAMES)_indicatorTimeFrame)/PeriodSeconds(_Period) int n,k,i=MathMin(MathMax(prev_calculated-1,0),MathMax(rates_total-int(result[0]*_mtfRatio)-1,0)),_prevMark=-99; datetime _prevTime; for(; i 0 && time[i-n] >= _prevTime; n++) continue; for (k=1; (i-k)>=0 && k rates_total - 1) bar_count = rates_total - 1; for (j = bar_shift; j <= bar_count; j++) { if (high[j] > trigger_high) { trigger_high = high[j]; sum_up += close[j]; } if (low[j] < trigger_low) { trigger_low = low[j]; sum_dn += close[j]; } } complex_up += sum_up; complex_dn += sum_dn; } if (complex_dn != 0.0 && complex_up != 0.0) { Vertex_Buffer[i] = complex_dn / complex_up - complex_up / complex_dn; work[i][_v1]=Vertex_Buffer[i]; work[i][_v2]=Vertex_Buffer[i]; work[i][_v3]=Vertex_Buffer[i]; double pricev=work[i][_v1]; signal[i] =iSma(pricev,Signal_Period,i,rates_total,0); work[i][_bu] = 0; for (int k=0; k=0; k++) work[i][_bu] += work[i-k][_v2]; work[i][_bu] /= BB_Up_Period; double deviationup = iDeviation(Vertex_Buffer[i],BB_Up_Period,DeviationSample,i,rates_total,0); band_up[i]= work[i][_bu]+deviationup*BB_Up_Deviation; work[i][_bd] = 0; for (int k2=0; k2=0; k2++) work[i][_bd] += work[i-k2][_v3]; work[i][_bd] /= BB_Dn_Period; double deviationd2 = iDeviation(Vertex_Buffer[i],BB_Dn_Period,DeviationSample,i,rates_total,1); band_dn[i]= work[i][_bd]-deviationd2*BB_Dn_Deviation; } } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ #define _devInstances 2 double workDev[][_devInstances]; double iDeviation(double value, int length, bool isSample, int i, int bars, int instanceNo=0) { if (ArrayRange(workDev,0)!=bars) ArrayResize(workDev,bars); workDev[i][instanceNo] = value; // // // // // double oldMean = value; double newMean = value; double squares = 0; int k; for (k=1; k=0; k++) { newMean = (workDev[i-k][instanceNo]-oldMean)/(k+1)+oldMean; squares += (workDev[i-k][instanceNo]-oldMean)*(workDev[i-k][instanceNo]-newMean); oldMean = newMean; } return(MathSqrt(squares/MathMax(k-isSample,1))); } double workSma[][2]; double iSma(double price, int period, int r,int bars, int instanceNo=0) { if (ArrayRange(workSma,0)!= bars) ArrayResize(workSma, bars); instanceNo *= 2; // // // // // int k; workSma[r][instanceNo] = price; if (r>=period) workSma[r][instanceNo+1] = workSma[r-1][instanceNo+1]+(workSma[r][instanceNo]-workSma[r-period][instanceNo])/period; else { workSma[r][instanceNo+1] = 0; for(k=0; k=0; k++) workSma[r][instanceNo+1] += workSma[r-k][instanceNo]; workSma[r][instanceNo+1] /= k; } return(workSma[r][instanceNo+1]); } // // ENUM_TIMEFRAMES _tfsPer[]={PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,PERIOD_M30,PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1}; string _tfsStr[]={"1 minute","2 minutes","3 minutes","4 minutes","5 minutes","6 minutes","10 minutes","12 minutes","15 minutes","20 minutes","30 minutes","1 hour","2 hours","3 hours","4 hours","6 hours","8 hours","12 hours","daily","weekly","monthly"}; // //--- // string timeFrameToString(int period) { if(period==PERIOD_CURRENT) period=_Period; int i; for(i=0;i=0 && _partsA[n]!="indicators"; n--) name=_partsA[n]+"\\"+name; return(name); } // //--- // bool _checkHandle(int _handle, string _description) { static int _chandles[]; int _size = ArraySize(_chandles); bool _answer = (_handle!=INVALID_HANDLE); if (_answer) { ArrayResize(_chandles,_size+1); _chandles[_size]=_handle; } else { for (int i=_size-1; i>=0; i--) IndicatorRelease(_chandles[i]); ArrayResize(_chandles,0); Alert(_description+" initialization failed"); } return(_answer); }