Как ввести новый ордер только если/когда первый был исполнен (исполнен)? [MQL5]

Я новичок в MQL5.

У меня есть советник, который сначала покупает одну акцию (скажем, PETR4), а затем другую (скажем, ABEV3).

Единственная проблема в том, что я могу заказать второй только тогда, когда первый будет выполнен (а не только размещен).

Я использовал MqlTradeResult.retcode, чтобы получить номер возврата, но это показывает только, был ли размещен заказ, и мне нужно знать, был ли заказ выполнен, чтобы продолжить вторую операцию.

Может кто-нибудь помочь мне? Спасибо


person Lucas    schedule 14.08.2017    source источник


Ответы (1)


Такая индикация должна быть закодирована в вызове PositionSelect():

Первый звонок
if ( PositionSelect( "PETR4" ) ) { ... /* further work will go here */}

При этом выбирается открытая позиция для дальнейшей работы с ней. Возвращает True, если функция успешно завершена. Возвращает False в случае неудачи.

Если для данного символа сообщается какая-либо активная позиция, дальнейшая работа будет продолжена внутри {...}-кодового блока.

Скрытая магия заключается в том, что для любого символа есть либо одна позиция, или вообще никакой >. Это делает остальную часть логики кристально чистой.

Совершение торговых операций приводит к открытию позиции, изменению ее объема и/или направления или ее исчезновению. Торговые операции проводятся на основании ордеров, отправляемых функцией OrderSend() в виде торговых запросов. По каждой финансовой ценной бумаге (символу) возможна только одна открытая позиция. Позиция имеет набор свойств, доступных для чтения функциями PositionGet...().
...
POSITION_TICKET
Уникальный номер, присваиваемый каждому вновь открытому < сильная>позиция. Обычно он совпадает с тикетом ордера, используемого для открытия позиции, за исключением случаев, когда тикет изменен в результате сервисных операций на сервере, например, при начислении свопов при переоткрытии позиции. Чтобы найти ордер, используемый для открытия позиции, примените свойство POSITION_IDENTIFIER.

Значение POSITION_TICKET соответствует MqlTradeRequest::position.

person user3666197    schedule 15.08.2017
comment
Эй, спасибо за ваш ответ. Я пробовал эту функцию, но в моем случае мне не нужно проверять, была ли сделка закрыта. Мне нужно что-то вроде этого: Ордер 100 PETR4 --- Подождите, пока этот ордер превратится в сделку (будет выполнен) --- Когда исполнится первый ордер Ордер 200 ABEV3. Метод, который вы показали, также получает заказы, которые исполняются (сделки). - person Lucas; 15.08.2017
comment
Кажется, вы упустили суть: ... OrderSend( reqStructPETR4, resStructPETR4 ); ... if ( PositionSelect( "PETR4" ) ) /* proves the fill-ed state */ { ... OrderSend( reqStructABEV3, resStructABEV3 ); ... } соответствует вашим намерениям. В не упомянутом варианте использования — если разрешены отдельные позиции ( ACCOUNT_MARGIN_MODE_RETAIL_HEDGING ), для одного символа может быть открыто несколько позиций. В этом случае PositionSelect() выберет позицию с наименьшим билетом. Это все равно приведет к PositionSelectByTicket() фабрике самоанализа, если потребуется сохранить логику открытия сделки ABEV3. - person user3666197; 15.08.2017