0

我目前正在修改从互联网下载的烛台形态指标。

我在看跌吞没模式下添加了附加条件,即当前柱 (HL) 的范围必须大于前 6 根蜡烛的范围。

附加代码为:((H - L) > (H1 - L1) && (H2 - L2) && (H3 - L3) && (H4 - L4) && (H5 - L5) && (H6 - L6)))

当然,如果我添加这个,我必须声明额外的 H4、H5、H6、L4、L5 L6 变量(我做了:双 O、O1、O2、C、C1、C2、L、L1、L2、L3、 L4、L5、L6、H、H1、H2、H3、H4、H5、H6;)

另外,我还添加了 int shift3; 换档4;ETC

但是,为什么指标不记录条件:当前柱 (HL) 的范围必须大于前 6 根蜡烛的范围?

完整的源代码在这里下载:http: //forum.mql4.com/c/forum/2014/04/CandleStick_Pattern_indicator.mq4

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Black
#property indicator_color2 Black
//----
extern bool Show_Alert = true;
extern bool Display_Bearish_Engulfing = true;
extern bool Display_Three_Outside_Down = false;
extern bool Display_Three_Inside_Down = false;
extern bool Display_Dark_Cloud_Cover = false;
extern bool Display_Three_Black_Crows = false;
extern bool Display_Bullish_Engulfing = true;
extern bool Display_Three_Outside_Up = false;
extern bool Display_Three_Inside_Up = false;
extern bool Display_Piercing_Line = false;
extern bool Display_Three_White_Soldiers = false;
extern bool Display_Stars = false;
extern bool Display_Harami = false;
extern bool Inside_Bar_Bull = false;
extern bool Inside_Bar_Bear = false;
//---- buffers
double upArrow[];
double downArrow[];
string PatternText[5000];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() 
  {
   SetIndexStyle(0, DRAW_ARROW, 0, 1);
   SetIndexArrow(0, 242);
   SetIndexBuffer(0, downArrow);      
//----
   SetIndexStyle(1, DRAW_ARROW, 0, 1);
   SetIndexArrow(1, 241);
   SetIndexBuffer(1, upArrow);

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit() 
  {
   ObjectsDeleteAll(0, OBJ_TEXT);
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   double Range, AvgRange;
   int counter, setalert;
   static datetime prevtime = 0;
   int shift;
   int shift1;
   int shift2;
   int shift3;
   int shift4;
   int shift5;
   int shift6;
   int shift7; 
   string pattern, period;
   int setPattern = 0;
   int alert = 0;
   int arrowShift;
   int textShift;
   double O, O1, O2, C, C1, C2, L, L1, L2, L3, L4, L5, L6, H, H1, H2, H3, H4, H5, H6;     
//----
   if(prevtime == Time[0]) 
     {
       return(0);
     }
   prevtime = Time[0];   
//----
   switch(Period()) 
     {
       case 1:     period = "M1";  break;
       case 5:     period = "M5";  break;
       case 15:    period = "M15"; break;
       case 30:    period = "M30"; break;      
       case 60:    period = "H1";  break;
       case 240:   period = "H4";  break;
       case 1440:  period = "D1";  break;
       case 10080: period = "W1";  break;
       case 43200: period = "MN";  break;
     }
//----
   for(int j = 0; j < Bars; j++) 
     { 
       PatternText[j] = "pattern-" + j;
     }
//----
   for(shift = 0; shift < Bars; shift++) 
     {
       setalert = 0;
       counter = shift;
       Range = 0;
       AvgRange = 0;
       for(counter = shift; counter <= shift + 13; counter++) 
         {
           AvgRange = AvgRange + MathAbs(High[counter] - Low[counter]);
         }
       Range = AvgRange / 10;
       shift1 = shift + 1;
       shift2 = shift + 2;
       shift3 = shift + 3;      
       shift4 = shift + 4; 
       shift5 = shift + 5; 
       shift6 = shift + 6; 
       shift7 = shift + 7; 
       O = Open[shift1];
       O1 = Open[shift2];
       O2 = Open[shift3];
       H = High[shift1];
       H1 = High[shift2];
       H2 = High[shift3];
       H3 = High[shift3+1];
       H4 = High[shift3+2];
       H5 = High[shift3+3];
       H6 = High[shift3+4];
       L = Low[shift1];
       L1 = Low[shift2];
       L2 = Low[shift3];
       L3 = Low[shift3+1];
       L4 = Low[shift3+2];
       L5 = Low[shift3+3];
       L6 = Low[shift3+4];
       C = Close[shift1];
       C1 = Close[shift2];
       C2 = Close[shift3];         
       // Bearish patterns  
       // Bearish Engulfing pattern
       if((C1 > O1) && (O > C) && (O1 >= C) && (H > H1) && (L < L1) && ((O - C) > (C1 - O1)) && ((H - L) > (H1 - L1) && (H2 - L2) && (H3 - L3) && (H4 - L4) && (H5 - L5) && (H6 - L6))) 
         {
           if(Display_Bearish_Engulfing == true) 
             {
               ObjectCreate(PatternText[shift], OBJ_TEXT, 0, Time[shift1], 
                            High[shift1] + Range*1.5);
               ObjectSetText(PatternText[shift], "Bearish Engulfing pattern", 10, 
                             "Arial", Black);
               downArrow[shift1] = High[shift1] + Range*0.5;
             }
           if(setalert == 0 && Show_Alert == true) 
             {
               pattern = "Bearish Engulfing pattern";
               setalert = 1;
             }
         }
4

2 回答 2

1

由于 MT4 build 600+ 问题,您很可能不得不对您的函数定义进行一些更改,但除了麻烦之外,您似乎打算对价格进行比较,例如:

(H-L > H1-L1 && H-L > H2-L2 && H-L > H3-L3 && H-L > H4-L4 && H-L > H5-L5 && H-L > H6-L6)

而不是这个:

((H - L) > (H1 - L1) && (H2 - L2) && (H3 - L3) && (H4 - L4) && (H5 - L5) && (H6 - L6)))

请注意为每个布尔 AND (&&) 比较显式添加 HL 初始条件。如果您想将当前柱的高 - 低与其他六个项进行比较,那么您必须在每个布尔语句中明确包含该比较。

[ && (H2 - L2) && ] 之类的语句(不带方括号)对 H2 - L2 进行布尔评估。换句话说,编译器询问 H2-L2 是真的吗?在这种情况下,这是荒谬的,因此您的代码会产生意想不到的结果。

于 2014-04-27T06:40:17.633 回答
0

给定一个任务被指定为:

我在看跌吞没形态下添加了附加条件,即当前柱 (HL) 的范围必须大于前 6 根蜡烛的范围。

应该有这样的吞没条件

if (  ( C1 >  O1 )                 // left the same as in the original code, if needed
   && ( O  >  C  )                 // left the same as in the original code, if needed
   && ( O1 >= C  )                 // left the same as in the original code, if needed
   && ( H  >  H1 )                 // left the same as in the original code, if needed
   && ( L  <  L1 )                 // left the same as in the original code, if needed
   && ( ( O - C) > ( C1 - O1 ) )   // left the same as in the original code, if needed
   && (
        ( High[0] - Low[0] ) > ( High[iHighest( _Symbol, _Period, MODE_HIGH, 6, 0 )
                               - Low[ iLowest(  _Symbol, _Period, MODE_LOW,  6, 0 )
                               )
      )
   ) { /* ... Bearish Engulfing <code-block> ... */  }
于 2014-06-12T22:45:46.627 回答