Индикатор для подсчета баров периода M1, которые пересекаются с ценой открытия периода D1

 

Приветствую! Нужна помощь по данному индикатору. Пробовал разные методы подсчета количества баров в периоде M1, которые пересекались с уровнем цены открытия в периоде D1. Я приложил свою попытку закодировать его, но не смог запустить его успешно. Я очень старался над этим, но уперся в стену, так что теперь прошу помощи у любезных джентльменов!

Вот что мне нужно для этого индикатора:

1. Когда цена бара в периоде M1 пересекается с ценой открытия в периоде D1, это будет засчитано. В периоде M1 имеется 1440 баров для каждого периода D1, поэтому каждые 1440 баров будут проверяться.

2. Для каждого бара D1 общий счетчик/D1 бар будет суммирован и усреднен по определенному значению. Скажем, среднее значение равно 30, эти 30 - количество баров D1.

//+------------------------------------------------------------------+
//|                                                          XXX.mq4 |
//|                                              Copyright 2014, XXX |
//|                                                              XXX |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, XXX"
#property link      "XXX"
#property version   "1.00"
#property indicator_separate_window    // Indicator is drawn in the main window
#property indicator_buffers 1       // Number of buffers
#property  indicator_color1 Blue     // Color of the 1st line
//#property indicator_color2 Red      // Color of the 2nd line
 int count;  // Bar index
extern int Aver_Bars=30;             // number of bars for calculation
//extern double lots= 0.1; 
//extern int Pnt= 10; // Point multiplier for the pips.
double Buf_0[], Buf_1[];             // Declaring indicator arrays
//THIS INDICATOR IS TO COUNT NUMBER OF M1 BARS WHICH HIGH[I] IS HIGHER AND LOW[I] IS LOWER THAN OPEN[1440].
//--------------------------------------------------------------------
int init()                          // Special function init()
  {
//--------------------------------------------------------------------
   SetIndexBuffer(0,Buf_0);         // Assigning an array to a buffer
   SetIndexStyle (0,DRAW_LINE,STYLE_SOLID,2);// Line style
//--------------------------------------------------------------------
   SetIndexBuffer(1,Buf_1);         // Assigning an array to a buffer
   //SetIndexStyle (1,DRAW_LINE,STYLE_DOT,1);// Line style
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct.init()
  }
//--------------------------------------------------------------------
int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }

3. Затем среднее значение будет построено в качестве индикатора.

 
ПОЖАЛУЙСТА, ПОМОГИТЕ КОМУ-НИБУДЬ! ВОЗМОЖНО ЛИ ЭТО ВООБЩЕ?
 

Я не могу понять из вашего кода, что вы пытаетесь сделать, но в двух местах вы не даете переменной i значение. Вам нужно решить эту проблему.

int start()                         // Special function start()
  {
  if (Crosses()) count++;
   int i, n,                           // Bar index
       Counted_bars; 
       Buf_1[i]= count;               // Number of counted bars
   double   Sum_H;  
//--------------------------------------------------------------------
   Counted_bars=IndicatorCounted(); // Number of counted bars
   i=Bars-Counted_bars-1;           // Index of the first uncounted
   while(i>=0)                      // Loop for uncounted bars
     {
      Sum_H=0;                      // Nulling at loop beginning
    
      for(n=i;n<=i+Aver_Bars-1;n++) // Loop of summing values
     {
      Buf_0[i]=Buf_1[n];             // Value of 0 buffer on i bar
    
      i--;                          // Calculating index of the next bar
     }
  }   
//--------------------------------------------------------------------
   return(0);                          // Exit the special funct. start()
  }
//--------------------------------------------------------------------

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);
   }
 

Извините за прямоту, но ваш код показывает, что вы пытаетесь достичь чего-то, что находится далеко за пределами ваших возможностей.

Пример

bool Crosses()
   {
   int i;
   double H=iHigh(NULL,PERIOD_M1,i);
   double L=iLow(NULL,PERIOD_M1,i);
   double O=iOpen(NULL,PERIOD_D1,i);
 
       if (O > L && O < H)
         
  return(true);

else
return(EMPTY_VALUE);

Допустим, для примера i = 1.

double O=iOpen(NULL,PERIOD_D1,1);

Это вернет вчерашнюю цену открытия

   double H=iHigh(NULL,PERIOD_M1,1);
   double L=iLow(NULL,PERIOD_M1,1);

Эти 2 вернут значения для последнего закрытого 1-минутного бара.


Таким образом, вы сравниваете значения, полученные 1 минуту назад и вчерашнее открытие.

Если i = 2, вы будете сравнивать значения, полученные 2 минуты назад, с открытием 2 дня назад.

Вы должны видеть, что это не может быть тем, что вы хотите.

 
GumRai:

Извините за прямоту, но ваш код показывает, что вы пытаетесь достичь чего-то, что находится далеко за пределами ваших возможностей.

Пример

Допустим, для примера i = 1.

Это вернет вчерашнюю цену открытия

Эти 2 вернут значения для последнего закрытого 1-минутного бара.


Таким образом, вы сравниваете значения, полученные 1 минуту назад и вчерашнее открытие.

Если i = 2, вы будете сравнивать значения, полученные 2 минуты назад, с открытием 2 дня назад.

Вы должны видеть, что это не может быть тем, что вы хотите.


Привет, ГумРай,

Спасибо, что нашли время помочь мне. Вы правы, я всего лишь новичок и с нетерпением пытаюсь научиться кодировать советника. Вот что я пытаюсь сделать:

1. Сравнить PERIOD_D1 Open с каждым минутным баром PERIOD_M1 на его собственном баре D1, так что есть 1440 баров M1 для сравнения с баром D1. Затем подсчитываем бары M1, которые удовлетворяют условию if (O > L && O < H) .

2. Сохраните подсчитанные бары в массиве, затем снова перейдите к следующему бару D1 и повторите цикл снова.

3. Подсчитанные бары будут построены индикатором на дневном графике. Так, если, скажем, количество баров M1, удовлетворяющих утверждению, равно 5, то это 5 будет отображено как значение дневного бара Bar1. Затем, скажем, для следующего дневного бара M1 подсчитанный бар равен 10, то он снова будет построен на Bar1, так как предыдущий бар переместился на Bar2.

Пожалуйста, покажите мне, как лучше закодировать это, казалось бы, простое утверждение, с которым мне трудно справиться. Дайте мне знать, если вам нужны дополнительные объяснения. и большое спасибо.

 
Zaldy:


Привет GumRai,

Спасибо, что нашли время помочь мне. Вы правы, я только начинающий и очень стараюсь научиться кодировать советника. Вот что я пытаюсь сделать:

1. Сравнить PERIOD_D1 Open с каждым минутным баром PERIOD_M1 на его собственном баре D1, так что есть 1440 баров M1 для сравнения с баром D1. Затем подсчитываем бары M1, которые удовлетворяют условию if (O > L && O < H) .

2. Сохраните подсчитанные бары в массиве, затем снова перейдите к следующему бару D1 и повторите цикл снова.

3. Подсчитанные бары будут построены индикатором на дневном графике. Так, если, скажем, количество баров M1, удовлетворяющих утверждению, равно 5, то это 5 будет отображено как значение дневного бара Bar1. Затем, скажем, для следующего дневного бара M1 подсчитанный бар равен 10, то он снова будет построен на Bar1, так как предыдущий бар переместился на Bar2.

Пожалуйста, покажите мне, как лучше закодировать это, казалось бы, простое утверждение, с которым мне трудно справиться. Дайте мне знать, если вам нужны дальнейшие объяснения, и большое спасибо.


Я буду рад помочь вам, но я не буду писать код, так как это не поможет вам в леармировании.

Во-первых, вы должны понимать, что 1440 баров M1 не всегда соответствуют периоду в 1 день. Если во время бара нет тиков, этот бар будет отсутствовать в истории, и их может быть меньше, чем вы ожидаете.

Поэтому вам нужно значение времени открытия свечи D1. Вы можете это сделать? Попробуйте и опубликуйте свой код

 

не так быстро

Я знаю, что вы пытаетесь сделать, и ваш код(if (O > L && O < H)) не даст вам того, что вы хотите.

посмотрите на прилагаемый график



стрелка вверх - это сегодняшнее открытие

& стрелка ,направленная вправо - это первый бар, соответствующий вашему коду (if (O > L && O < H)), поэтому count = 1

но если вы обратите внимание, бар закрылся выше сегодняшнего открытия, так что на самом деле счетчик должен быть = 2 (по крайней мере (может быть еще несколько пересечений, которые вы не можете увидеть только на тиковом графике)).

но в вашем коде count = только 1

 
qjol:

не так быстро

Я знаю, что вы пытаетесь сделать, и ваш код(if (O > L && O < H)) не даст вам того, что вы хотите.

посмотрите на прилагаемый график



стрелка вверх - это сегодняшнее открытие

& стрелка ,направленная вправо - это первый бар, соответствующий вашему коду (if (O > L && O < H)), поэтому count = 1

но если вы обратите внимание, бар закрылся выше сегодняшнего открытия, так что на самом деле счетчик должен быть = 2 (по крайней мере (может быть еще несколько пересечений, которые вы не можете увидеть только на тиковом графике)).

но в вашем коде count = только 1


Насколько я понимаю, он хочет считать бары, которые находятся в диапазоне цены открытия - возможно, я ошибаюсь :)
 
  1. Zaldy: ПОЖАЛУЙСТА, ПОМОГИТЕ КОМУ-НИБУДЬ! ВОЗМОЖНО ЛИ ЭТО ВООБЩЕ?
    Не кричите на нас. Конечно, это возможно.
  2. Целочисленные и булевы числа конвертируемы. False == 0, true = ненулевое значение.
    return(true); else return(EMPTY_VALUE);
    return(true); else return(2147483647);
    return(true); else return(true);
  3. Вы также имеете дело с тремя таймфреймами, D1, график, M1. Вы должны конвертировать.
    Не компилировалось и не тестировалось.
       Counted_bars=IndicatorCounted(); // Number of counted bars
       for(iCht = Bars - 1 - Counted_bars; iCht >= 0; iCht--){ // Chart bars
          int      iD1    = iBarShift(NULL, PERIOD_D1, Time[iCht];
          double   openD1 = iOpen(NULL, PERIOD_D1, iD1);
          int      iM1Beg = iBarShift(NULL, PERIOD_M1, Time[iCht],
                   iM1End = -1;
          if(iCht > 0) iM1End = iBarShift(NULL, PERIOD_M1, Time[iCht-1];
          for(Buf_0[i] = 0; iM1Beg > iM1End; iM1Beg--){
             double hM1 = iHigh(NULL, PERIOD_M1, iM1Beg),
                    lM1 =  iLow(NULL, PERIOD_M1, iM1Beg);
    // count Bars of M1 Period that crisscross Open price of D1 Period 
            if( hM1 >= openD1 && openD1 >= lM1) Buf_0[iCht]++; 
          }
       }
    
    Не компилируется и не тестируется.
 
qjol:

не так быстро

Я знаю, что вы пытаетесь сделать, и ваш код(if (O > L && O < H)) не даст вам того, что вы хотите.

посмотрите на прилагаемый график



стрелка вверх - это сегодняшнее открытие

& стрелка ,направленная вправо - это первый бар, соответствующий вашему коду (if (O > L && O < H)), поэтому count = 1

но если вы обратите внимание, бар закрылся выше сегодняшнего открытия, так что на самом деле счетчик должен быть = 2 (по крайней мере (может быть еще несколько пересечений, которые вы не можете увидеть только на тиковом графике)).

но в вашем коде count = только 1


Привет Qjol, Да, стрелка, направленная вправо - это первый подсчет, который я хочу. Те, которые пересекаются с D1 Open, считаются только. Еще раз спасибо за ваши усилия.
 
WHRoeder:
  1. Залпы: ПОЖАЛУЙСТА, ПОМОГИТЕ КТО МОЖЕТ! ВОЗМОЖНО ЛИ ЭТО ВООБЩЕ?
    Не кричите на нас. Конечно, это возможно.
  2. Целочисленные и булевы числа конвертируемы. False == 0, true = ненулевое значение.
  3. Вы также имеете дело с тремя таймфреймами, D1, график, M1. Вы должны конвертировать.
    Не компилируется и не тестируется.
    Не компилируется и не тестируется.

Спасибо WHRoeder и извините за использование заглавных букв! Я попробую ваши предложения и вернусь сюда за результатом.
Причина обращения: