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