Новая версия платформы MetaTrader 5 build 3540: 2FA/TOTP аутентификация и улучшенный Обзор рынка в веб-терминале - страница 2

 
fxsaber #:

Поясню проблему работы с историей на очень простом примере.

  1. Отложенный ордер только что исполнился и появилась соответствующая позиция.
  2. Исполненный отложенный ордер попал в историю торговли советника - HistorySelect(0, INT_MAX). Несмотря на то, что он только что исполнился, он попадает не в конец (а-ля Тестер) этой запрошенной истории, а в середину.

И таких ситуаций несколько, когда идет не дозапись в конец HistorySelect(0, INT_MAX), а вклинивание между предыдущими записями торговой истории. Это порождает серьезные сложности в нивелировании асинхронных особенностей Терминала, тем самым создавая высокую вероятность получения удвоенных позиций и других неприятностей при активной торговле.

Я правильно Вас понял - при запросе истории сделок в диапазоне 10:10-10:55 сейчас возможно получить вот такой результат?

Индекс

0

1

2

3

4

5

6

7

8

Время сделки

10:20

10:25

10:28

10:30

10:35

10:38

10:52

10:45

10:50

Добавлено:

Или такая картина возможна только по истории ордеров?

 
Andrey Miguzov #:

Или такая картина возможна только по истории ордеров?

Только с ордерами. Казалось бы, что на историю ордеров можно наплевать, ведь она никак не должна участвовать в логике советника. Однако, только через нее возможно понять текущее состояние правильности торгового окружения. Иначе будут задвоения позиций и другие приколы.

 
fxsaber #:

Только с ордерами. Казалось бы, что на историю ордеров можно наплевать, ведь она никак не должна участвовать в логике советника. Однако, только через нее возможно понять текущее состояние правильности торгового окружения. Иначе будут задвоения позиций и другие приколы.

Нужна сортировка по времени, в любом случае. Без неё любой цикл по ордерам даст такую кашу, что даже представлять не хочется.

У себя использую (пока) только историю сделок, собственно поэтому и спросил. Но стратегия простая, если усложнять - без истории ордеров никак.

Надеюсь, разработчики услышат Ваши доводы.
 
Andrey Miguzov #:
Нужна сортировка по времени, в любом случае. Без неё любой цикл по ордерам даст такую кашу, что даже представлять не хочется.

У себя использую (пока) только историю сделок, собственно поэтому и спросил. Но стратегия простая, если усложнять - без истории ордеров никак.

Надеюсь, разработчики услышат Ваши доводы.

+

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


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

 
Alexandr Gavrilin #:

+

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


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

Историю сейчас сортируют по тикетам, что правильно. И здесь ничего менять не надо.

А вот ИЗМЕНЕНИЯ истории, которые получает советник ВО ВРЕМЯ работы через HistorySelect(0, INT_MAX) , нужно дозаписывать в конец ТОЛЬКО для советника, пока он работает. Это касается исторического кеша советника, который когда-то специально делали ради серьезного ускорения.


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

 
Alexandr Gavrilin #:

+

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


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

По моему, в идеале получить историю в базу данных SQLite… И делай с ней что захочешь и сможешь.

 
fxsaber #:

Историю сейчас сортируют по тикетам, что правильно. И здесь ничего менять не надо.

А вот ИЗМЕНЕНИЯ истории, которые получает советник ВО ВРЕМЯ работы через HistorySelect(0, INT_MAX) , нужно дозаписывать в конец ТОЛЬКО для советника, пока он работает. Это касается исторического кеша советника, который когда-то специально делали ради серьезного ускорения.


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

Почему для изменений не запрашивать историю не от печки, а с последнего опроса? Типа HistorySelect(lastRequestTime, INT_MAX)?

 
Stanislav Korotky #:

Почему для изменений не запрашивать историю не от печки, а с последнего опроса? Типа HistorySelect(lastRequestTime, INT_MAX)?

Это проходили. Формирование такого запроса происходит очень долго. Поэтому разработчики придумали исторические кеши MQL-программ, которые мгновенно обновляются.

Была ветка, где шла активная оптимизация этого решения. Очень сильно подняли скорости.


Ренат специально рекомендовал использовать только HistorySelect(0, INT_MAX), чтобы не перестраивать внутренний исторический кеш советника. Происходила дозапись в конец всех новых исторических данных, скорость была великолепной.

 
fxsaber #:

Ренат специально рекомендовал использовать только HistorySelect(0, INT_MAX), чтобы не перестраивать внутренний исторический кеш советника. Происходила дозапись в конец всех новых исторических данных, скорость была великолепной.

Благодаря этой скорости получилось обойти все рассинхроны. Один из простых:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Непонятная ситуация при срабатывании отложенных ордеров.

fxsaber, 2018.11.26 13:37

Еще бывает такая ситуация:

  1. Выставили открывающий позицию маркет-ордер и OrdersTotal увеличился на единицу.
  2. Он исполнился и OrdersTotal уменьшился на единицу, но при этом PositionsTotal не увеличился на единицу. Т.е. существует позиция, но Терминал о ней не знает.

Например, нет ни позиций, ни ордеров - PositionsTotal = 0, OrdersTotal = 0.

Выставляете маркет-ордер. При этом PositionsTotal = 0, OrdersTotal = 1.

Маркет-ордер исполнился - OrdersTotal = 0. Но PositionsTotal = 0!

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


Если бы не было рассинхронов в MT5 (в MT4 их нет, например), то было бы плевать на скорость работы HistorySelect и внутренний алгоритм формирования данных этой функцией. А так сейчас огромные торговые риски задвоения позиций. Лаконичные коды, воспроизводящие такие рассинхроны, многократно приводил.


Просто я, действительно, торгую и делаю это активно. Поэтому в теме. И бьюсь за торговый функционал, понимая, почему иногда на форуме возникают вопросы у внимательных алготрейдеров, что видят задвоения позиций и другие приколы.

 
Тут я поддержу fxsaber. Неудачные места реализации в MT приходится подпирать костылями. Уже почти год основы, на которые опирались костыли, были сломаны, хотя эти основы не должно быть сложно исправить. И вынужденно приходилось использовать для торговли старую версию MT, а теперь и она запрещена. Даже костыльные варианты уже не работают. Оставьте хоть какую-то лазейку-то. Спасибо.
Причина обращения: