//------------------------------------------------------------------ #property copyright "© mladen, 2016, MetaQuotes Software Corp." #property link "www.forex-tsd.com, www.mql5.com" //------------------------------------------------------------------ #property indicator_chart_window #property indicator_buffers 6 #property indicator_plots 3 #property indicator_label1 "pdfma zone" #property indicator_type1 DRAW_FILLING #property indicator_color1 clrGainsboro #property indicator_label2 "pdfma middle" #property indicator_type2 DRAW_LINE #property indicator_style2 STYLE_DOT #property indicator_color2 clrGray #property indicator_label3 "pdfma" #property indicator_type3 DRAW_COLOR_LINE #property indicator_color3 clrDarkGray,clrLimeGreen,clrDarkOrange #property indicator_width3 3 // // // // // enum enPrices { pr_close, // Close pr_open, // Open pr_high, // High pr_low, // Low pr_median, // Median pr_typical, // Typical pr_weighted, // Weighted pr_average, // Average (high+low+open+close)/4 pr_medianb, // Average median body (open+close)/2 pr_tbiased, // Trend biased price pr_tbiased2, // Trend biased (extreme) price pr_haclose, // Heiken ashi close pr_haopen , // Heiken ashi open pr_hahigh, // Heiken ashi high pr_halow, // Heiken ashi low pr_hamedian, // Heiken ashi median pr_hatypical, // Heiken ashi typical pr_haweighted, // Heiken ashi weighted pr_haaverage, // Heiken ashi average pr_hamedianb, // Heiken ashi median body pr_hatbiased, // Heiken ashi trend biased price pr_hatbiased2 // Heiken ashi trend biased (extreme) price }; enum chgColor { cc_onSlope, // Change color on slope change cc_onLevel, // Change color on outer levels cross cc_onMiddle // Change color on middle level cross }; enum enLevelType { lvl_floa, // Floating levels lvl_quan, // Quantile levels lvl_fixed // No levels }; input ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT; // Time frame input int MaPeriod = 25; // PDFMA period input double MaVariance = 1; // PDFMA variance input double MaMean = 0; // PDFMA mean input enPrices MaPrice = pr_close; // Price input chgColor ColorOn = cc_onLevel; // Color change on : input enLevelType LevelType = lvl_floa; // Level type input int LevelPeriod = 25; // Levels period input double LevelUp = 90; // Upper level % input double LevelDown = 10; // Lower level % input bool AlertsOn = false; // Turn alerts on? input bool AlertsOnCurrent = true; // Alert on current bar? input bool AlertsMessage = true; // Display messageas on alerts? input bool AlertsSound = false; // Play sound on alerts? input bool AlertsEmail = false; // Send email on alerts? input bool AlertsNotify = false; // Send push notification on alerts? input bool Interpolate = true; // Interpolate when in multi time frame mode? double val[],valc[],mid[],fup[],fdn[],count[]; int _mtfHandle = INVALID_HANDLE; ENUM_TIMEFRAMES timeFrame; #define _mtfCall iCustom(_Symbol,timeFrame,getIndicatorName(),PERIOD_CURRENT,MaPeriod,MaVariance,MaMean,MaPrice,ColorOn,LevelType,LevelPeriod,LevelUp,LevelDown,AlertsOn,AlertsOnCurrent,AlertsMessage,AlertsSound,AlertsEmail,AlertsNotify) //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // int OnInit() { SetIndexBuffer(0,fup ,INDICATOR_DATA); SetIndexBuffer(1,fdn ,INDICATOR_DATA); SetIndexBuffer(2,mid ,INDICATOR_DATA); SetIndexBuffer(3,val ,INDICATOR_DATA); SetIndexBuffer(4,valc,INDICATOR_COLOR_INDEX); SetIndexBuffer(5,count,INDICATOR_CALCULATIONS); timeFrame = MathMax(_Period,TimeFrame); IndicatorSetString(INDICATOR_SHORTNAME,timeFrameToString(timeFrame)+" PDF ma ("+(string)MaPeriod+","+(string)MaVariance+","+(string)MaMean+")"); return(0); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // 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 (Bars(_Symbol,_Period) 0 && time[i-n] >= currTime[0]; n++) continue; for(k=1; (i-k)>=0 && k1) ? LevelType : lvl_fixed; int colorOn = (levelType!=lvl_fixed) ? ColorOn : cc_onSlope; double maVariance = MathMax(MaVariance,0.01); double maMean = MathMax(MathMin(MaMean,1.0),-1.0); int i=(int)MathMax(prev_calculated-1,0); for (; ifup[i]) ? 1 : (val[i]fdn[i] && val[i]0) ? valc[i-1] : 0; break; case cc_onMiddle: valc[i] = (val[i]>mid[i]) ? 1 : (val[i]0) ? (val[i]>val[i-1]) ? 1 : (val[i]=0; k++) { double weight = _pdfmaCoeffs[k][instanceNo]*value; sumw += weight; sum += weight*_pdfmaWork[i-k][instanceNo]; } return(sum/sumw); } double iPdf(double x, double variance=1.0, double mean=0) { return((1.0/MathSqrt(2*M_PI*MathPow(variance,2))*MathExp(-MathPow(x-mean,2)/(2*MathPow(variance,2))))); } //------------------------------------------------------------------- // //------------------------------------------------------------------- // // // // // #define _quantileInstances 1 double _sortQuant[]; double _workQuant[][_quantileInstances]; double iQuantile(double value, int period, double qp, int i, int bars, int instanceNo=0) { if (ArrayRange(_workQuant,0)!=bars) ArrayResize(_workQuant,bars); _workQuant[i][instanceNo]=value; if (period<1) return(value); if (ArraySize(_sortQuant)!=period) ArrayResize(_sortQuant,period); int k=0; for (; k=0; k++) _sortQuant[k] = _workQuant[i-k][instanceNo]; for (; k=pr_haclose) { if (ArrayRange(workHa,0)!= _bars) ArrayResize(workHa,_bars); instanceNo*=_pricesSize; // // // // // double haOpen; if (i>0) haOpen = (workHa[i-1][instanceNo+2] + workHa[i-1][instanceNo+3])/2.0; else haOpen = (open[i]+close[i])/2; double haClose = (open[i] + high[i] + low[i] + close[i]) / 4.0; double haHigh = MathMax(high[i], MathMax(haOpen,haClose)); double haLow = MathMin(low[i] , MathMin(haOpen,haClose)); if(haOpen haOpen) return((haHigh+haClose)/2.0); else return((haLow+haClose)/2.0); case pr_hatbiased2: if (haClose>haOpen) return(haHigh); if (haCloseopen[i]) return((high[i]+close[i])/2.0); else return((low[i]+close[i])/2.0); case pr_tbiased2: if (close[i]>open[i]) return(high[i]); if (close[i]0) { CopyTime(_Symbol,_timeFrame,time[0],1,testTime); SeriesInfoInteger(_Symbol,_timeFrame,SERIES_FIRSTDATE,startTime); } if (startTime<=0 || startTime>time[0]) { Comment(MQL5InfoString(MQL5_PROGRAM_NAME)+"\nMissing data for "+timeFrameToString(_timeFrame)+" time frame\nRe-trying on next tick"); warned=true; return(false); } } if (warned) { Comment(""); warned=false; } return(true); }