Расчет ценовой разницы между двумя барами

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Расчет ценовой разницы между двумя барами

Сообщение Haos » 07 июл 2020, 09:30

Рассмотрим алгоритм расчета ценового разрыва (гэпа) между двумя барами. Оформим данный алгоритм через пользовательскую функцию, которая может быть включена в программный код по мере необходимости.
Ценовую разницу между барами будем возвращать в пунктах.
В качестве параметров функции выберем:
- имя торгового инструмента;
- рабочий ТФ;
- номер левого бара;
- номер правого бара.
Поскольку расчет в МТ идет справа налево, то правый бар всегда имеет меньший индекс чем левый. Т.е. чтобы, к примеру, задать условие расчета гэпа между только что закрытым баром и предшествующим ему, нужно задать в качестве левого бара - 2, а в качестве правого бара - 1. Расчет разрыва будет осуществлен между 1 и 2 барами.
Код: выделить все
/*
   Функция возвращает разницу в пунктах между двумя барами       
   Параметры:                                                               
   sy - наименование инструмента        ("0" - текущий символ)     
   tf - таймфрейм                       (0 - текущий таймфрейм) 
   bar2 - номер левого бара             (2 - второй бар)         
   bar1 - номер правого бара            (1 - первый бар)         
   Возвращаемое значение:                                                   
   положительное - между барами bar2 и bar1 был рост курса                     
   отрицательное - между барами bar2 и bar1 было снижение курса               
*/
int f_GetGap(string sy, int tf, int bar1, int bar2)
{
   if(sy == "0") sy = Symbol();
   double dbl_Point = MarketInfo(sy, MODE_POINT);
   int    dbl_Digit = (int) MarketInfo(sy, MODE_DIGITS);
   int    dd = 0, int_Bars = iBars(sy, tf);

   if(bar1 > int_Bars || bar2 > int_Bars) Print("f_GetGap(): Недостаточно баров для ", sy);
   else
   {
      if(bar1 > 0 && bar2 > 0)
      {
         int d1 = (int) NormalizeDouble((iHigh(sy, tf, bar1) - iLow(sy,  tf, bar2)) / dbl_Point, dbl_Digit);
         int d2 = (int) NormalizeDouble((iLow(sy,  tf, bar1) - iHigh(sy, tf, bar2)) / dbl_Point, dbl_Digit);
         if(MathAbs(d1) > MathAbs(d2)) dd = d1;
         if(MathAbs(d1) < MathAbs(d2)) dd = d2;
         if(MathAbs(d1) == MathAbs(d2))
         {
            if(iOpen(sy, tf, bar2) > iClose(sy, tf, bar1)) dd = d2; else dd = d1;
         }
      }
   }

return(dd);
}

Функция возвращает значение типа int:
- положительное между барами bar2 и bar1, когда был рост курса;
- отрицательное между барами bar2 и bar1, когда было снижение курса.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 47

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения