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

    Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
    Бонус за сообщение 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
     
    Сообщений: 17685
    Зарегистрирован: 29 мар 2014, 16:07
    Средств на руках: 473.10 Доллар
    Группа: Главные модераторы
    Благодарил (а): 2425 раз.
    Поблагодарили: 6900 раз.

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

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

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

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

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