Почему мой индикатор MQL4 не регистрирует мои дополнительные условия, несмотря на то, что я объявляю необходимые дополнительные новые переменные

В настоящее время я модифицирую индикатор свечного паттерна, загруженный из Интернета.

Я добавил дополнительные условия для паттерна медвежьего поглощения, согласно которым диапазон текущего бара (H-L) должен быть больше, чем диапазон предыдущих 6 свечей.

Дополнительный код:((H - L) > (H1 - L1) && (H2 - L2) && (H3 - L3) && (H4 - L4) && (H5 - L5) && (H6 - L6)))

Конечно, если я добавлю это, мне придется объявить дополнительные переменные H4, H5, H6, L4, L5 L6 (что я и сделал: double O, O1, O2, C, C1, C2, L, L1, L2, L3, L4, L5, L6, H, H1, H2, H3, H4, H5, H6; )

Кроме того, я также добавил int shift3; интервал сдвиг4; так далее

Но почему индикатор не фиксирует условие: диапазон текущего бара (H-L) должен быть больше диапазона предыдущих 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;
             }
         }

person user3526248    schedule 12.04.2014    source источник


Ответы (2)


Скорее всего, вам придется внести некоторые изменения в определения ваших функций из-за проблем с 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)))

Обратите внимание на явное добавление начальных условий HL для каждой логической операции AND (&&). Если вы хотите сравнить максимум-минимум текущего бара с шестью другими терминами, вы должны явно включить это сравнение в каждое из этих логических выражений.

Оператор типа [ && (H2 - L2) && ] (без квадратных скобок) выполняет логическое вычисление H2 - L2. Другими словами, компилятор спрашивает, верно ли H2-L2? В этом контексте это бессмысленно, поэтому ваш код приводит к неожиданным результатам.

person Patrick White    schedule 27.04.2014

Данная задача была указана как:

"Я добавил дополнительные условия для паттерна медвежьего поглощения, согласно которым диапазон текущего бара (H-L) должен быть больше, чем диапазон предыдущих 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> ... */  }
person user3666197    schedule 12.06.2014