//------------------------------------------------------------------ #property copyright "© mladen, 2017" #property link "www.forex-station.com" //------------------------------------------------------------------ #property indicator_chart_window #property indicator_buffers 11 #property indicator_plots 5 #property indicator_label1 "upper filling" #property indicator_type1 DRAW_FILLING #property indicator_color1 C'207,243,207' #property indicator_label2 "lower filling" #property indicator_type2 DRAW_FILLING #property indicator_color2 C'255,230,183' #property indicator_label3 "Upper band" #property indicator_type3 DRAW_COLOR_LINE #property indicator_color3 clrSilver,clrLimeGreen,clrDarkOrange #property indicator_label4 "Lower band" #property indicator_type4 DRAW_COLOR_LINE #property indicator_color4 clrSilver,clrLimeGreen,clrDarkOrange #property indicator_label5 "Middle value" #property indicator_type5 DRAW_COLOR_LINE #property indicator_color5 clrSilver,clrLimeGreen,clrDarkOrange #property indicator_width5 4 // // // // // 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 }; input ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT; // Time frame input int Periods = 35; // Quantile period input enPrices PriceUp = pr_high; // Price to use for high quantile value input enPrices PriceMid = pr_median; // Price to use for middle quantile value input enPrices PriceDown = pr_low; // Price to use for low quantile value input double UpperBandPercent = 90; // Upper band percent input double MedianBandPercent = 50; // Middle band percent input double LowerBandPercent = 10; // Lower band percent input bool Interpolate = true; // Interpolate in multi time frame mode? // // // // // double bufferUp[],bufferUpc[],bufferDn[],bufferDnc[],bufferMe[],bufferMec[],fupu[],fupd[],fdnd[],fdnu[],count[]; int _mtfHandle = INVALID_HANDLE; ENUM_TIMEFRAMES timeFrame; #define _mtfCall iCustom(_Symbol,timeFrame,getName(),PERIOD_CURRENT,Periods,PriceUp,PriceMid,PriceDown,UpperBandPercent,MedianBandPercent,LowerBandPercent) //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // int OnInit() { SetIndexBuffer( 0,fupu,INDICATOR_DATA); SetIndexBuffer(1,fupd,INDICATOR_DATA); SetIndexBuffer( 2,fdnu,INDICATOR_DATA); SetIndexBuffer(3,fdnd,INDICATOR_DATA); SetIndexBuffer( 4,bufferUp ,INDICATOR_DATA); SetIndexBuffer(5,bufferUpc,INDICATOR_COLOR_INDEX); SetIndexBuffer( 6,bufferDn ,INDICATOR_DATA); SetIndexBuffer(7,bufferDnc,INDICATOR_COLOR_INDEX); SetIndexBuffer( 8,bufferMe ,INDICATOR_DATA); SetIndexBuffer(9,bufferMec,INDICATOR_COLOR_INDEX); SetIndexBuffer(10,count ,INDICATOR_CALCULATIONS); timeFrame = MathMax(_Period,TimeFrame); return(0); } void OnDeinit(const int reason) { return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ // // // // // 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 && k0) ? (bufferUp[i]>bufferUp[i-1]) ? 1 : (bufferUp[i]0) ? (bufferDn[i]>bufferDn[i-1]) ? 1 : (bufferDn[i]=0; k++) quantileArray[k] = quantileValues[i-k][instanceNo]; ArraySort(quantileArray); // // // // // double index = (period-1)*qp/100.00; int ind = (int)index; double delta = index - ind; if (ind == NormalizeDouble(index,5)) return( quantileArray[ind]); return((1.0-delta)*quantileArray[ind]+delta*quantileArray[ind+1]); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // // #define priceInstances 3 double workHa[][priceInstances*4]; double getPrice(int tprice, const double& open[], const double& close[], const double& high[], const double& low[], int i,int _bars, int instanceNo=0) { if (tprice>=pr_haclose) { if (ArrayRange(workHa,0)!= _bars) ArrayResize(workHa,_bars); instanceNo*=4; // // // // // 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); }