Существует еще один способ узнать была ли закрыта позиция по 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; если найдена — номер позиции в строке, с которой начинается искомая подстрока.