Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
Пример обработки результатов оптимизации в тестере стратегий - эксперт для MetaTrader 5
- Просмотров:
- 6484
- Рейтинг:
- Опубликован:
- 2012.06.11 16:29
- Обновлен:
- 2016.11.22 07:33
- Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Тестер торговых стратегий терминала MetaTrader 5 позволяет получить статистические характеристики торговой системы после окончания каждого прохода тестирования.
Статистические показатели можно получить при помощи функции TesterStatistics(), которая вызывается внутри функций OnTester() и OnDeinit().
С введением функций для работы с результатами оптимизации FrameFirst(), FrameFilter(), FrameNext(), FrameInputs() и FrameAdd(), трейдеры получили возможность проводить визуальную оптимизацию, обрабатывая и выводя на экран необходимую информацию прямо в процессе оптимизации эксперта или решения математической задачи.
Мы рассмотрим детали примера визуализации результатов тестирования советника в процессе оптимизации из статьи "Визуализируй стратегию в тестере MetaTrader 5".
1. Визуализация баланса в процессе оптимизации
1.1. Размещение файлов
Советник Moving Averages_With_Frames.mq5 нужно скопировать в папку: каталог_данных_терминала\MQL5\Experts.
Для работы советника используются файлы:
- FrameGenerator.mqh - Класс CFrameGenerator для вывода результатов оптимизации;
- SpecialChart.mqh - Класс CSpecialChart для отрисовки нескольких графиков баланса;
- SimpleTable.mqh - Класс CSimpleTable - простая таблица из двух столбцов;
- ColorProgressBar.mqh - Класс CСolorProgressBar - прогресс-бар, рисующий двумя цветами.
Их нужно скопировать в папку: каталог_данных_терминала\MQL5\Include.
В терминале MetaTrader 5 (вкладка CodeBase окна "Инструменты") есть возможность автоматической загрузки программ из CodeBase. Для этого в контекстном меню нужно выбрать "Загрузить" и все коды будут загружены и размещены по своим папкам.
Рис 1. Пример загрузки программ из CodeBase из терминала MetaTrader 5
1.2. Тестирование советника
Советник Moving Averages_With_Frames.mq5 необходимо запустить в тестере стратегий.
Настройки тестирования:
Рис. 2. Настройки тестирования советника Moving Averages_With_Frames.mq5
Параметры оптимизации:
Рис. 3. Настройки тестирования советника Moving Averages_With_Frames.mq5
В процессе оптимизации советник отображает динамику изменения баланса и выводит статистические характеристики прохода оптимизации:
Рис. 4. Оптимизация советника Moving Averages_With_Frames.mq5
Процесс оптимизации:
1.3. Принцип работы советника
Советник Moving Averages_With_Frames.mq5 создан на основе советника Moving Averages.mq5, входящего в стандартную поставку терминала MetaTrader 5 (MQL5\Experts\Examples\Moving Average).
Для визуализации результатов тестирования добавлен код:
//--- подключим код для работы с результатами оптимизации #include <FrameGenerator.mqh> //--- генератором фреймов CFrameGenerator fg; //+------------------------------------------------------------------+ //| Tester function | //+------------------------------------------------------------------+ double OnTester() { //--- тут нужно вставить свою функцию для вычисления критерия оптимизации double TesterCritetia=MathAbs(TesterStatistics(STAT_SHARPE_RATIO)*TesterStatistics(STAT_PROFIT)); TesterCritetia=TesterStatistics(STAT_PROFIT)>0?TesterCritetia:(-TesterCritetia); //--- вызываем на каждом окончании тестирования и передаем в качестве параметра критерий оптимизации fg.OnTester(TesterCritetia); //--- return(TesterCritetia); } //+------------------------------------------------------------------+ //| TesterInit function | //+------------------------------------------------------------------+ void OnTesterInit() { //--- подготавливаем график для отображения нескольких линий баланса fg.OnTesterInit(3); //параметр задает количество линий баланса на графике } //+------------------------------------------------------------------+ //| TesterPass function | //+------------------------------------------------------------------+ void OnTesterPass() { //--- обрабатываем полученные результаты тестирования и выводим графику fg.OnTesterPass(); } //+------------------------------------------------------------------+ //| TesterDeinit function | //+------------------------------------------------------------------+ void OnTesterDeinit() { //--- завершение оптимизации fg.OnTesterDeinit(); } //+------------------------------------------------------------------+ //| Обработка событий на графике | //+------------------------------------------------------------------+ void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { //--- запускает воспроизведение фреймов по окончании оптимизации при нажатии на шапке fg.OnChartEvent(id,lparam,dparam,sparam,100); // 100 - это пауза в ms между кадрами } //+------------------------------------------------------------------+
Аналогичным образом этот код можно использовать в любом торговом советнике.
Для работы с результатами оптимизации используется класс CFrameGenerator, содержащий методы обработки событий тестера стратегий OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit() и метод событий графика OnChartEvent(). В методе OnTesterInit() класса CFrameGenerator производится подготовка используемых графических объектов.
Метод OnTester() класса CFrameGenerator вызывается на агенте тестирования каждый раз после завершения каждого прогона тестирования. В данном методе производится расчет динамики кривой баланса на основе результатов торговли. График кривой баланса представляет собой одномерный массив, длина которого зависит от количества совершенных сделок.
После этого при помощи функции TesterStatistics() запрашивается информация о значениях статистических показателей (чистая прибыль, фактор прибыльности, фактор восстановления, количество трейдов, количество сделок, максимальная просадка средств в процентах, значение пользовательского критерия оптимизации) и формируется фрейм (в нашем случае массив данных тестового прогона), который отправляется терминалу (от агента тестирования) при помощи функции FrameAdd().
Получение фреймов и их обработка производятся в методе OnTesterPass() класса CFrameGenerator. Чтение фреймов оптимизации осуществляется функцией FrameNext(), запрос входных параметров эксперта, для которых сформирован фрейм, производится при помощи функции FrameInputs().
После получения данных производится их отображение и обновление при помощи методов классов CSimpleTable, CColorProgressBar и CSpecialChart.
Следует обратить внимание на то, что выполнение функций обработки OnTester() производится на агенте тестирования после завершения очередного прогона оптимизации. Это дает возможность использования мощностей распределенной сети MQL5 Cloud Network для проведения сложных математических расчетов - для этого расчетную часть необходимо разместить в обработчике события OnTester.
Пример использования оптимизации для ускорения математических расчетов (непрерывное вейвлет-преобразование функции Вейерштрасса) приведен в теме "Контроль процессов оптимизации в реальном режиме времени и передача массивных данных от агентов в MetaTrader 5".
2. Примеры работы с классами CSimpleTable, CColorProgressBar и CSpecialChart
Прилагаемые скрипты Test_SimpleTable.mq5 и Test_CSpecialChart.mq5 содержат примеры работы с классами CSimpleTable, CColorProgressBar и CSpecialChart. Их нужно скопировать в папку: каталог_данных_терминала\MQL5\Scripts.
Рис 5. Результат работы скрипта Test_SimpleTable.mq5
Рис 6. Результат работы скрипта Test_CSpecialChart.mq5
Экспоненциальная средняя с периодом сглаживания, зависящим от значений индикатора RSI (Exponential Moving Average - RSI Volatility-Adjusted by Jose Silva).
EMA_BB_VAАдаптивная (зависящая от полос Боллинджера) экспоненциальная средняя Джоза Сильвы (Exponential Moving Average - BB Volatility Adjusted by Jose Silva).
Эксперт, основанный на индикаторе EMA_RSI_VA. При пересечении быстрой линии EMA_RSI_VA снизу вверх, производится покупка, и наоборот.
Chart_Period_ChangerПростой скрипт переключения основных таймфреймов. Основное назначение - удобство переключения по горячим клавишам.