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

 
Valeriy Yastremskiy:

Правильно понимаю, что память терминала складывается и памяти программ терминала мкл, тикс и других. 

Нет. Просто CopyTicks хранит кеш запрошенных тиков в течение 10-ти секунд. Например, запросили 3 Гб памяти, Терминал будет эти 3 Гб хранить еще в кеше. Итого Терминал будет потреблять 6 Гб. Если Вы сделаете ArrayFree и запросите 3 Гб по другому символу, то Терминал будет потреблять уже 9Гб. И так далее.

 
Valeriy Yastremskiy:

Правильно понимаю, что память терминала складывается и памяти программ терминала мкл, тикс и других. 

Конечно.
 
Нужно сделать скрипт, который создает кастомный символ на основе тиковой истории нескольких символов по формуле
MqlTick Formula( const MqlTick &Symbol1_Tick
                 const MqlTick &Symbol2_Tick,
                 const MqlTick &Symbol3_Tick,
                 const MqlTick &Symbol4_Tick,
                 const MqlTick &Symbol5_Tick );

Казалось бы, для решения этой задачи с головой должно хватить 100 МБ ОЗУ даже для миллиарда тиков. Но в MT5 решить эту задачу через CopyTicks не получится.

Делается такой костыль:

  1. Вызывается CopyTicks по каждому символу отдельно (и обязательно с ожиданием освобождения кеша после каждого вызова), записывая историю тиков в свои соответствующие файлы через FileSave.
  2. Затем идет считывание тиков из этих файлов и вызывается Formula для них.

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


Самое огромное потребление ОЗУ будет в п.1. даже с условием ожидания освобождения кеша после каждого вызова. При этом п.2. будет выполняться бесплатно!

 

Идёт торговля сразу на 8 парах, на каждой по несколько советников. И хотя в общем по ресурсам выглядит неплохо, памяти занято не больше 25%, процессор больше 10% не грузится, заметны как лаги на глаз, типа новый график открывается по несколько секунд, так и в целом по торговле. Может есть какие best practices, хотя бы тезисно, как это всё можно упаковать, чтобы работало пошустрее? Знаю, что Вы виртуалите несколько советников в один. Какие тут подводные камни? Как сделана отсылка торговых приказов? На что обратить внимание?

P.S. Сам использую синхронизацию через Virtual и торговлю через MT4Orders, по 1 советнику на чарт.

 
fxsaber:

Взаимно. Возьмем Ваш VPS. На нем не могут работать скринеры рынка.

ЗЫ Хорошо бы избавить от зависаний, что в течение нескольких месяцев происходят. Запустите этот скрипт на машине с бесконечной ОЗУ. Например, я не могу закачать тики с 1-го июня всего по одному символу. Просто висит CopyTicks с нулевым потреблением ресурсов.

Снимите дамп терминала при "зависании". Посмотрим в чем причина.

 
traveller00:

Идёт торговля сразу на 8 парах, на каждой по несколько советников. И хотя в общем по ресурсам выглядит неплохо, памяти занято не больше 25%, процессор больше 10% не грузится, заметны как лаги на глаз, типа новый график открывается по несколько секунд, так и в целом по торговле. Может есть какие best practices, хотя бы тезисно, как это всё можно упаковать, чтобы работало пошустрее?

Использовать свежую MT4Orders (где работа с историей ускорена после создания этой ветки) и снепшотить текущее окружение: ордера и позиции. У меня летает все.

Знаю, что Вы виртуалите несколько советников в один. Какие тут подводные камни? Как сделана отсылка торговых приказов? На что обратить внимание?

Делаю все через синхронный OrderSend, но при этом отключаю проверки MT5.

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

Библиотеки: MT4Orders

fxsaber, 2020.09.29 08:45

Такой строкой

MT4ORDERS::OrderSend_MaxPause = 0; // Отключение проверки корректности работы MT5-OrderSend.

можно все это отключить. Может быть полезно в случае, если тормозит MT5-история торгов, т.к. MT4Orders проверяет корректность (и даже корректирует) MT5-OrderSend иногда через обращение к этой истории.

Не рекомендую этого делать.


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

После вызова любого OrderSend (внутри синхронизатора) обязательно делается снепшот и добрасываются свежие тики (во все Виртуалы), что пришли за время выполнения OrderSend. Т.е. после любой гипотетической паузы - делаем все свежим.

Свежие тики берутся только через CopyTicks каждый раз. Никакого SymbolInfoTick для проброса. При этом обязательно контролируется, если CopyTicks_LastTick.time_msc < SymbolInfoTick.time_msc (бывает часто, даже если вызовы один за другим (в любой последовательности)), то синхронизатор не включается. Иначе можно напороться, что в реале лимитник исполнился, а в виртуале - нет. И будут проблемы при синхронизации.

Снепшоты делаю через VIRTUAL::Snapshot. Помимо очевидной скорости это еще позволяет отделить свой символ от остальных - попадает туда только свой символ. Это дает еще доп. скорость. Плюс в снепшоте отключена не только история,

#define VIRTUAL_SNAPSHOT_WITHOUT_HISTORY // Отказ от снепшота истории для повышения производительности

 но и поля (помечены ниже), заполнение которых требует обращения к истории.

#define MACROS(A) this.##A = ::Order##A();

  bool ORDERS::Copy( const bool WithoutHistory = false )
  {
    MACROS(CloseTimeMsc)

    if (WithoutHistory && !this.CloseTimeMsc) // Для исторических ордеров оставляем все без изменений.
    {
      const string Str = NULL;
      this.comment = Str;

      this.Commission = 0;
      this.OpenPriceRequest = this.OpenPrice;
    }
    else // В MT4Orders требуется обращение к истории.
    {
      const string Str = ::OrderComment();
      this.comment = Str;

      MACROS(Commission)
      MACROS(OpenPriceRequest)
    }

Делал раньше проверки еще на то, чтобы LastDeal.time_msc не был больше LastTick.time_msc. В случаев невыполнение этого условия отказывался от синхронизации по понятным причинам. Но такая проверка выжирает очень сильно ресурсы (работает с историей), поэтому отказался.


Торговая On-функция - OnTick.


Наверное, основное перечислил.

 

Синхронный, я так понимаю, не только OrderSend, но и все торговые приказы, включая модификацию, удаление и тд?


SymbolInfoTick не пробрасывается, потому что порядок тиков может испортить? А CopyTicks идут точно все в нужном порядке.


Получается, что SymbolInfoTick нужен только для проверки времени и всё? Вся торговля и тд идут только по CopyTicks?


Есть ли смысл несколько советников пытаться упаковать в 1 на 1 чарте? Ничего невозможного, но пытаюсь понять, стоит ли возиться и переписывать или профит будет минимальный?

 
traveller00:

Есть ли смысл несколько советников пытаться упаковать в 1 на 1 чарте? Ничего невозможного, но пытаюсь понять, стоит ли возиться и переписывать или профит будет минимальный?

А откуда может быть профит? Все будут ждать при торговой операции любого из них.

Ну и просто меньше распараллеливания.

Разве что один кэш ордеров можно держать на всех, но выгода сомнительная..

 
Anton:

Снимите дамп терминала при "зависании". Посмотрим в чем причина.

Вам мало кода, воспроизводящего проблему? Или у вас не воспроизводится?

 
traveller00:

Синхронный, я так понимаю, не только OrderSend, но и все торговые приказы, включая модификацию, удаление и тд?

Имел в виду MT5-OrderSend.

SymbolInfoTick не пробрасывается, потому что порядок тиков может испортить? А CopyTicks идут точно все в нужном порядке.

Потому что дыры будут.

Получается, что SymbolInfoTick нужен только для проверки времени и всё?

Да.

Вся торговля и тд идут только по CopyTicks?

Только.

Есть ли смысл несколько советников пытаться упаковать в 1 на 1 чарте? Ничего невозможного, но пытаюсь понять, стоит ли возиться и переписывать или профит будет минимальный?

Для меня это огромное подспорье.


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


Получается, что Оптимизация занимает 20 минут. Просмотр проходов - 3 минуты. Их фильтр - 3 минуты. Запуск в боевую работу - секунды. Робот компилировать не нужно. Следить за версиями и чартами - аналогично.

При запуске вижу Репорт каждого сета. В любой момент могу видеть состояние соответствующего виртуала и его тезки с реала , а по горячей клавише подробный HTML-Report и для виртуала и для реала. Как одиночного сета, так и всего портфеля.


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

Файлы:
clip0184.gif  64 kb