Контроль процессов оптимизации в реальном режиме времени и передача массивных данных от агентов в MetaTrader 5

 

В 619 билде MetaTrader 5 были включены давно анонсированные функции по контролю за процессом оптимизации торговых стратегий.

В первую очередь речь идет о трех новых функциях событий торгового терминала:

  • OnTesterInit

    Функция предназначена для инициализации эксперта перед началом оптимизации для последующей обработки результатов оптимизации.

    OnTesterInit() является обработчиком события TesterInit, которое автоматически генерируется перед началом оптимизации эксперта в тестере стратегий. Эксперт, имеющий обработчик OnTesterDeInit() или OnTesterPass(), при запуске оптимизации автоматически загружается на отдельном графике терминала с указанными в тестере символом и периодом, и получает событие TesterInit.

  • OnTesterPass

    Функция OnTesterPass() является обработчиком события TesterPass, которое автоматически генерируется при поступлении фрейма во время оптимизации эксперта в тестере стратегий.

    Эксперт с обработчиком OnTesterPass() автоматически загружается на отдельном графике терминала с указанными для тестирования символом/периодом и получает во время оптимизации события TesterPass при получении фрейма. Функция предназначена для динамической обработки результатов оптимизации прямо "на лету", не дожидаясь её окончания. Добавление фреймов производится функцией FrameAdd(), которую можно вызывать по окончании одиночного прохода в обработчике OnTester().


  • OnTesterDeinit

    Функция OnTesterDeinit() является обработчиком события TesterDeinit, которое автоматически генерируется по окончании оптимизации эксперта в тестере стратегий.

    Эксперт с обработчиком TesterDeinit() автоматически загружается на график при запуске оптимизации и получает событие TesterDeinit после её завершения. Функция предназначена для финальной обработки всех результатов оптимизации.


Что это дает разработчикам?

Практически полный контроль над процессами оптимизации, когда в дело вступают самые мощные функции:

  • FrameAdd

    На стороне агента добавляет фрейм с любыми типами и объемами данными для передачи их на управляющий терминал, где эти данные можно вычитать с помощью функции FrameNext(). Каждый фрейм имеет встроенные идентификаторы string name и long id, которые удобно использовать для разметки передаваемых данных.

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

  • FrameFilter

    Устанавливает фильтр чтения фреймов по полям name/id и переводит указатель на начало. Фильтры позволяют легко фильтровать полученные данные от агентов, упрощая тем самым доступ к данным.

  • FrameFirst

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

  • FrameNext

    Читает текущий фрейм и перемещает указатель на следующий. Может вычитывать как чистые фреймы с одиночным результатом в виде double, так и массивы данных. Массивы автоматически ресайзятся под объем полученных данных.

  • FrameInputs

    По номеру прохода извлекаются
    input-параметры, на которых сформирован фрейм.

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

Исходный код приложен.




Линк на видео в YouTube: http://youtu.be/lG0cWCNMGqA
Файлы:
 
Существенный шаг вперед к облачным мат. расчетам.
 
Renat:

В 619 билде MetaTrader 5 были включены давно анонсированные функции по контролю за процессом оптимизации торговых стратегий.

...

Спасибо за пример.

Это отличная возможность!

 

Как забрать результат с агента понятно (почти).

А как передать индивидуальный для каждого агента набор оптимизируемых параметров в облако не используя при этом input-параметры эксперта? Возможно ли это?

То есть сейчас формированием оптимизируемых параметров для каждого агента занимается штатный механизм оптимизации (генетический или полным перебором). А хотелось бы самостоятельно "подсовывать" для каждого агента индивидуальные для него параметры.

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


 
Переменные параметры только через штатный механизм.
 
Renat:
Переменные параметры только через штатный механизм.
Ок, этим можно обойтись (ограничившись одним единственным целочисленным параметром как в приведённом Вами примере). А данные для обработки (индивидуальные для каждого агента) как передать?
 
Индивидуальных данных пока нет, приемлемого решения еще не нашли.
 
Renat:
Индивидуальных данных пока нет, приемлемого решения еще не нашли.

У меня есть мысли по реализации внешнего управления оптимизацией - так и хотел сделать до анонса нового функционала. Но будет работать только на локальных агентах.

Суть в следующем. На чарт терминала навешивается управляющий скрипт, который методами Memory Mapping подготавливает популяцию. Каждая особь имеет свой флаг доступности.

Каждый эксперт на локальных агентах проверят флаг, если флаг открыт, то читает оптимизируемые параметры и закрывает флаг, если флаг закрыт - смотрит следующую особь и проверят флаг. По завершении прогона по истории записывает результат ФФ в OnTester() в значение соответствующей особи популяции.

Управляющий скрипт следит, за флагами. Если все ФФ получены - производит скрещивание и создание новой популяции.

Так может быть организовано внешнее управление штатным оптимизатором. Причем штатный оптимизатор перебирает только один целочисленный Input-параметр эксперта.

Может быть подобный механизм возможно реализовать штатными средствами? - то есть нужен внешний двумерный массив, из которого штатный тестер будет брать индивидуальные данные для каждого агента облака.

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


Можно конечно вшить данные в сам эксперт и таким образом агенты облака получат данные для обработки, но какой смысл обрабатывать параллельно одни и те же данные? 

 
Это не рабочий вариант, а немасштабируемый костыль.

Нужно красивое решение.
 
Renat:
Это не рабочий вариант, а немасштабируемый костыль.

Нужно красивое решение.

Согласен, вариант не очень красивый.

"Будем искать." (С) <Брильянтовая рука>

 

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

Но для тех, кто задумает использовать облако для задач, не связанных с оптимизацией, этого будет недостаточно. Им нужна параллельная обработка РАЗНЫХ пакетов данных (исследование белка, поиск внеземного разума, поиск лекарства от рака и многое другое).

Причина обращения: