MT5 и скорость в боевом исполнении - страница 31

 
fxsaber:

Если запустить этот советник на счете, где нет текущих позиций и ордеров.

и затем закрыть руками открытую советником позицию, то появятся три открытые позиции на хедже (на неттинге позиция тройного объема).


Это правильное поведение? Скорее всего, неверно понимаю работу Терминала. Тогда прошу пояснить.

Для начала надо прочитать справку.

https://www.mql5.com/ru/docs/event_handlers/ontrade

Обратите внимание:

Обработчик OnTrade() вызывается после соответствующих вызовов OnTradeTransaction(). В общем случае нет точного соотношения по количеству вызовов OnTrade() и OnTradeTransaction(). Один вызов OnTrade() соответствует одному или нескольким вызовам OnTradeTransaction.

Проще говоря, обработчик OnTrade() может вызываться для каждой отдельной торговой транзакции. Следствием закрытия позиции может быть приход нескольких отдельных транзакций.

Это легко проверить - достаточно добавить Print() в OnTrade() вашего примера.

Плюс хочу обратить ваше внимание, по предыдущему вашему тесту, что вы зря рассчитываете узнать тикет ордера через OrderSendAsync().

Документация по MQL5: Обработка событий / OnTrade
Документация по MQL5: Обработка событий / OnTrade
  • www.mql5.com
//|                                               OnTrade_Sample.mq5 | //|                        Copyright 2018, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Expert initialization function                                   |...
 
Anton:

Плюс хочу обратить ваше внимание, по предыдущему вашему тесту, что вы зря рассчитываете узнать тикет ордера через OrderSendAsync().

Вроде, этого нигде нет там. Показаны только лаги HistorySelect в OnTrade.

 
fxsaber:

Вроде, этого нигде нет там. Показаны только лаги HistorySelect в OnTrade.

if (PositionSelectByTicket(Result.order)) // Если позиция открыта - закрываем.
 
Anton:

Для начала надо прочитать справку.

https://www.mql5.com/ru/docs/event_handlers/ontrade

Обратите внимание:

Обработчик OnTrade() вызывается после соответствующих вызовов OnTradeTransaction(). В общем случае нет точного соотношения по количеству вызовов OnTrade() и OnTradeTransaction(). Один вызов OnTrade() соответствует одному или нескольким вызовам OnTradeTransaction.

Проще говоря, обработчик OnTrade() может вызываться для каждой отдельной торговой транзакции. Следствием закрытия позиции может быть приход нескольких отдельных транзакций.

Это легко проверить - достаточно добавить Print() в OnTrade() вашего примера.

Делал, конечно, распечатку. Вопрос был не в количестве вызовов OnTrade, а в количестве открытых позиций.

После первого OnTrade выставляется маркет-ордер. На следующих OnTrade этот маркет-ордер по условию не должен позволять открывать еще ордера. Но и в последующих OnTrade получается нулевой сумма OrdersTotal() + PositionsTotal(). Правильно ли это?

 
Anton:

Спасибо, копи-пасты кусок не увидел.

 
fxsaber:

Вроде, этого нигде нет там. Показаны только лаги HistorySelect в OnTrade.

Кеширование выборок ордеров сегодня еще улучшили, через несколько часов будет бета.

 
Renat Fatkhullin:

Кеширование выборок ордеров сегодня еще улучшили, через несколько часов будет бета.

Имеется в виду HistorySelect? Просто авто-ссылка ведет не OrderSelect.

 
Nelson Wanyama:

Any idea why mt5 does not feature the 'Commissions' tab? They only pop up after a trade is closed.

Есть идеи, почему в mt5 нет вкладки «Комиссии»? Они появляются только после закрытия сделки.


                           

 
fxsaber:

Делал, конечно, распечатку. Вопрос был не в количестве вызовов OnTrade, а в количестве открытых позиций.

После первого OnTrade выставляется маркет-ордер. На следующих OnTrade этот маркет-ордер по условию не должен позволять открывать еще ордера. Но и в последующих OnTrade получается нулевой сумма OrdersTotal() + PositionsTotal(). Правильно ли это?

Все есть в справке: https://www.mql5.com/ru/docs/trading/ordersendasync

Успешное выполнение означает только факт отсылки, но не даёт никакой гарантии, что запрос дошел до торгового сервера и был принят для обработки.  Торговый сервер при обработке полученного запроса отправляет клиентскому терминалу ответное сообщение об изменении текущего состояния позиций, ордеров и сделок, которое приводит к генерации события Trade.
Таким образом OrdersTotal() несомненно может быть нулевым. Как и PositionsTotal(). Все зависит от транзакций, их типа и содержания.
Документация по MQL5: Торговые функции / OrderSendAsync
Документация по MQL5: Торговые функции / OrderSendAsync
  • www.mql5.com
"и режим вывода сообщений в журнал "Эксперты". По умолчанию выводятся все детали.\r\n" //| Expert initialization function                                   | //| Expert deinitialization function                                 | //| TradeTransaction function                                        |...
 
Anton:

Все есть в справке: https://www.mql5.com/ru/docs/trading/ordersendasync

Успешное выполнение означает только факт отсылки, но не даёт никакой гарантии, что запрос дошел до торгового сервера и был принят для обработки.
Таким образом OrdersTotal() несомненно может быть нулевым. Как и PositionsTotal().

https://www.mql5.com/ru/docs/constants/tradingconstants/orderproperties#enum_order_state

Каждый ордер имеет статус, описывающий его состояние. Для получения информации используйте функцию OrderGetInteger() или HistoryOrderGetInteger() с модификатором ORDER_STATE. Допустимые значения хранятся в перечислении ENUM_ORDER_STATE.

ENUM_ORDER_STATE

Идентификатор

Описание

ORDER_STATE_STARTED

Ордер проверен на корректность, но еще не принят брокером



Разве Started-состояние не возникает после успешного OrderSendAsync?