Время открытия позиции

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

Время открытия позиции

Сообщение Haos » 22 сен 2021, 09:02

Прикасаясь к теме работе со временем в MQL, мы должны прежде всего рассмотреть процедуру получения времени открытия открытой позиции. Звучит близко к тавтологии, но именно так, поскольку позиция открывается или не открывается. Когда она открылась, то и называется открытой позицией и время её открытия становится определенным.

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

Итак, напишим соответствующую функцию для получения времени открытия позиции. Назовем её f_TimeOpenPos. Функция будет иметь тип datetime, т.е. возвращать значения типа времени. Из параметров функции f_TimeOpenPos нам понадобятся три:

- sy - наименование инструмента;
- op - тип операция (покупка или продажа); Указываем явно, чтобы избежать неоднозначности. Впрочем, можно и провести небольшие изменения и попробовать посмотреть что будет, если ввести возможность поиска "любого" типа позиции.
- mn - MagicNumber (для позиций не имеющих мэджик предусмотрена возможность поиска при значении параметра "-1").
Формализуем переменную t значением датой начала времени отсчета 01.01.1970 00:00:00.
Далее, в цикле пробегаем по всем имеющимся ордерам и ищем среди них те, что открыты по заданному активу, с заданным направлением торговли (типом позиции), с заданным мэджиком. При нахождении позиции, удовлетворяющим данным критериям, получаем значение времени её открытия:

Код: выделить все
t = OrderOpenTime();

В конце-концов, фунция возвращает, полученное значение. Если значение не было найдено, то по умолчанию вернется "точка отсчета", т.е. 01.01.1970 00:00:00. При использовании функции это надо учесть, т.е. это, своего рода, ноль. Но, поскольку, нуля нет в значения времени, то нужно получить какую-то дату, вот начальную и получаем. Далее разработчик, помня это, производит в коде торгового робота необходимые действия.

Код функции для получения времени открытия открытой позиции:
Код: выделить все
//|  Описание : Возвращает время открытия открытой позиций
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("0" - текущий символ)
//|    op - операция                   (OP_BUY или OP_SELL)
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime f_TimeOpenPos(string sy, int op, int mn)
{
   datetime t = D'01.01.1970 00:00:00';
   if(sy == "0") sy = Symbol();
   for(int i = 0; i < OrdersTotal(); i++)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == sy)
         {
            if(OrderType() == OP_BUY || OrderType() == OP_SELL)
            {
               if(OrderType() == op)
               {
                  if(mn < 0 || OrderMagicNumber() == mn)
                  {
                     t = OrderOpenTime();
                  }
               }
            }
         }
      }
   }

return(t);
}


Полученное значение можно, к примеру, отнять из текущего времени и сравнить с заданным сроком существования позиции. Если он превосходит его, то закрыть позицию. Соответственно, если время "открытия" позиции равно 01.01.1970 00:00:00, это означает, что искомой позиции просто нет.

Таким образом, мы рассмотрели функцию получения времени открытия открытой позиции. Кстати, как видно по формату возвращаемой даты, с точностью до секунды.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 22093
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 1,410.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3083 раз.
Поблагодарили: 7764 раз.

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

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

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

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

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