Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Форум о трейдинге, автоматизированных торговых системах и тестировании торговых стратегий
Библиотеки: MT4Orders
fxsaber, 2021.06.02 10:09
По моей просьбе MetaQutoes полностью локализовала последнее обновление библиотеки на английский язык. Последняя сборка библиотеки теперь доступна на английской странице с комментариями в исходном коде, переведенными на английский язык.
Это отличается от предыдущей версии, которая была доступна на англоязычной странице.
Я рекомендую использовать последнюю версию вместе с механизмом синхронизации. Тогда все проблемы, которые не может решить ни одна торговая библиотека, будут незаметны.
Чтобы механизм заработал, необходимо скачать эту библиотеку. Все сложные и эффективные проверки корректности работы торговой среды будут выполняться автоматически, не отвлекая пользователя при написании торговой логики.
MT4Orders (+ByPass) работает только с HistorySelect(0, INT_MAX), поэтому не создает текущих проблем с добавлением только что удаленных отложек в конец таблицы истории (+синхронизация).
Сломали! Не рекомендую обновлять MT5. Кто понимает, помогите объяснить, что прежнее поведение MT5 было правильным. Сейчас - нет.
Сломали! Не рекомендую обновлять MT5. Кто понимает, помогите объяснить, что прежнее поведение MT5 было правильным. Сейчас - нет.
Печально.
Если не вернут как было, то можно сделать костыль. Я навскидку набросал код, как можно отследить вставку ордера в историю и обновить ее в классе TradesID только на "сдвинутом" периоде + не более 100 позиций истории, т.е. малой кровью.
НЕ тестировал код, плюс он конечно, неоптимален - просто демонстрация идеи. (желтым - что изменено к вашему оригиналу)
Отследить удаление/изменения ордеров намного сложнее, но это и ваша библа не решала.
Конечно, для подобной корректировки ByPASS и MT4HISTORY нужен алгоритм понавороченнее, но ничего сложного, кажется нет (пока не изучил их).
Также можно отслеживать транзакции TRADE_TRANSACTION_HISTORY_UPDATE и TRADE_TRANSACTION_HISTORY_DELETE, как вы писали:
https://www.mql5.com/ru/forum/366029/page2#comment_22442705
Если они дадут номер тикета, и ордера в истории отсортированы по тикету, то положение ордера в истории легко отследить через массив OrderTickets.
P.S. на крайняк, можно еще HashMap добавить...
Печально.
Если не вернут как было, то можно сделать костыль. Я навскидку набросал код, как можно отследить вставку ордера в историю и обновить ее в классе TradesID только на "сдвинутом" периоде + не более 100 позиций истории, т.е. малой кровью.
НЕ тестировал код, плюс он конечно, неоптимален - просто демонстрация идеи. (желтым - что изменено к вашему оригиналу)
Если правильно понял идею, Вы ищите сотню, в которой произошел сдвиг. Но не понял, как находится после этого в этой сотне сам новый Ticket. Особенно, если их несколько и они лежат в разных сотнях.
Отследить удаление/изменения ордеров намного сложнее, но это и ваша библа не решала.
Не понял. Что именно не отслеживается? Предлагаю пока остановиться на b2958.
Если идет речь про правку истории задним числом - это не стоит того. Не занудства ради все же создаются решения, а для торговли.
Конечно, для подобной корректировки ByPASS и MT4HISTORY нужен алгоритм понавороченнее, но ничего сложного, кажется нет (пока не изучил их).
Проблема в том, что чем больше вызывается штатных функций на каждом проходе, тем выше вероятность лага. Советник начинает подвешиваться. Несколько советников - еще хуже. Когда же несколько терминалов - совсем плохо. Тормозит даже приход OnTradeTransaction - например, OrderSend начинает выдавать время в несколько раз больше пинга. Помимо того, что костыль предполагает дикую по скурпулезности отладку, так и еще он будет создавать лаги. Представьте только, что во время перебора история обновилась и т.д. Там огромное количество багов будет вылезать.
Ведь главное, что все идеально работало. Просто поломали на ровном месте и никак не комментируют.
ЗЫ Для меня загадка, почему почти никто не понимает, о чем идет речь.
ЗЫ Для меня загадка, почему почти никто не понимает, о чем идет речь.
Потому что никто не пытался реализовать работу с ордерами в МТ5 а) легко, б) правильно и в) быстро. В том числе, я.
Если правильно понял идею, Вы ищите сотню, в которой произошел сдвиг. Но не понял, как находится после этого в этой сотне сам новый Ticket. Особенно, если их несколько и они лежат в разных сотнях.
Если произшли только вставки без удаления, то цикл
ищет начало самой ранней сотни, в которой произошли вставки. Сам тикет искать не надо - надо просто заново пройти все ордера, начиная с этой сотни и следущие (более новые), и добавить их в хэшмэп. Это делается как обычно в цикле while(this.LastTotalOrders < Total). Почти всегда это будет 1-2 последних сотни.
Может быть лучше уменьшить шаг - не по 100, а по 40 или по 20.
На случай, если во время for история изменится - что-то вставится ДО найденной сотни, то можно вложить в цикл:
Но это будет очень редко.
Если произшли только вставки без удаления, то цикл
ищет начало самой ранней сотни, в которой произошли вставки. Сам тикет искать не надо - надо просто заново пройти все ордера, начиная с этой сотни и следущие (более новые), и добавить их в хэшмэп. Это делается как обычно в цикле while(this.LastTotalOrders < Total). Почти всегда это будет 1-2 последних сотни.
Т.е. использовать, что повторное добавление в хэшмэп одного и того же тикета не поменяет хэшмэп?
У меня ордера попадали и в восьмую сотню. При активной торговле это рядовое явление с новыми билдами. В таком случае надо хэшмэпить несколько сотен ордеров.
Т.е. использовать, что повторное добавление в хэшмэп одного и того же тикета не поменяет хэшмэп?
Да, только сейчас заметил - если добавить тикет OrdersID.Add(PositionID, Ticket) повторно, то в OrdersID.ValuesID[] этот тикет задвоится. Т.е. хэшмэп будет разбухать.
Нужно как-то делать проверку. Или использвать для VALUESID не структуру с массивом, а HashSet. Или что-то аналогичное.