Ошибка закрытия ордера. Что в коде не так?

 
//+------------------------------------------------------------------+
//|                                             test333333333333.mq4 |
//|                                                       Yuriy Vins |
//|                                       https://www.sayta.net |
//+------------------------------------------------------------------+
#property copyright "Yuriy Vins"
#property link      "https://www.sayta.net"
#property version   "1.00"
#property strict

int i=0;
int ticket;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  for( ; i<1; i++)
  ticket=OrderSend(Symbol(),OP_SELL,0.01,Bid,3,Ask+1000*Point,Ask-1000*Point,NULL,12345,0,clrNONE); //Открыть ордер на продажу
  
  if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true && OrderProfit()>2)
  bool yes=OrderClose(OrderTicket(),0.01,Ask,3,clrNONE);
   
  }
//+------------------------------------------------------------------+

4108

ERR_INVALID_TICKET

Неверный номер тикета


Уважаемые коллеги! Тиккет объявлен и записан, что же не так? Подскажите: Разве я что-то не правильно написал в коде? Это простой пример, но меня очень удивило. ((

Файлы:
skfdx7_4108.PNG  35 kb
 
Как же правильно выбирать и закрывать ордер по тиккету?
 

Нужно убедиться, что ордер реально существует. В приведенном примере есть лишь проверка того факта, что ордер выбран. Но ведь ордер может быть уже закрыт. При этом ничто не мешает его выбрать, т. к. он находится в "Истории счета".

Чтобы узнать, к какому списку принадлежит ордер, необходимо провести дополнительную проверку. Если у ордера время закрытия равно нулю, то он находится в списке рабочих ордеров. Ненулевое время закрытия - ордер в списке "История счета". В этом случае закрыть его уже нельзя.

На рисунке как раз все верно:

  1. Открыли ордер.
  2. Дождались нужной прибыли и закрыли ордер.
  3. Далее код продолжает "издеваться над трупом" )) - пытается закрыть ордер, который уже закрыт.

 
Ihor Herasko:

Нужно убедиться, что ордер реально существует. В приведенном примере есть лишь проверка того факта, что ордер выбран. Но ведь ордер может быть уже закрыт. При этом ничто не мешает его выбрать, т. к. он находится в "Истории счета".

Чтобы узнать, к какому списку принадлежит ордер, необходимо провести дополнительную проверку. Если у ордера время закрытия равно нулю, то он находится в списке рабочих ордеров. Ненулевое время закрытия - ордер в списке "История счета". В этом случае закрыть его уже нельзя.

На рисунке как раз все верно:

  1. Открыли ордер.
  2. Дождались нужной прибыли и закрыли ордер.
  3. Далее код продолжает "издеваться над трупом" )) - пытается закрыть ордер, который уже закрыт.

//+------------------------------------------------------------------+
//|                                             test333333333333.mq4 |
//|                                                       Yuriy Vins |
//|                                       https://www.sayta.net |
//+------------------------------------------------------------------+
#property copyright "Yuriy Vins"
#property link      "https://www.sayta.net"
#property version   "1.00"
#property strict

int i=0;
int ticket;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  for( ; i<1; i++)
  ticket=OrderSend(Symbol(),OP_SELL,0.01,Bid,3,Ask+1000*Point,Ask-1000*Point,NULL,12345,0,clrNONE); //Открыть ордер на продажу
  
  if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true && OrderCloseTime()==0 && OrderProfit()>2)
  bool yes=OrderClose(OrderTicket(),0.01,Ask,3,clrNONE);
   
  }
//+------------------------------------------------------------------+

"издеваться над трупом"  -- Ну меня это немного рассмешило. Тем самым я избавился от ошибки! Спасибо!

Файлы:
Причина обращения: