PositionSelect код ошибка 4753

 

Позиции всегда открыты но в один прекрасный момент PositionSelect почему то возвращает ошибку 4753 (Позиция не найдена):

 

void OnTick()
  {   
   do //Ждем прибыль
   {
   Alert("-1*",OrderProfit2+OrderProfit1,"*",GetLastError());
   Sleep(10);
   bid   =SymbolInfoDouble(Money№1,SYMBOL_BID); // Запрос значения Bid
   ask   =SymbolInfoDouble(Money№1,SYMBOL_ASK); // Запрос значения Ask
   if (StringLen(Money№1_SELLorBUY)==3)
   OrderCalcProfit(ORDER_TYPE_BUY,Money№1,Lot,ticket1,bid,OrderProfit1);
   else
   OrderCalcProfit(ORDER_TYPE_SELL,Money№1,Lot,ticket1,ask,OrderProfit1);

   bid   =SymbolInfoDouble(Money№2,SYMBOL_BID); // Запрос значения Bid
   ask   =SymbolInfoDouble(Money№2,SYMBOL_ASK); // Запрос значения Ask
   if (StringLen(Money№2_SELLorBUY)==3)
   OrderCalcProfit(ORDER_TYPE_BUY,Money№2,Lot,ticket2,bid,OrderProfit2);
   else
   OrderCalcProfit(ORDER_TYPE_SELL,Money№2,Lot,ticket2,ask,OrderProfit2);
   Alert("0*",OrderProfit2+OrderProfit1,"*",GetLastError());
      //Отслеживаем закрытые из вне позиции. Если такая есть ждем закрытие второй позиции.
      PositionSelect(Money№1);
      TimePosition1 = PositionGetInteger(POSITION_TIME);
      PositionSelect(Money№2);
      Alert("-22*",TimePosition2,TimePosition1,"*",GetLastError()); // error 4753 Позиция не найдена
      TimePosition2 = PositionGetInteger(POSITION_TIME);  
      Alert("-0*",TimePosition2,TimePosition1,"*",GetLastError()); //выдал 0 = TimePosition1!!!
      if  (TimePosition2==0 || TimePosition1==0) 
      {
         while (1)
         {
         PositionSelect(Money№1);
         TimePosition1 = PositionGetInteger(POSITION_TIME);
         PositionSelect(Money№2);
         TimePosition2 = PositionGetInteger(POSITION_TIME); 
         if  (TimePosition2==0 && TimePosition1==0)
         {order1 = true;
         order2 = true;
         break;}
         }
      break;
      }
      //Отслеживаем закрытые из вне позиции. Если такая есть ждем закрытие второй позиции.
    Print(OrderProfit2+OrderProfit1,"*",GetLastError());
   }
   while ((OrderProfit2+OrderProfit1)<Profit); //Ждем прибыль
}

Почему появляется эта ошибка если позиция открыта? 

 
 
1987pavlov:
Полный код, если нужно: https://drive.google.com/file/d/0B6j5Emo524FIdnA3RzRHUWZwOU0/edit?usp=sharing
Когда Вы пишите сообщение, обратите внимание на нижний левый угол поста: там есть кнопка "Прикрепить файл". 
 
Полный код
Файлы:
 
Может быть это из за ролловера потому как он закрывает и вновь открывает позиции?
 
Alexander Pavlov:
Может быть это из за ролловера потому как он закрывает и вновь открывает позиции?
У меня тоже такая проблема. Позиция точно есть, а вот PositionSelect() ее не видит.
 

У меня бывает абсолютно аналогично. К примеру функция которой эксперт открывает позицию: OrderSend, возвращает trade_result.deal: 406. Казалось бы, функция OrderSend вернула правильный тикет. Но следующая функция: 

double getPositionProfit(int _position){
  ResetLastError();
  if(PositionSelectByTicket(_position))
    return PositionGetDouble(POSITION_PROFIT);
  else{
    Print("getPositionProfit Error coge: #", GetLastError());
    return 0;
  }
}

которая вызывается сразу после открытия позиции возвращает 0 с ошибкой 4753, как это не странно. В тоже время на графике вместо позиции #406, которая должна быть по идее, красуется позиция #413. Как и где тикет позиции успел поменяться между вызовами OrderSend и моей функции  getPositionProfit (а фактически PositionSelectByTicket и PositionGetDouble), что я не понял как это произошло?

 
Mihail Matkovskij:

У меня бывает абсолютно аналогично. К примеру функция которой эксперт открывает позицию: OrderSend, возвращает trade_result.deal: 406. Казалось бы, функция OrderSend вернула правильный тикет. Но следующая функция: 

которая вызывается сразу после открытия позиции возвращает 0 с ошибкой 4753, как это не странно. В тоже время на графике вместо позиции #406, которая должна быть по идее, красуется позиция #413. Как и где тикет позиции успел поменяться между вызовами OrderSend и моей функции  getPositionProfit (а фактически PositionSelectByTicket и PositionGetDouble), что я не понял как это произошло?

Это не позиция, это сделка.

 
Alexey Viktorov:

Это не позиция, это сделка.

Значит, в MQL5 идентификатор "сделки" и идентификатор "позиции" совпадают, так как моя функция getPositionProfit работает в подавляющем большинстве случаев. Почему же тогда она перестает работать в определенные моменты?

 
Mihail Matkovskij:

Значит, в MQL5 идентификатор "сделки" и идентификатор "позиции" совпадают, так как моя функция getPositionProfit работает в подавляющем большинстве случаев. Почему же тогда она перестает работать в определенные моменты?

Очень подозреваю, что "моя функция" далеко не ваша. Но в ней используется DEAL_POSITION_ID из свойств сделки

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Сделка является отражением факта совершения торговой операции на основании ордера, содержащего торговый приказ. Каждая сделка описывается свойствами, позволяющими получить информацию о ней. Для чтения значений свойств используются функции вида Идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка. Каждая...
 
Alexey Viktorov:

Очень подозреваю, что "моя функция" далеко не ваша.

Да какая разница, если это простая последовательность PositionSelectByTicket и PositionGetDouble? Функция на стандартных API. Что в ней такого особенного? Называю так, чтобы  каждый раз не писать PositionSelectByTicket и PositionGetDouble.

Alexey Viktorov:

Но в ней используется DEAL_POSITION_ID из свойств сделки

В моей функции не используется DEAL_POSITION_ID. Информацию о сделках в MQL5 можно получить только из истории, если не ошибаюсь. Поэтому, если я получил trade_result.deal из OrderSend, то за информацией по trade_result.deal я должен обращаться к истории сделок, если я правильно понимаю?

Причина обращения: