MQL4 (OrderSelect)

 
Алгоритм простой, открываем ордер со стопом, звписываем значение тикета в переменную и по ней делаем селект этого ордера каждый тик.По логике, после отработки стоп лосса, ордера уже не существует в 'открытых', однако OrderSelect возвращвет true при любом MODE с этим тикетом.

Вобщем помогите определить, закрытие оредера по стоп лоссу =) но жучище на лицо!

 

 -- Log

2016.02.14 07:40:34.014 2016.02.01 01:15  vicEA_00.04 GE30,H1: Alert: PROFIT = ACCOUNT BALANCE; CURR ORDER TICKET: 1

2016.02.14 07:40:33.981 2016.02.01 01:15  vicEA_00.04 GE30,H1: Alert: PROFIT = ACCOUNT BALANCE; CURR ORDER TICKET: 1

2016.02.14 07:40:33.981 2016.02.01 01:15  Tester: stop loss #1 at 9799.0 (9798.9 / 9799.9)

2016.02.14 07:40:33.949 2016.02.01 01:15  vicEA_00.04 GE30,H1: Alert: PROFIT = ACCOUNT BALANCE; CURR ORDER TICKET: 1


2016.02.14 07:39:37.526 2016.02.01 01:07  vicEA_00.04 GE30,H1: Alert: PROFIT = ACCOUNT BALANCE; CURR ORDER TICKET: 1

2016.02.14 07:39:37.493 2016.02.01 01:07  vicEA_00.04 GE30,H1: open #1 buy 1.00 GE30 at 9810.0 sl: 9799.0 ok

2016.02.14 07:39:37.493 2016.02.01 01:07  vicEA_00.04 GE30,H1: Alert: CLOSED PROFIT += PROFIT, ORDER TICKET: -1

2016.02.14 07:39:37.461 2016.02.01 01:07  vicEA_00.04 GE30,H1: Alert: CLOSED PROFIT += PROFIT, ORDER TICKET: -1

 

-- Code

 //+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

//---

      if(OrderSelect(currOrder.ticket, SELECT_BY_TICKET, MODE_TRADES))

      {

         Alert("PROFIT = ACCOUNT BALANCE; CURR ORDER TICKET: "+currOrder.ticket);

      }

      else

      {

         Alert("CLOSED PROFIT += PROFIT, ORDER TICKET: "+currOrder.ticket);

      }

  } 

 
если ордер с этим тикетом существует, то не важно где он, режимы моде надо применять для SELECT_BUY_POS
 
Alexander Bereznyak:
если ордер с этим тикетом существует, то не важно где он, режимы моде надо применять для SELECT_BUY_POS
Всмысле существует? Он же закрылся по стоп лоссу или я что-то не понял из документации??? https://docs.mql4.com/ru/trading/orderselect
 
вы не поняли, зачем такое название темы давать, никакого бага нет, по тикету ордер можно достать в любом месте, модификатор не нужен
 
Alexander Bereznyak:
вы не поняли, зачем такое название темы давать, никакого бага нет, по тикету ордер можно достать в любом месте, модификатор не нужен
Ну создал уже, что теперь... Да почитал...

Примечание

Параметр pool игнорируется, если ордер выбирается по номеру тикета. Номер тикета является уникальным идентификатором ордера.

 

пс: Ну не первый раз уже в специфику документации врубаюсь....  сверху одно, снизу другое.... сейчас попробую с проверкой по тайм клозе, В любом случае спасибо!

 
Самый простой способ определять закрылся ордер по стоплоссу или нет проверка комментария к ордеру, анологично проверяется закрытие по тейкпрофиту
   if(OrderSelect(tiket,SELECT_BY_TICKET))
     {
      if(StringFind(OrderComment(),"sl")>=0)
        {
         Print("Ордер закрыт по стоп лоссу");
        }
     }
 

а если ордер закрылся по рынку или TakeProfit, надо определять по времени закрытия, у рыночного ордера время закрытия всегда равно нулю, а затем по необходимости

определять как ордер закрылся, а если используете отложенные ордера и их удаление, то надо проверить еще и тип ордера, может он удален 

 

Аллилуя! Спасибо всем кто принял участие =) 

Александр, Ваши комментарии учту.

      if(OrderSelect(currOrder.ticket, SELECT_BY_TICKET))

      {

         if(OrderCloseTime()==0)

         {

            Alert("OPENED");

         }

         else

         {

            Alert("CLOSED");

         }

      }  

 
Sergey Gritsay:
Самый простой способ определять закрылся ордер по стоплоссу или нет проверка комментария к ордеру, анологично проверяется закрытие по тейкпрофиту

А не факт, что так будет на всех ДЦ. Я вот так определяю

    // возвращает причину закрытия ордера
    OrderCloseReason GetOrderCloseReason(int ticket)
    {
        if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY))
            return crNotFound;
        if (OrderType() == OP_BUY)
        {
            if (OrderTakeProfit() > 0 && OrderTakeProfit() <= OrderClosePrice())
                return crByTakeProfit;
            if (OrderStopLoss() > 0 && OrderStopLoss() >= OrderClosePrice())
                return crByStopLoss;
        }
        if (OrderType() == OP_SELL)
        {
            if (OrderTakeProfit() > 0 && OrderTakeProfit() >= OrderClosePrice())
                return crByTakeProfit;
            if (OrderStopLoss() > 0 && OrderStopLoss() <= OrderClosePrice())
                return crByStopLoss;
        }
        return crUnknown;
    }
 
Alexey Volchanskiy:

А не факт, что так будет на всех ДЦ. Я вот так определяю

Согласен в вами, так как на разных ДЦ в коммент добавят [sl] [SL] [tp] [TP] и ещё множество вариаций, а возможно и ни чего не добавят.
 
Vladimir Zubov:
Согласен в вами, так как на разных ДЦ в коммент добавят [sl] [SL] [tp] [TP] и ещё множество вариаций, а возможно и ни чего не добавят.
перебрал несколько десятков ДЦ, везде [sl] [tp]
Причина обращения: