home

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