如何检查布林带的3个RSI值?

时间:2017-05-23 10:33:38

标签: mql4 metatrader4

布林带有3个RSI在地下室运行。

我想以这样的方式检查信号:当3个RSI击中上部Bbands的区域时,有一个信号向下,反之亦然:

int start(){
   double ma, stdev;
   int i, limit, count=IndicatorCounted();

   if(count<0) return(0);
   limit=Bars-count;  
   if(limit>1) limit=Bars-1;

    for(i=limit; i>=0; i--) {
        RSI[i] =iRSI(Symbol(),Period(),rsi_period,  PRICE_CLOSE,i);
        RSI2[i]=iRSI(Symbol(),Period(),rsi_period_2,PRICE_CLOSE,i);
        RSI3[i]=iRSI(Symbol(),Period(),rsi_period_3,PRICE_CLOSE,i);
        }

    for(i=limit; i>=0; i--) {
        ma=iMAOnArray(RSI3,0,bb_period,0,0,i); // midle line
        stdev=iStdDevOnArray(RSI3,0,bb_period,0,0,i); // dev
        BBUP[i]=ma+bb_dev*stdev; // up line
        BBDOWN[i]=ma-bb_dev*stdev; // down line
        UP[i]=0;
        DOWN[i]=0;
        }

    if(limit<Bars-1) limit++;

    for(i=limit; i>0; i--) {          
        if(RSI[i] <= BBDOWN[i] && RSI[i+1] > BBDOWN[i+1] && RSI2[i] <= BBDOWN[i] && RSI2[i+1] > BBDOWN[i+1] && RSI3[i] <= BBDOWN[i] && RSI3[i+1] > BBDOWN[i+1]){
           DOWN[i] = iLow(_Symbol, _Period, i);
           }
        if(RSI[i] >= BBUP[i] && RSI[i+1] < BBUP[i+1] &&W RSI2[i] >= BBUP[i] && RSI2[i+1] < BBUP[i+1] && RSI3[i] >= BBUP[i] && RSI3[i+1] < BBUP[i+1]){
           UP[i]= iHigh(_Symbol, _Period, i);
           }
    }

整个问题是我有非常弯曲的信号。

出现在他们不应该的地方,而且没有地方。

2 个答案:

答案 0 :(得分:1)

最佳实践:

第0步:让我们先书面同意实际目标:

如果TARGET要计算&amp;在GUI上绘制布林带上的RSI3[] 值,最好的方法是使用:

UPPER[i] = iBandsOnArray( RSI3,                       // ArrayAsSeries[]
                          array_calculation_depth,    // reduce overheads
                          BB_MA_period,               // BBands period
                          BB_StDev_MUL,               // how many sigmas
                          BB_Zero_Shift,              // #DEFINE BB_Zero_Shift 0
                          MODE_UPPER,                 // BBands upper line
                          i                           // shifting operator[i]
                          );

这样可以有效地生成每个{ MODE_UPPER | MODE_MAIN | MODE_LOWER }布林带线,始终生成无维RSI3[] 数据,从而保护感觉< / strong>信号组合中的任何加法运算与其他无维度数据,如{ RSI2[], RSI[] }

步骤1:目视检查线以验证任何信号条件:

鉴于GUI相应地显示行,可以尝试组合信号条件。 &#34; hot&#34; -bar [0] 是一个活动栏,如果没有经过适当的专业护理,新手可能会遇到欺骗信号情况。

步骤2:在代码中实现信号条件:

仅在步骤0之后)&amp; 1)发生并且都满足了自己先前的期望,任何代码开始都有意义建立。

答案 1 :(得分:0)

来自MQL4文档https://docs.mql4.com/indicators/imaonarray

  

iMA(...)不同, iMAOnArray() 功能不会占用数据   符号名称,时间范围,应用价格。价格数据必须是   以前准备好了指标从左到右计算。   访问数组元素的系列数组(即从右边开始)   要离开),必须使用 ArraySetAsSeries() 功能。

RSI3目前从右到左(0是最近的时间点,限制是最远的元素)。 与iStdDevOnArray()

相同的问题

修复这些问题,它应该可以正常工作。 在RSI上绘制布林带是否有任何价值是另一回事

更新

函数ArraySetAsSeries()可用于在从左到右和从右到左之间交换数组

首次初始化RSI数组时(在OnInit()中)告诉MetaTrader终端它们是时间序列。

ArraySetAsSeries(RSI1,True);
ArraySetAsSeries(RSI2,True);
ArraySetAsSeries(RSI3,True);

然后在主体中,在第二个for循环之前添加ArraySetAsSeries(RSI3,False);以交换数组方向。然后在循环后ArraySetAsSeries(RSI3,True);恢复数组方向。

for(i=limit; i>=0; i--) {
    RSI[i ] = iRSI(Symbol(),Period(),rsi_period,PRICE_CLOSE,i);
    RSI2[i] = iRSI(Symbol(),Period(),rsi_period_2,PRICE_CLOSE,i);
    RSI3[i] = iRSI(Symbol(),Period(),rsi_period_3,PRICE_CLOSE,i);
}

ArraySetAsSeries(RSI3,False);
for(i=limit; i>=0; i--) {
    ma=iMAOnArray(RSI3,0,bb_period,0,0,i); // midle line
    stdev=iStdDevOnArray(RSI3,0,bb_period,0,0,i); // dev
    BBUP[i]=ma+bb_dev*stdev; // up line
    BBDOWN[i]=ma-bb_dev*stdev; // down line
    UP[i]=0;
    DOWN[i]=0;
}  
ArraySetAsSeries(RSI3,True);

if(limit<Bars-1) limit++;
for(i=limit; i>0; i--) {
    if( RSI[i] <= BBDOWN[i] && 
        RSI[i+1] > BBDOWN[i] && 
        RSI2[i] <= BBDOWN[i] && 
        RSI2[i+1] > BBDOWN[i] && 
        RSI3[i] <= BBDOWN[i] && 
        RSI3[i+1] > BBDOWN[i]) {

        DOWN[i] = iLow(_Symbol, _Period, i);
    }
    if( RSI[i] >= BBUP[i] && 
        RSI[i+1] < BBUP[i+1] && 
        RSI2[i] >= BBUP[i] && 
        RSI2[i+1] < BBUP[i+1] && 
        RSI3[i] >= BBUP[i] && 
        RSI3[i+1] < BBUP[i+1]) {

        UP[i]= iHigh(_Symbol, _Period, i);
    }
}

基本指标结构

您需要浏览MQL4 Documentation并了解指标的正确结构。需要一个OnInit()函数来初始化值。然后是OnCalculate()函数,用于填充指标缓冲区。

//+-----------------------------------------------------------------+
//| Custom indicator initialization function                        |
//+-----------------------------------------------------------------+
int OnInit()
  {
   //--- indicator buffers mapping

   ArraySetAsSeries(RSI3,True);
   //---
   return(INIT_SUCCEEDED);
  }
//+-----------------------------------------------------------------+
//| Custom indicator iteration function                             |
//+-----------------------------------------------------------------+
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[])
  {
   // Do your calculations here
   //--- return value of prev_calculated for next call
   return(rates_total);
  }

如果您使用 iBandsOnArray() 来计算布林带,则在OnInit()

中设置后,您无需更换数组方向

如果指标正在编译但崩溃,则需要对其进行调试。最简单的方法是查看日志中的错误并在整个代码中添加PrintFormat()语句,这样您就可以看到指标在不同点上的作用,并查看它崩溃的位置。