Существует еще один способ узнать была ли закрыта позиция по Stop Loss или Take Profit ордеру. При этом данный способ будет более простым, чем рассмотренные ранее.
В этом нам поможет функция OrderComment().
string OrderComment()
После того как ордер или позиция выбраны функцией OrderSelect() вызов функции OrderComment() вернет комментарии этого ордера/позиции в виде строки.
Очень часто сервер пишет в комментарий ордера или позиции полезные вещи:
- [sl] — если сработал Stop Loss;
- [tp] — если сработал Take Profit;
- cancelled — если отложенный ордер был отменен клиентом;
- deleted [no money] — если отложенный ордер должен был сработать, но был удален сервером из-за недостатка свободных средств на счете;
- partial close — если позиция была закрыта частично;
- close hedge by #тикер — если локированная позиция была закрыта полностью другой локированной позицией;
- [число%] — позиция была закрыта по Stop Out (т.е. сервер автоматически закрыл позицию, когда equity стало меньше 20% необходимой маржи);
- deleted [good for day] — удаленный отложенный ордер по CFD, который имел статус Day Order;
- expiration [YYYY.MM.DD HH:MM] — отложенный ордер, который был удален сервером при достижении даты эксперации YYYY.MM.DD HH:MM;
- split from #тикер — при закрытии одной позицией другой с разными объемами появляется в рынке новая позиция с таким комментарием; #тикер — номер тикера позиции с бОльшим объемом.
Может быть этот список неполон, но в данный момент нас это не должно волновать. Нас интересуют те позиции и ордера, в комментарии которых встречается подстрока [sl] (позиция закрыта по Stop Loss ордеру) или подстрока [tp] (позиция закрыта по Take Profit ордеру):
//---- выбираем ордер/позицию с тикером 77777
if ( OrderSelect (77777, SELECT_BY_TICKET) == true)
{
// это позиция, а не отложеный ордер?
if ((OrderType() == OP_BUY) || (OrderType() == OP_SELL))
{
// это закрытая позиция, а не открытая?
if ( OrderCloseTime() != 0 )
{
if ( StringFind(OrderComment(), "[sl]") != -1 )
{
// позиция закрылась по Stop Loss
// ...
}
else
{
if ( StringFind(OrderComment(), "[tp]") != -1 )
{
// позиция закрылась по Take Profit
// ...
}
else
Print("Ошибка: позиция закрыта не по ордеру");
}
}
else
Print("Ошибка: это не закрытая позиция, а открытая");
}
else
Print("Ошибка: это не закрытая позиция, а отложенный ордер");
}
else
Print("OrderSelect() вернул ошибку - ",GetLastError());
В этом примере есть неизвестная пока нам функция — StringFind():
int StringFind ( string text, string matched_text, int start=0 )
Эта функция ищет в строке text подстроку matched_text начиная с позиции start (если третий параметр не указан, то поиск идет с нулевой позиции, т.е. с первого элемента). Если подстрока не найдена, то функция возвращает -1; если найдена — номер позиции в строке, с которой начинается искомая подстрока.