Несмотря на то, что торговый результат скрипта идентичен на обеих платформах, OrderSelect работает по-разному. Отсюда разные логи.
Скрипт специально высосан, и не могу рекомендовать такой стиль написания торговой логики, т.к. он чреват на каждой из платформ трудноуловимыми логическими ошибками. И подобный код перестает быть на 100% идентичным по выполнению.
Поэтому править библиотеку, чтобы такие редкие кривые MT4-коды выполнялись в MT5 абсолютно идеально, как это происходит с нормальным кодом, видится сейчас нецелесообразным.
Если ошибаюсь на счет кривости и редкости таких торговых MT4-конструкций, прошу внести ясность.
Если есть сомнения, что MT5-замедление вызвано использованием сторонней библиотеки, желающие могут переписать простую MT4-логику данного советника на MQL5 на свой лад и проверить гипотезу.
Скрипт, показывающий особенность реализации OrderSelect в режиме SELECT_BY_POS+MODE_TRADES
Скрипт специально высосан, и не могу рекомендовать такой стиль написания торговой логики
При другом крайне не рекомендуемом стиле написания торговой логики можно нарваться на еще одну особенность OrderSelect, но уже в режиме SELECT_BY_TICKET+MODE_HISTORY
#include <MT4Orders.mqh>
#define Ask (::SymbolInfoDouble(_Symbol, SYMBOL_ASK))
voidOnTick()
{
staticbool FirstRun = true;
if (FirstRun && OrderSelect(OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0), SELECT_BY_TICKET) &&
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0))
{
Print(OrderTicket()); // 2 - ОТКРЫТАЯ позиция была с таким тикетомPrint(OrderSelect(OrderTicket(), SELECT_BY_TICKET, MODE_HISTORY)); // false, потому что тикет ЗАКРЫТОЙ позиции равен тикету закрывающей сделки.Print(OrderSelect(OrderTicket() + 1, SELECT_BY_TICKET, MODE_HISTORY)); // true, по причине выше.
FirstRun = false;
}
}
Это советник для тестера. В комментариях причина такого поведения. И это правильно из-за
Тикет открытой позиции (как правило) равен тикету открывающего ордера (не сделки). (термины MT5)
При этом если позиция закрывается частично, то тикеты закрытых соответствующих позиций делать равными тикету открытой позиции никак нельзя, чтобы избежать неоднозначности. (термины MT5)
Т.е. сам MT5 сделан так "криво", что другое поведение MT4Orders сложно придумать. Конечно, если сделать сначала SELECT_BY_POS по истории, записав все тикеты, то по ним SELECT_BY_TICKET будет работать без проблем.
В общем, если торговая MT4-логика написана "плохо", то могут быть непривычные для MT4-понимания расхождения результатов MT5+MT4Orders и MT4. Если же придерживаться "правильного" MT4-стиля написания, то никаких проблем в библиотеке не выявлено.
При другом крайне не рекомендуемом стиле написания торговой логики можно нарваться на еще одну особенность OrderSelect, но уже в режиме SELECT_BY_TICKET+MODE_HISTORY
В общем, если торговая MT4-логика написана "плохо", то могут быть непривычные для MT4-понимания расхождения результатов MT5+MT4Orders и MT4. Если же придерживаться "правильного" MT4-стиля написания, то никаких проблем в библиотеке не выявлено.
Библиотека шикарная, большое спасибо :) После добавления синхронизации истории вообще незаменима. Работает быстро даже для hft стратегий
// Список изменений:// 14.06.2017:// Add: Включена изначально заложенная реализация определения SL/TP закрытых позиций (закрытых через OrderClose).// Add: MagicNumber теперь имеет тип long - 8 байт (раньше был int - 4 байта).// Add: Если в OrderSend, OrderClose или OrderModify цветовой входной параметр (самый последний) задать равным INT_MAX, то будет сформирован// соответствующий торговый MT5-запрос (MT4ORDERS::LastTradeRequest), но отправлен он НЕ будет. Вместо этого будет проведена его MT5-проверка,// результат которой станет доступен в MT4ORDERS::LastTradeCheckResult.// В случае успешной проверки OrderModify и OrderClose вернут true, иначе - false.// OrderSend вернет 0 в случае успеха, иначе - -1.//// Если же соответствующий цветовой входной параметр задать раным INT_MIN, то ТОЛЬКО в случае успешной MT5-проверки сформированного// торгового запроса(как в случае с INT_MAX) он БУДЕТ отправлен.// Add: Добавлены асинхронные аналоги MQL4-торговым функциям: OrderSendAsync, OrderModifyAsync, OrderCloseAsync, OrderDeleteAsync.// Возвращают соответствующий Result.request_id в случае удачи, иначе - 0.
INT_MIN-режим позволяет полностью избавиться от засорения логов тестера - особенно критично при оптимизации, т.к. из-за ошибочной торговой логики обильные сообщения могут в разы уменьшать производительность оптимизации и, соответственно, увеличивать не только временные, но и денежные издержки (Облако).
INT_MAX-режим целесообразно использовать для быстрого формирования максимально корректного торгового MT5-торгового запроса, чтобы использовать его, как базу для будущих MT5-приказов (именно так реализованы Async-функции - см. ниже).
Определение SL/TP закрытых позиций реализовано так
Торговые сигналы для MetaTrader 5 с автоматическим исполнением на вашем счете
LCHI2017
MetaTrader 5
Бесплатно
Торгует советник на биржевых инструментах.
Скрипт, показывающий особенность реализации OrderSelect в режиме SELECT_BY_POS+MODE_TRADES
MT4
MT5
Несмотря на то, что торговый результат скрипта идентичен на обеих платформах, OrderSelect работает по-разному. Отсюда разные логи.
Скрипт специально высосан, и не могу рекомендовать такой стиль написания торговой логики, т.к. он чреват на каждой из платформ трудноуловимыми логическими ошибками. И подобный код перестает быть на 100% идентичным по выполнению.
Поэтому править библиотеку, чтобы такие редкие кривые MT4-коды выполнялись в MT5 абсолютно идеально, как это происходит с нормальным кодом, видится сейчас нецелесообразным.
Если ошибаюсь на счет кривости и редкости таких торговых MT4-конструкций, прошу внести ясность.
Библиотека идеально выдержала простой тест корректности.
Как-то даже забавно получается с замедлением.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
MT4-Tester VS MT5-Tester
fxsaber, 2017.05.08 01:11
Если есть сомнения, что MT5-замедление вызвано использованием сторонней библиотеки, желающие могут переписать простую MT4-логику данного советника на MQL5 на свой лад и проверить гипотезу.Скрипт, показывающий особенность реализации OrderSelect в режиме SELECT_BY_POS+MODE_TRADES
Скрипт специально высосан, и не могу рекомендовать такой стиль написания торговой логики
При другом крайне не рекомендуемом стиле написания торговой логики можно нарваться на еще одну особенность OrderSelect, но уже в режиме SELECT_BY_TICKET+MODE_HISTORY
Это советник для тестера. В комментариях причина такого поведения. И это правильно из-за
Т.е. сам MT5 сделан так "криво", что другое поведение MT4Orders сложно придумать. Конечно, если сделать сначала SELECT_BY_POS по истории, записав все тикеты, то по ним SELECT_BY_TICKET будет работать без проблем.
В общем, если торговая MT4-логика написана "плохо", то могут быть непривычные для MT4-понимания расхождения результатов MT5+MT4Orders и MT4. Если же придерживаться "правильного" MT4-стиля написания, то никаких проблем в библиотеке не выявлено.
При другом крайне не рекомендуемом стиле написания торговой логики можно нарваться на еще одну особенность OrderSelect, но уже в режиме SELECT_BY_TICKET+MODE_HISTORY
В общем, если торговая MT4-логика написана "плохо", то могут быть непривычные для MT4-понимания расхождения результатов MT5+MT4Orders и MT4. Если же придерживаться "правильного" MT4-стиля написания, то никаких проблем в библиотеке не выявлено.
Библиотека шикарная, большое спасибо :) После добавления синхронизации истории вообще незаменима. Работает быстро даже для hft стратегий
Я бы добавил ее в стандартную поставку мт5
Обновление
INT_MIN-режим позволяет полностью избавиться от засорения логов тестера - особенно критично при оптимизации, т.к. из-за ошибочной торговой логики обильные сообщения могут в разы уменьшать производительность оптимизации и, соответственно, увеличивать не только временные, но и денежные издержки (Облако).
Также это удобно при анализе гипотетических ошибок тестера.
INT_MAX-режим целесообразно использовать для быстрого формирования максимально корректного торгового MT5-торгового запроса, чтобы использовать его, как базу для будущих MT5-приказов (именно так реализованы Async-функции - см. ниже).
Определение SL/TP закрытых позиций реализовано так
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Ошибки, баги, вопросы
fxsaber, 2017.05.18 20:31
При акцептировании TP/SL прошу формировать торговым сервером соответствущий ордер закрытия вместе с заполненными полями TP/SL.
Такое решение позволит, наконец, определять TP/SL закрытых позиций.
Возможно, когда-нибудь такой функционал сделают штатным для MT5.
Пример использования асинхронных MQL4-функций
Результат