矩形没有画出看涨吞没模式

时间:2019-07-22 22:11:04

标签: mql4 trading algorithmic-trading metatrader4

我编写了以下代码,以查看最近的100个烛台,并在看涨的吞没烛台图案周围绘制一个矩形。我希望也将其扩展为看跌吞没模式。我不知道为什么,但是矩形不画。请看下面的代码

bool isBullishEngulfing(int current)  {

   if((iClose(_Symbol,0,current) > iOpen(_Symbol,0,current)) && (iClose(_Symbol,0,current + 1) < iOpen(_Symbol,0,current + 1))  && 
      (iOpen(_Symbol,0,current) < iClose(_Symbol,0,current + 1)) && (iClose(_Symbol,0,current) > iOpen(_Symbol,0,current + 1)))
         return true;
      return false;         

}

void showRectangles() {

   for (int i=100;i<=1;i--)   {
      if(isBullishEngulfing(i)) {

        drawBullRectangle(i,iHigh(_Symbol,0,i),iLow(_Symbol,0,i));
    }
   }
}

bool drawBullRectangle(int candleInt,const double top,const double bottom)
{
    const datetime starts=iTime(_Symbol,0,candleInt); 
    const datetime ends=starts+PeriodSeconds()*Numbars; //Numbars shows how long the rectangle should draw
    const string name=prefix+"_"+(candleInt>0?"DEMAND":"SUPPLY")+"_"+TimeToString(starts);

    if(!ObjectCreate(0,name,OBJ_RECTANGLE,0,0,0,0,0))
    {
        printf("%i %s: failed to create %s. error=%d",__LINE__,__FILE__,name,_LastError);
        return false;
    }
    ObjectSetInteger(0,name,OBJPROP_TIME1,starts);
    ObjectSetInteger(0,name,OBJPROP_TIME2,ends);
    ObjectSetDouble(0,name,OBJPROP_PRICE1,top);
    ObjectSetDouble(0,name,OBJPROP_PRICE2,bottom);

    ObjectSetInteger(0,name,OBJPROP_COLOR, clrAqua);

   ObjectSetInteger(0,name,OBJPROP_STYLE, STYLE_SOLID);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);

   ObjectSetInteger(0,name,OBJPROP_FILL, true);

    return true;
}

void OnDeinit(const int reason){ObjectsDeleteAll(0,prefix);}
void OnTick()
{
    if(!isNewBar())
        return;     //not necessary but waste of time to check every second


    showRectangles();
}

bool isNewBar()
{
   static datetime lastbar;
   datetime curbar = (datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_LASTBAR_DATE);
   if(lastbar != curbar)
   {
      lastbar = curbar;
      return true;
   }
   return false;
}

希望能帮助您解决此问题。

1 个答案:

答案 0 :(得分:1)

错误主要在循环中,应该是sql

另一个“可能” 错误是for (int i=100;i>=1;i--)函数的逻辑。

通常,上一个栏的“关闭”等于当前栏的“打开”,因此(大多数情况下)以下条件没有得到满足

isBullishEngulfing()

(因此,我建议删除此行,但这只是一个建议,请注意有时您的条件也会得到满足)