Quantile Bands Indicator For MT5
Table Of Contents:
- Quantile Bands Indicator For MT5
- Installing the Quantile Bands Indicator For MT5
- Parameters of the Quantile Bands Indicator For MT5
- Buffers of the Quantile Bands Indicator For MT5
- Main Parts Of The Code
The Quantile Bands Indicator For MT5 is a brilliantly created technical trading tool which channels the main trading activity of an asset into a three layered band which is calculated on the basis of using three quantile values - these quantile values are derived through a statistical calculation which computes cutpoints by dividing the range of a probability distribution into intervals which have equal probabilities. This channel indicator is a great resource to have because with most oversold and overbought detection oscillators they are normally plotted in a separate window below the main active chart - however with this indicator it is like having a oversold and overbought analysis tool directly on the trading chart which is superimposed over the price action itself with the price action still being clearly visible for pattern recognition and technical analysis. When traders see that the price action trades beyond and above the upper band of the channel then they may treat that as a reversal signal to open a sell trade with the take profit target set at the middle band - whenever price action goes below and beyond the lower band then the trader may choose to open a buy trade in the opposite direction with the middle band set as a TP target.
Installing the Quantile Bands Indicator For MT5
After you downloaded the indicator via the form above you need to unzip the zip-file. Then you need to copy the file Quantile_bands_1.3.mq5 into the folder MQL5\Indicators of your MT5 installation. After that please restart MT5 and then you will be able to see the indicator in the list of indicators.
Parameters of the Quantile Bands Indicator For MT5
The Quantile Bands Indicator For MT5 has 7 parameters to configure.
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 LowerBandPercent = 10; // Lower band percent input double MedianBandPercent = 50; // Median percent
Buffers of the Quantile Bands Indicator For MT5
The Quantile Bands Indicator For MT5 provides 5 buffers.
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);
Main Parts Of The Code
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[]) { for (int i=(int)MathMax(prev_calculated-1,0); i lt rates_total && !IsStopped(); i++) { bufferUp[i] = iQuantile(getPrice(PriceUp ,open,close,high,low,i,rates_total,0),Periods,UpperBandPercent ,i,rates_total,0); bufferDn[i] = iQuantile(getPrice(PriceDown,open,close,high,low,i,rates_total,1),Periods,LowerBandPercent ,i,rates_total,1); bufferMe[i] = iQuantile(getPrice(PriceMid ,open,close,high,low,i,rates_total,2),Periods,MedianBandPercent,i,rates_total,2); fupd[i] = bufferMe[i]; fupu[i] = bufferUp[i]; fdnu[i] = bufferMe[i]; fdnd[i] = bufferDn[i]; if (i gt 0) { bufferUpc[i] = bufferUpc[i-1]; bufferDnc[i] = bufferDnc[i-1]; // // // // // if (bufferUp[i] gt bufferUp[i-1]) bufferUpc[i] = 0; if (bufferUp[i] lt bufferUp[i-1]) bufferUpc[i] = 1; if (bufferDn[i] gt bufferDn[i-1]) bufferDnc[i] = 0; if (bufferDn[i] lt bufferDn[i-1]) bufferDnc[i] = 1; } } return(rates_total); } //------------------------------------------------------------------ // //------------------------------------------------------------------ // // // // // #define quantileInstances 3 double quantileValues[][quantileInstances]; double quantileArray[]; double iQuantile(double value, int period, double qp, int i, int bars, int instanceNo=0) { if (ArrayRange(quantileArray ,0)!=period) ArrayResize(quantileArray ,period); if (ArrayRange(quantileValues,0)!=bars) ArrayResize(quantileValues,bars); quantileValues[i][instanceNo] = value; for(int k=0; k lt period && (i-k) gt =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]); else 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 gt =pr_haclose) { if (ArrayRange(workHa,0)!= bars) ArrayResize(workHa,bars); instanceNo*=4; int r = i; // // // // // double haOpen; if (r gt 0) haOpen = (workHa[r-1][instanceNo+2] + workHa[r-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 lt haClose) { workHa[r][instanceNo+0] = haLow; workHa[r][instanceNo+1] = haHigh; } else { workHa[r][instanceNo+0] = haHigh; workHa[r][instanceNo+1] = haLow; } workHa[r][instanceNo+2] = haOpen; workHa[r][instanceNo+3] = haClose; // // // // // switch (tprice) { case pr_haclose: return(haClose); case pr_haopen: return(haOpen); case pr_hahigh: return(haHigh); case pr_halow: return(haLow); case pr_hamedian: return((haHigh+haLow)/2.0); case pr_hamedianb: return((haOpen+haClose)/2.0); case pr_hatypical: return((haHigh+haLow+haClose)/3.0); case pr_haweighted: return((haHigh+haLow+haClose+haClose)/4.0); case pr_haaverage: return((haHigh+haLow+haClose+haOpen)/4.0); case pr_hatbiased: if (haClose gt haOpen) return((haHigh+haClose)/2.0); else return((haLow+haClose)/2.0); } } // // // // // switch (tprice) { case pr_close: return(close[i]); case pr_open: return(open[i]); case pr_high: return(high[i]); case pr_low: return(low[i]); case pr_median: return((high[i]+low[i])/2.0); case pr_medianb: return((open[i]+close[i])/2.0); case pr_typical: return((high[i]+low[i]+close[i])/3.0); case pr_weighted: return((high[i]+low[i]+close[i]+close[i])/4.0); case pr_average: return((high[i]+low[i]+close[i]+open[i])/4.0); case pr_tbiased: if (close[i] gt open[i]) return((high[i]+close[i])/2.0); else return((low[i]+close[i])/2.0); } return(0); }