Quantile Bands Indicator For MT5

Quantile Bands Indicator For MT5

Table Of Contents:

  1. Quantile Bands Indicator For MT5
  2. Installing the Quantile Bands Indicator For MT5
  3. Parameters of the Quantile Bands Indicator For MT5
  4. Buffers of the Quantile Bands Indicator For MT5
  5. 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.

FREE Quantile Bands Indicator

Download the FREE Quantile Bands Indicator for MT5.

To receive my email 100% sure: 
Put my email on your whitelist!


Partially Automated Trading Besides Your Day Job

Alerts In Real-Time When Divergences Occur


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); }    


About Me

I'm Mike Semlitsch the owner of PerfectTrendSystem.com. My trading career started in 2007. Since 2013 I have helped thousands of traders to take their trading to the next level. Many of them are now constantly profitable traders. 

The following performance was achieved by me while trading live in front of hundreds of my clients:

Connect With Me:  

Results From 5 Months!
This service starts soon! Be the first who get's notified when it begins!

This FREE Indicator Can Transform
Your Trading!

FREE Indicator + Telegram Group

Request the Ultimate Double Top/Bottom Indicator which is used by 10,000+ traders.