Quantile Bands Indicator For MT5
Table Of Contents:
- Quantile Bands Indicator For MT5
- 安装Quantile Bands Indicator For MT5
- Quantile Bands Indicator For MT5参数
- Quantile Bands Indicator For MT5缓冲区
- 守则主要部分
Quantile Bands Indicator For MT5的Quantile Bands Indicator For MT5是一种出色创建的技术交易工具,它将资产的主要交易活动引导到三层带中,该三层带是根据使用三个分位数来计算的-这些分位数是通过统计计算得出的,通过将概率分布的范围划分为具有相等概率的区间来达到临界点。该通道指标是一个很好的资源,因为对于大多数超卖和超买的检测振荡器,它们通常被绘制在主活跃图表下方的单独窗口中;但是,使用该指标,就像在交易图表上直接具有超卖和超买分析工具一样。它叠加在价格行为本身上,对于模式识别和技术分析,价格行为仍然清晰可见。当交易者看到价格行为在通道的上限之上和之上进行交易时,他们可以将其视为反向交易,以将卖出目标设定在中间波段的情况下进行卖出交易-每当价格行为低于或超过上限时。较低的波段,那么交易者可以选择以相反的方向开立买入交易,而将中间的波段设为目标价格。
安装Quantile Bands Indicator For MT5
通过上面的表格下载指标后,您需要解压缩zip文件。然后,您需要将文件Quantile_bands_1.3.mq5复制到MT5安装的文件夹MQL5Indicators中。之后,请重启MT5,然后您将能够在指标列表中看到该指标。
Quantile Bands Indicator For MT5参数
Quantile Bands Indicator For MT5具有要配置的7 参数。
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
Quantile Bands Indicator For MT5缓冲区
Quantile Bands Indicator For MT5提供5 缓冲区。
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);
守则主要部分
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); }