PositionSelect код ошибка 4753 - страница 2

 
Mihail Matkovskij:

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

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

Разница в том, что в PositionSelectByTicket надо ставить тикет позиции, а не сделки. Тикет позиции почти всегда совпадает с тикетом ордера, но крайне редко, или никогда, не совпадает с тикетом сделки. Поэтому получив тикет сделки, надо получить по нему DEAL_POSITION_ID и только по тикету позиции выбрать позицию для дальнейшей работы с ней.

Или после открытия позиции обратиться к Request, получить структуру MqlTradeRequest в которой присутствует тикет позиции

position

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

 
Alexey Viktorov:

Разница в том, что в PositionSelectByTicket надо ставить тикет позиции, а не сделки. Тикет позиции почти всегда совпадает с тикетом ордера, но крайне редко, или никогда, не совпадает с тикетом сделки. Поэтому получив тикет сделки, надо получить по нему DEAL_POSITION_ID и только по тикету позиции выбрать позицию для дальнейшей работы с ней.

Или после открытия позиции обратиться к Request, получить структуру MqlTradeRequest в которой присутствует тикет позиции

position

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

MqlTradeRequest, это входные параметры (данные), MqlTradeResult, это выходные данные, функции OrderSend. Request, это запрос, если перевести с английского. Как же OrderSend может вернуть значение в запрос или во входные данные (Request)?

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

PositionSelect код ошибка 4753

Mihail Matkovskij, 2019.07.09 11:22

У меня бывает абсолютно аналогично. К примеру функция которой эксперт открывает позицию: 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), что я не понял как это произошло?


Тикет long-типа. Судя по низким значениям , запускаете в Тестере. Следующий совет неправильный, но сможет улучшить ситуацию: вместо  trade_result.deal использовать trade_result.order.

 
Mihail Matkovskij:

MqlTradeRequest, это входные параметры (данные), MqlTradeResult, это выходные данные, функции OrderSend. Request, это запрос, если перевести с английского. Как же OrderSend может вернуть параметры в запрос или во входные данные (Request)?

Проверьте.

В стандартной библиотеке есть

   void              Request(MqlTradeRequest &request) const;

Если совпадает всё, то строка 45.

После открытия позиции запрашиваем .Request() и оттуда читаем тикет позиции.

 
fxsaber:

Тикет long-типа. Судя по низким значениям , запускаете в Тестере. Следующий совет не правильный, но сможет улучшить ситуацию, если вместо  trade_result.deal будете использовать trade_result.order.

Обратите особое внимание на выделенное

position

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


только-лишь "КАК ПРАВИЛО"... Но может и не совпасть. Я на это нарывался даже в тестере.

 
Alexey Viktorov:

только-лишь "КАК ПРАВИЛО"... Но может и не совпасть. Я на это нарывался даже в тестере.

Прочтите внимательнее мой пост.

 
fxsaber:

Прочтите внимательнее мой пост.

Вот именно "сможет улучшить", но не сделать правильно. И не смотря на то, что я цитировал вас, посыл был Михаилу.

 
Alexey Viktorov:

Вот именно "сможет улучшить", но не сделать правильно. И не смотря на то, что я цитировал вас, посыл был Михаилу.

Посмотрел свою библиотеку. Вывод такой, на хедже при открытии позиции ее тикет всегда равен тикету ордера. Поэтому Result.order будет надежно пахать в таких ситуациях.

 
fxsaber:

Посмотрел свою библиотеку. Вывод такой, на хедже при открытии позиции ее тикет всегда равен тикету ордера. Поэтому Result.order будет надежно пахать в таких ситуациях.

Ну, о вкусах фломастеров спорить бесполезно. Видимо вам придётся менять своё мнение только тогда, когда вы сами нарвётесь на несовпадение. А произойти это может не скоро. За всё время я нарвался только один раз.

 
Alexey Viktorov:

Ну, о вкусах фломастеров спорить бесполезно. Видимо вам придётся менять своё мнение только тогда, когда вы сами нарвётесь на несовпадение. А произойти это может не скоро. За всё время я нарвался только один раз.

Таких ситуаций не бывает. Скорее всего, неправильно интерпретировали.

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