Статистика пробоев High/Low текущего бара на основе тиковых значений

 

Ни разу не работал с тиками. Сейчас назрела необходимость. Прошу помочь.

Нужно не для каждого бара на графике (как обычно строятся индикаторы), а только для текущего, который формируется в н.в. вывести информацию на экран графика (средствами Comment) следующую информацию:

1. Сколько раз цена Bid равнялась с High/Low

2. Сколько раз изменяла High/Low

 

Как это сделать? Может кто пример индюка своего скинет, работающего на тиках с ценами?

 
vit_fx:

Ни разу не работал с тиками. Сейчас назрела необходимость. Прошу помочь.

Нужно не для каждого бара на графике (как обычно строятся индикаторы), а только для текущего, который формируется в н.в. вывести информацию на экран графика (средствами Comment) следующую информацию:

1. Сколько раз цена Bid равнялась с High/Low

2. Сколько раз изменяла High/Low

 

Как это сделать? Может кто пример индюка своего скинет, работающего на тиках с ценами?

1 пункт выполняется только 1 раз на первом тике бара.

2 пункт выполним в цикле со счётчиками, проверяя увеличение разностей High-Bid и Bid-Low, считая с открытия бара до открытия следущего.

С этой задачей можете сами справиться! 

 
Boris:

1 пункт выполняется только 1 раз на первом тике бара.

На первом, а точнее, на нулевом тике бара bid == open. Далее bid может быть равным high и low сколько угодно раз. Надо завести 2 счетчика и сравнивать до начала нового бара.
 
Alexey Volchanskiy:
На первом, а точнее, на нулевом тике бара bid == open. Далее bid может быть равным high и low сколько угодно раз. Надо завести 2 счетчика и сравнивать до начала нового бара.

Правильно, потому что 1-й уже будет зелёный, то есть, выше, или как? Потому что никогда 1-й тик не встречал на понижение, красный. 

Понятно, но меня этот вопрос не волнует! Не тиком единым жив трейдер! ;)) 

 
vit_fx:

Как это сделать? Может кто пример индюка своего скинет, работающего на тиках с ценами?

А какие у вас возникают проблемы? Где код с попыткой реализации? Нужно помочь или сделать за вас?

Индикатор получится достаточно простой:

  • при появлении бара обнуляем все счетчики и переменные,
  • при равенстве close[0] и high[0] увеличиваем счетчик "касание хай"
  • при high[0] > prev_high увеличиваем счетчик "изменение хай" и запоминаем prev_high = high[0]
  • аналогично для лоу.

 
Andrey Khatimlianskii:

А какие у вас возникают проблемы? Где код с попыткой реализации? Нужно помочь или сделать за вас?

Индикатор получится достаточно простой:

  • при появлении бара обнуляем все счетчики и переменные,
  • при равенстве close[0] и high[0] увеличиваем счетчик "касание хай"
  • при high[0] > prev_high увеличиваем счетчик "изменение хай" и запоминаем prev_high = high[0]
  • аналогично для лоу.

5+! Образцово-показательный профессиональный ответ и полезный для качественной подготовки нового поколения программистов! 
 
Andrey Khatimlianskii:

А какие у вас возникают проблемы? Где код с попыткой реализации? Нужно помочь или сделать за вас?

Индикатор получится достаточно простой:

  • при появлении бара обнуляем все счетчики и переменные,
  • при равенстве close[0] и high[0] увеличиваем счетчик "касание хай"
  • при high[0] > prev_high увеличиваем счетчик "изменение хай" и запоминаем prev_high = high[0]
  • аналогично для лоу.

Так и планировалось сделать. Думал что работа с ценой на уровне тика чем-то будет отличаться. 

Когда открываешь тиковый график, то часто можно видеть колебания цены, которые не отражаются на основном графике. С чем связано не знаю, но происходит это регулярно на каждой валютной паре. Может ошибка отрисовки или зрительного восприятия, из-за вертикального сжатия графика. 

 Попробую так и сделать. Спасибо! 

 
Andrey Khatimlianskii:

А какие у вас возникают проблемы? Где код с попыткой реализации? Нужно помочь или сделать за вас?

Индикатор получится достаточно простой:

  • при появлении бара обнуляем все счетчики и переменные,
  • при равенстве close[0] и high[0] увеличиваем счетчик "касание хай"
  • при high[0] > prev_high увеличиваем счетчик "изменение хай" и запоминаем prev_high = high[0]
  • аналогично для лоу.

Господа, вернулся к вопросу.

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[]) 
  {

   int        check_high, check_low;
   int        change_high, change_low;
   double     prev_high, prev_low;
   
   check_high  = 0;
   check_low   = 0;
   prev_high   = Open[0];
   prev_low    = Open[0];
   
      //Print("Ticks: ", tick_volume[0]);

         if (Close[0] == High[0])   check_high++;
         if (Close[0] == Low[0])    check_low++;
         if (High[0] > prev_high)   {prev_high = High[0]; change_high++;}
         if (Low[0] < prev_low)     {prev_low = Low[0]; change_low++;}
          
   Print("High checked: ", check_high, " *** changed: ", change_high);
   Print("Low checked: ", check_low, " *** changed: ", change_low);
          
   //---- конец
   return(0);
  }

 

 Статья появлении бара написана для MQL5. Статья хорошая, прочел. У меня задача решается для MQL4.

Идентификацию появления нового бара делать через OnCalculate? При очередном тике счетчики обнуляются, а должны при появлении нового бара.

 
vit_fx:

Господа, вернулся к вопросу.

 

 Статья появлении бара написана для MQL5. Статья хорошая, прочел. У меня задача решается для MQL4.

Идентификацию появления нового бара делать через OnCalculate? При очередном тике счетчики обнуляются, а должны при появлении нового бара.

https://book.mql4.com/ru
Учебник по MQL4
Учебник по MQL4
  • book.mql4.com
Учебник по MQL4 - Учебник по MQL4
 
vit_fx:

Идентификацию появления нового бара делать через OnCalculate? При очередном тике счетчики обнуляются, а должны при появлении нового бара.

Переменные-счетчики нужно объявить на глобальном уровне, а в ините и при появлении нового бара - обнулять.

И почитайте про сравнение вещественных чисел. Даже на этом форуме было несколько тем. 

 
Andrey Khatimlianskii:

Переменные-счетчики нужно объявить на глобальном уровне

Объявил

Andrey Khatimlianskii:

...а в ините и при появлении нового бара - обнулять.

 в ините - обнулил. А как обнулить при появлении нового бара? Где "оно" (появление нового бара) происходит исходя из кода? Я не могу этого понять:

   int        check_high, check_low;
   int        change_high, change_low;
   double     prev_high, prev_low;


int init()
  {
   IndicatorBuffers(1);
   SetIndexBuffer(0,operation);
   
   check_high  = 0; change_high = 0;
   check_low   = 0; change_low = 0;
         
   prev_high   = High[0];
   prev_low    = Low[0];

   return(0);
  }
   
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[]) 
  {

         if (Close[0] == high[0])   check_high++;
         if (Close[0] == low[0])    check_low++;
         if (high[0] > prev_high)   {prev_high = high[0];   change_high++;}
         if (low[0] < prev_low)     {prev_low = low[0];     change_low++;}
          
   Print("High checked: ", check_high, " *** changed: ", change_high);
   Print("Low checked: ", check_low, " *** changed: ", change_low);
          
   //---- конец
   return(rates_total);
  }
Причина обращения: