Ошибки, баги, вопросы - страница 2219

 
fxsaber:


Результат на ForexTimeFXTM-Demo01


Скрипт открывает и закрывает позиции до тех пор, пока не обнаружит "фантомный ордер" - нет ни среди текущих, ни в истории. Считать это багом или фишкой платформы?


ЗЫ Скрипт написан так, что может открыться несколько позиций из-за данного нюанса. Но это не мешает получению "фантомного ордера".

Не хочу показаться занудным, но вот такие выражения:

(ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE))

очень затрудняют понимание кода.  Возможно вы помните наизусть все числовые значения данного enum, и в каком порядке они идут, но другие люди могут и не знать этих внутренностей.  Не стоит так обращаться с enum.  Краткость конечно сестра таланта, но только если не в ущерб качеству.

И касательно обсуждаемого вопроса,  для открываемой позиции ведь должен проверяться order.deal, а не result.order.  Соответственно и искать её нужно среди позиций, а не ордеров.  Разве не так?

 
Alexey Navoykov:

Краткость конечно сестра таланта, но только если не в ущерб качеству.

Вроде, привычная на MQL операция.

И касательно обсуждаемого вопроса,  для открываемой позиции ведь должен проверяться order.deal, а не result.order.  Соответственно и искать её нужно среди позиций, а не ордеров.  Разве не так?

Первоначальный ордер, что отправляется, сразу после OrderSend может нигде не оказаться. Позиция - это много позже ордера.


ЗЫ В коде специально оставил в комменте самый понимаемый язык торгового алгоритма - MQL4.

 
fxsaber:

Первоначальный ордер, что отправляется, сразу после OrderSend может нигде не оказаться. Позиция - это много позже ордера.

Да в принципе это не суть.  Ведь согласно документации, OrderSend и не обязана получать какие-либо тикеты:

При отправке рыночного ордера (MqlTradeRequest.action=TRADE_ACTION_DEAL) успешный результат функции OrderSend() не означает, что ордер был выполнен (исполнены соответствующие сделки): true в этом случае означает только то, что ордер был успешно размещен в торговой системе для дальнейшего выполнения. Торговый сервер может в возвращаемой структуре результата result заполнить значения полей dealили order, если эти данные будут ему известны в момент формирования ответа на вызов OrderSend(). В общем случае событие или события исполнения сделок, соответствующих ордеру, могут произойти уже после того, как будет отправлен ответ на вызов OrderSend(). Поэтому для любого типа торгового запроса при получении результата выполнения OrderSend() необходимо в первую очередь проверять код возврата торгового сервера retcode и код ответа внешней торговой системы retcode_external (при необходимости), которые доступны в возвращаемой структуре результата result.

Так что без OnTradeTransaction не обойтись в любом случае.

Т.е. получается, что гарантированно синхронных торговых операций в MQL5 нет.

 
Alexey Navoykov:

Да в принципе это не суть.  Ведь согласно документации, OrderSend и не обязана получать какие-либо тикеты:

Так что OnTradeTransaction нужно проверять в любом случае.

Не нужно проверять в обязательном порядке. Это только по желанию.

Ненулевой Result.order после выполнения синхронного OrderSend говорит всегда о том, что получен ответ от торгового сервера с регистрацией на нем ордера. Этот тикет идет именно от сервера. И в случае успеха OrderSend этот тикет всегда получен.

Облом же, похоже, случается не из-за OrderSend, а в момент акцепта ордера в сделку. Хотя на такие случаи есть ORDER_STATE_REQUEST_ADD. В общем, ждем ответа от MQ. По-моему, это баг, когда ордер есть на торговом сервере, а после синхронной OrderSend на Терминале об этом ни духом.

 
fxsaber:

В общем, ждем ответа от MQ. По-моему, это баг, когда ордер есть на торговом сервере, а после синхронной OrderSend на Терминале об этом ни духом.

Я скажу больше, надо просить разработчиков обеспечить полную синхронность OrderSend, как на терминале, так и на сервере.  В противном случае, если синхронность исполнения не гарантированна, то зачем нужна эта функция?  Для этих целей уже есть OrderSendAsync.

 
Dmitriy:

Здравствуйте. Сегодня обновился до версии 1860 и при оптимизации советника столкнулся вот с такой проблемой:

задержка между проходами составляет 1 минуту! Подскажите пожалуйста, в чем может быть дело?

p.s. до обновления все работало как часики.

Часом функцию Bars не используете?
Если да, то см. вот это.

 

Просто вопрос:

Может есть смысл сделать общие файлы? Сейчас пишу коды универсальные, без правок работают и в мт 4 и в мт 5, единственное что напрягает это постоянное переименовывание mq4 и mq5 пришла мысль в связи с проектами может сделать общее расширение типа mq ?

И просто можно код копировать из терминала в терминал без правок расширений... 

 
Vladimir Pastushak:

Просто вопрос:

Может есть смысл сделать общие файлы? Сейчас пишу коды универсальные, без правок работают и в мт 4 и в мт 5, единственное что напрягает это постоянное переименовывание mq4 и mq5 пришла мысль в связи с проектами может сделать общее расширение типа mq ?

И просто можно код копировать из терминала в терминал без правок расширений... 

А кто запрещает эти коды прописать в файлы mqh и подключать их с помощью (#include). Что я и делаю уже довольно давно.

 
Konstantin Nikitin:

А кто запрещает эти коды прописать в файлы mqh и подключать их с помощью (#include). Что я и делаю уже довольно давно.

вы подключаете, я меняю расширения ...  соседи...

 
Alexey Navoykov:

Я скажу больше, надо просить разработчиков обеспечить полную синхронность OrderSend, как на терминале, так и на сервере.  В противном случае, если синхронность исполнения не гарантированна, то зачем нужна эта функция?  Для этих целей уже есть OrderSendAsync.

Уточню. Синхронность выставления ОРДЕРА в торговую систему платформы и сам Терминал.