Тестирование нового компилятора MQL5 для x64 платформ - ускорение расчетов от 2 до 10 раз! - страница 14

 

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

 

Ещё пара пожеланий:

1. Можно добавить возможность из редактора запускать скрипт без отладки, т.е. как будто из Навигатора. Такой тип запуска есть в любой среде разработки. Думал, как в сях, предложить Ctrl + F5, но вы эту комбинацию уже заняли :)

2. Добавить вызов виндовой консоли stdout из скрипта, чтобы не переключаться каждый раз в терминал, чтобы посмотреть результат скрипта. Хотя, как я понимаю, можно самому её попробовать вызвать средствами WinAPI.

3. Добавить хоть какую-то настройку оптимизации по генетическому алгоритму. Например, число комбинаций может быть 1e35 и 10к проходов не всегда хватает (оптимизатор даже не генерирует новые проходы после 10к), понимаешь, что 20-30к хватило бы, но настроить это никак не можешь. С другой стороны, когда ты какие-то параметры зафиксировал, а часть оставил для более точной настройки и изучения распределения... так вот, когда число комбинаций небольшое, например, 50к, оптимизатор для ГА предлагает всего 2к прогонов - а этого тоже недостаточно для этой конкретной задачи - получше изучить поведение функции на этих параметрах. Т.е. перебирать все 50к глупо, а ГА генерирует всего 2к прогонов и не выдаёт достаточной картины. Надеюсь, вы поняли, о чём я говорю.

 
Renat Fatkhullin:

Улучшения будут обязательно.

кто-нибудь уже протестировал отладку на истории в тестере стратегий?

Думаю многие бы с удовольствием потестировали, но сложность и реальность в том, что обычно тестируют там, где пишут код и собираются торговать. Брокеров предлагающих МТ5 очень мало, что видимо значительно замедлит тестирование всех нововведений трейдерами и это неминуемо замедлит и разработку МТ5. Поэтому возможно имеет смысл поискать для этого какое-то нетривиальное решение, которое решит эту проблему и поднимет мотивацию использовать МТ5.
 
Renat Fatkhullin:

Улучшения будут обязательно.

кто-нибудь уже протестировал отладку на истории в тестере стратегий?

Что-то я не так делаю. У меня открывается визуализатор просто, и работает как обычно. Брейкпоинт стоит прямо на первом операторе в функции OnInit() - но не срабатывает.
 
Renat Fatkhullin:

Улучшения будут обязательно.

кто-нибудь уже протестировал отладку на истории в тестере стратегий?

А еще было бы неплохо иметь возможность выбрать "find usages" из контестного меню.

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

 я проверил досконально на новом компиляторе Moving Average,  MACD Sample расхождения не нашел,  видно хорошо на них оттестировались. Попробую на своих советниках.

 

До конца не отладил и не нашёл, как вылезает баг (очень по-разному), но пока обнаружил следующие проблемы при Optimize=1. Сразу скажу, что у моего эксперта порядка 100 входных параметров, и он много работает с массивами. Плюс он не торгует, а делает только вычисления.

Опишу порядок моих действий:

1. Запускаю терминал, выбираю в тестере "Оптимизация = Отключена" и даю эталонный входной набор параметров. Тестер выдаёт правильный результат.

2. Выбираю "Оптимизация = Быстрая (генетический алгоритм)", запускаю - тестер даже не генерирует первый шаг. Агенты (процессоры) не отвечают. Сначала я думал, что могут возникать какие-то ошибки вычислений при плохих наборах параметров и тестер просто умирает.

3. Снова выбираю "Оптимизация = Отключена" и снова даю эталонный набор. Теперь тестер вообще не выдаёт результатов.

4. Открываю код эксперта в редактора, нажимаю F5, чтобы сгенерировать неоптимизированный код. В тестере опять запускаю на эталонном наборе - вуаля, результат есть. В общем, что-то внутри у него сглючивает из-за оптимизации.

 

Я добавил функцию, которая логирует в файл входные параметры эксперта. Так вот, на шаге 2 (запущена оптимизация, а шаги тестера почти не генерируются) для некоторых параметров проскакивали рандомные значения, которые вообще не предусмотрены, потому что параметр либо неизменяемый, либо значение не входит в выставленный диапазон. Например, у меня один параметр был выставлен на 80 и был неизменяемым. В логе было значение 0.01355835795402527 (?). Другой выставлен на 0, в логе 4.940656458412465e-324; Оба параметра были double. Но потом я обнаружил, что для int тоже проскакивают совсем неподходящие значения.

Во-вторых, я вырезал "лишний" код эксперта, чтобы оставить только такой код, который тоже приводит к ошибке. Получилось всё равно довольно много. Плюс функция логирования выводила значение ВСЕХ параметров. Однако, когда я поудалял большую часть параметров (и их стало меньше 64 или 80), тестер не умирал. При этом ещё обнаружилась странная связь ошибки с моей функцией логирования. Когда она закомментирована (т.е. все параметры НЕ используются в коде), тестер умирает. Когда она логирует, тестер умирает. Очень странно.

И третье. Заметил, что распараллеливание вычислений не приводит к линейному росту общей скорости запусков. Для примера прилагаю файлы: скрипт и эксперт с тем же кодом. Это реальный кусок кода, вырезанный из моего эксперта, только массивы переименованы. При Optimize=1 скрипт у меня отрабатывает за 156 мс, т.е. возможно 6 прогонов за секунду. (Без Optimize в 3 раза дольше). У меня 8 потоков, т.е. теоретически возможно 48 прогонов в секунду. При запуске же эксперта в тестере (делаем Медленную оптимизацию, включаем параметр dummy, например, на 2000 прогонов) я получил всего лишь чуть больше 4 прогонов в секунду, т.е. даже медленней, чем на одном ядре! Хотя в диспетчере задач честно висело 8 процессов. Из-за чего так? Блокировка доступа к памяти нескольких процессов? Долгая инициализация массивов? (Правда, там массивы небольшие).

Запускаем в тестере одиночный прогон, в журнале появляется вывод Print: 156 мс. Т.е. с экспертом как бы всё нормально.

 

Кстати, указатели в MQL когда-нибудь будут? :) А то мне вот пришлось делать массивы-копии.

Файлы:
 
xfo:

почему-то эксперт с оптимизацией работал в тестере в 3 раза медленней. 

Сейчас понял, почему становится медленнее - работает только один агент (случайный), другие - failed и так постоянно по одной попытке раз в несколько секунд. Из лога тестера ничего непонятно. Как я понял, если фейлит и самый последний агент, то случается то, о чём я писал раньше: шаги тестера вообще не генерируются.

Билд 1117 не решил всех вышеописанных проблем (в т.ч. с массивом struct).

 

Сегодня обновился до 1117, но отладка на исторических данных - так и не идет.

Беру ExpertMACD.mt5, ставлю брейкпоинт прямо на входе в функцию Init, запускаю отладку на исторических данных (нажимаю кнопку), окно редактора прикрывается, открываются настройки тестера стратегий. Выставляю временной период (за 2015 год, дневки, все тики), визуализация - стоит галочка, нажимаю кнопку Старт - и пошла визуализация. Брейкпоинт не сработал.

Что я делаю не так ?

 
George Merts:

Сегодня обновился до 1117, но отладка на исторических данных - так и не идет.

Беру ExpertMACD.mt5, ставлю брейкпоинт прямо на входе в функцию Init, запускаю отладку на исторических данных (нажимаю кнопку), окно редактора прикрывается, открываются настройки тестера стратегий. Выставляю временной период (за 2015 год, дневки, все тики), визуализация - стоит галочка, нажимаю кнопку Старт - и пошла визуализация. Брейкпоинт не сработал.

Что я делаю не так ?

Нужно открыть демо счёт на MetaQuotes-Demo, затем

 

У меня на MACD Sample.mq5 на демо-счёте moex символ USDRUB_TOM не работает (сначала начинает работать, затем через несколько шагов прекращает), не работает и простой бэктест.

А Moving Average.mq5 на демо-счёте moex символ USDRUB_TOM работает нормально (и простой бэктест тоже).

 

 На  демо-счёте demoforex символ EURUSD работает нормально (и простой бэктест тоже) MACD Sample.mq5 и Moving Average.mq5

 

Записал видео отладки на MACD Sample.mq5 символ EURUSD  на демо-счёте demoforex. (дневки тоже работают нормально)

Файлы:
capture-mt5-1.zip  5457 kb
 
xfo:

До конца не отладил и не нашёл, как вылезает баг (очень по-разному), но пока обнаружил следующие проблемы при Optimize=1. Сразу скажу, что у моего эксперта порядка 100 входных параметров, и он много работает с массивами. Плюс он не торгует, а делает только вычисления.

........................

 .......................

Кстати, указатели в MQL когда-нибудь будут? :) А то мне вот пришлось делать массивы-копии.

Добрый день, хотелось бы побольше конкретики.

1. Ваш эксперт делает вычисления, но не торгует. Что и как выводит эксперт? Что вы ожидаете от эксперта при запуске в тестере стратегий? Какие данные Вы ожидаете получить при тестировании с оптимизацией? На нашей стороне тестирование приложенного Вами эксперта ошибок не выявило. Описанные Вами ошибки относятся к нему?

2. Опишите пошагово свои действия и ожидания с приложением используемого кода пожалуйста.

3. Можете приложить логи тестирования с оптимизацией и без?

4. Ваша версия терминала, ОС?

 

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

По поводу приложенного мной фала: там шла речь о том, что одиночный запуск приложенного эксперта занимает 156 мс, т.е. 1/6 секунды. Можно предположить, что на 8 потоках мы получим 48 запусков в секунду. В реальности при множественном прогоне (для этого есть параметр dummy, режим Медленной оптимизации) на 8 потоках скорость получается всего лишь 4-5 прогонов в секунду. Вопрос был: почему скорость падает? На вкладке Агенты я вижу, что все потоки работают, и каждый поток тратит на прогон больше 1 секунды. То, что эксперт возвращает rand() - это так, для галочки, чтобы видеть, что он отработал. 

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