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