Как получить время открытия бара на котором пересеклись МАшки

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

Как получить время открытия бара на котором пересеклись МАшки

Сообщение Haos » 05 авг 2019, 12:30

В продолжении вопроса (см. тему Как получить цену закрытия бара на котором пересеклись МАшки) рассмотрим получение времени открытия бара, на котором пересеклись скользящие средние (аналогичный подход может быть использован для любых других индикаторов подобным скользящим средним).

Напишем необходимую функцию, которая будет не слишком отличаться от рассмотренной в указанной выше теме в первом посте, т.е. функции с именем f_GetPriceMACross():

Код: выделить все
datetime f_GetTimeMACross(int pef, int pes, int mef, int mes, int apf, int aps, string ty, int shi)
{
/*
   Описание:
   Функция возвращает время открытия бара, на котором пересеклись скользящие средние. Если
   таковая не была найдена, то функция вернет 01.01.1970
   Параметры:
   pef - период быстрой МАшки
   pes - период медленной МАшки
   mef - метод усреднения быстрой МАшки
   mes - метод усреднения медленной МАшки
   apf - тип цены быстрой МАшки
   aps - тип цены медленной МАшки
   ty  - тип пересечения (на покупку - "B", или продажу - "S" или любое - "A")
   shi - номер пересечения МАшек (от последнего к началу, т.е. 1 - последние пересечение)
*/
   double   dblMAF_1,      // значение быстрой MA на i-ом баре
            dblMAF_2,      // значение быстрой MA на i + 1 баре
            dblMAS_1,      // значение медленной MA на i-ом баре
            dblMAS_2;      // значение медленной MA i + 1 баре
   bool     bol_B,
            bol_S;       
   int      int_N = 0;    // кол-во найденных пересечений
   datetime t = D'01.01.1970 00:00:00'; // Диапазон значений от 1 января 1970 года     
   
   for(int i = 1; i < Bars - pes - 2; i++)
   {
      dblMAF_1 = iMA(NULL, 0, pef, 0, mef, apf, i);
      dblMAF_2 = iMA(NULL, 0, pef, 0, mef, apf, i + 1);
      dblMAS_1 = iMA(NULL, 0, pes, 0, mes, apf, i);
      dblMAS_2 = iMA(NULL, 0, pes, 0, mes, apf, i + 1);
     
      if((dblMAF_1 > dblMAS_1) && (dblMAF_2 < dblMAS_2)) bol_B = true;
      else bol_B = false;
      if((dblMAF_1 < dblMAS_1) && (dblMAF_2 > dblMAS_2)) bol_S = true;
      else bol_S = false;
           
      if(ty == "B") 
      {
         if(bol_B)
         {
            int_N++;
            if(int_N == shi) return(Time[i]);
         }
      }
      else if(ty == "S")
      {
         if(bol_S)
         {
            int_N++;
            if(int_N == shi) return(Time[i]);
         }     
      }
      else if(ty == "A")
      {
         if(bol_B || bol_S)
         {
            int_N++;
            if(int_N == shi) return(Time[i]);
         }     
      }
   }

return(t);
}


Данная функция f_GetTimeMACross() имеет тип времени datetime. Возвращает время открытия бара, на котором пересеклись скользящие средние. Если таковое не была найдено, то функция вернет 01.01.1970 (своего рода, инициация нулем).
Напомню, что данные функции нам потребуются для определения наличия позиции после поступления сигнала, т.е. это будет решением ситуации, когда по тем или иным причинам не была открыта позиция после поступления сигнала, но открыть её по прежнему нужно. Упоминание об этой проблематике см. здесь.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Как получить время открытия бара на котором пересеклись МАшки

Сообщение Haos » 06 авг 2019, 19:55

Я переработал написанную выше функцию под использование в советнике, когда нужно лишь последнее пересечение скользящих средних. Данная версия выглядит более сжато.

Код: выделить все
datetime f_GetTimeLastMACross(int pef, int pes, int mef, int mes, int apf, int aps)
{
/*
   Описание:
   Функция возвращает время открытия бара, на котором пересеклись скользящие средние. Если
   таковая не была найдена, то функция вернет 01.01.2100 00:00:00
   Параметры:
   pef - период быстрой МАшки
   pes - период медленной МАшки
   mef - метод усреднения быстрой МАшки
   mes - метод усреднения медленной МАшки
   apf - тип цены быстрой МАшки
   aps - тип цены медленной МАшки
*/
   double   dblMAF_1,      // значение быстрой MA на i-ом баре
            dblMAF_2,      // значение быстрой MA на i + 1 баре
            dblMAS_1,      // значение медленной MA на i-ом баре
            dblMAS_2;      // значение медленной MA i + 1 баре
   
   datetime t = D'01.01.2100 00:00:00'; // Диапазон значений от 1 января 2100 года     
   
   for(int i = 1; i < Bars - pes - 2; i++)
   {
      dblMAF_1 = iMA(NULL, 0, pef, 0, mef, apf, i);
      dblMAF_2 = iMA(NULL, 0, pef, 0, mef, apf, i + 1);
      dblMAS_1 = iMA(NULL, 0, pes, 0, mes, apf, i);
      dblMAS_2 = iMA(NULL, 0, pes, 0, mes, apf, i + 1);
     
      if((dblMAF_1 > dblMAS_1) && (dblMAF_2 < dblMAS_2)) return(Time[i]);
      if((dblMAF_1 < dblMAS_1) && (dblMAF_2 > dblMAS_2)) return(Time[i]);
   }

return(t);
}

Обращаю внимание, что для технических целей использования в коде советника датой по умолчанию является 01.01.2100 00:00:00.
Это необходимо потому, что когда мы будем искать позицию, которая была открыта после найденного времени пересечения МАшек, условие с начальной датой на 1 января 1970 г. всегда будет выполняться. Если же выбрать дату больше чем время открытия позиций, то искомая дата или будет найдена на пересечении или не будет найдена.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


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

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

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

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

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