Помогите пожалуйста со стоп лоссом.

 

Здравствуйте. Помогите пожалуйста.

Вопрос такой: как в эксперте для МТ4 узнать что ордер закрыт по стоп лоссу?

Т.е нужно программно понять что ордер закрыт по стоп лоссу, чтобы в последствие выполнить некое условие. 

 
Именно по стоп лоссу или в закрытый в убытке тоже пойдет ?
 
Kino:
Именно по стоп лоссу или в закрытый в убытке тоже пойдет ?
В том то и дело, что надо именно по стоп лоссу. Не могу найти такой функции.
 
ldd:
В том то и дело, что надо именно по стоп лоссу. Не могу найти такой функции.

https://www.mql5.com/ru/forum/131859/page4#434229

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
Только "Полезные функции от KimIV". - MQL4 форум
  • www.mql5.com
Только "Полезные функции от KimIV". - MQL4 форум
 
Но обратите внимание что на новых счетах типа ECN NDD STP будет работать через раз, так как часто закрывается с проскальзованием и разницы в последней цифре пятизнака будет достаточно, чтобы функция не заметила закрытие по стопу. Для тестера норм пойдет, для демо и реала сейчас есть более хитрые решения.
 

Спасибо. Буду разбираться. Нужен для реала. 

Нашёл вот ещё что

if (StringFind(OrderComment(),"[sl",0)>=0)

{

В этом коде будет смысл? 

 
Да, сервер дополняет строку [sl] , надо отбор делать по коменту в ордере с этой припиской. Так будет работать 100%. Насчет вашего кода незнаю. Можно функцию что выше изменить чтобы она не сравнивала цену закрытия и цену стоп лосса, а проверяла если приписка в каменте ордера.
 
Kino:
Да, сервер дополняет строку [sl] , надо отбор делать по коменту в ордере с этой припиской. Так будет работать 100%. Насчет вашего кода незнаю. Можно функцию что выше изменить чтобы она не сравнивала цену закрытия и цену стоп лосса, а сравнивала если приписка в каменте ордера.

Думаю сравнение по приписки в коменте ордера более надёжный способ чем по цене.

А больше никаких  вариантов нет? Получается терминал прямой информации о закрытие по стоп лоссу не даёт?

 


Да как сказать, вроде и выдает. К OrderComment() добавляет [sl]

Вот на картинке стоп был 1.06152 закрылся 1.06158 поэтому отбор только по каменту)

 
Попробую реализовать по коменту.
 

Не надо по комменту, это ненадежно.

Просто вместо вот этой строки:

if (ocp==osl) return(True);

 сделайте разделение по типу позиции и проверку не на равенство, а <= (для бай) или >= (для селл):

if ( (OrderType() == OP_BUY && osl - ocp > -DBL_EPSILON) || (OrderType() == OP_SELL && ocp - osl > -DBL_EPSILON) ) return(true);