Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
- Просмотров:
- 6379
- Рейтинг:
- Опубликован:
- 2009.08.26 04:56
- Обновлен:
- 2015.05.12 11:51
-
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Некоторое время назад на mql4.com была опубликована замечательная статья - Визуальная оптимизация прибыльности индикаторов и сигналов Сергея Кравчука. Приведенный в ней "индикаторный оптимизатор" позволяет наглядно тестировать выбранную систему сигналов в ручном режиме. Поскольку индикатор пересчитывается только по приходу нового тика, а оптимизацией параметров торговых систем часто приходится заниматься в выходные дни, когда тиков нет, мне пришлось переделать индикатор в скрипт - OptiRunner, который доступен для скачивания там же - в комментариях к указанной статье. Он то и послужил отправной точкой в разработке новой библиотеки - Optimatic.
Прежде чем перейти к описанию Optimatic, хотелось бы обратить внимание на следующее. Оптимизация с помощью индикатора IndicatorOptimizer или скрипта OptiRunner, на мой взгляд, имеет только одно преимущество перед встроенным тестером МетаТрейдера - это визуализация виртуальных сделок на лету, в процессе изменения параметров. Но проблема-то в том, что параметры приходится подбирать вручную, и здесь уже встроенный тестер гораздо удобнее в плане анализа получающихся торговых показателей на целом массиве параметров. Таким образом, мы приходим к тому, что ручная оптимизация хороша для выработки торговой стратегии, а для её последующего каждодневного использования нужно нечто иное. В принципе хотелось бы иметь инструмент, который по аналогии с тестером автоматически подбирает параметры для эксперта в процессе его работы. Именно для этих целей и служит OptimaticLib.
Рассмотрим обычный сценарий. Имеется какая-либо торговая стратегия, например, такой простейший алгоритм как пересечение двух разнопериодных "машек". Она реализована для демонстрации в приложенном эксперте MADemo-OptiBot. Посмотрим, как такая система вела бы себя в мае 2009 по EURUSD на H1, с периодами 10 и 15, которые исходя из каких-то исторических соображений были посчитаны подходящими:
Мы видим убыток. Полностью весь отчет MADemo-OptiBot-disabled (вместе с отчетами для других настроек) можно найти в приложенном архиве. Для работы эксперта в данном режиме, с отключенной библиотекой Optimatic, нужно параметру UseOptimatic поставить значение false.
Допустим у нас есть машина времени, и мы можем, заглянув в будущее, прогнать встроенную оптимизацию МетаТрейдера по данному месяцу. В результате получим лучшие величины параметров - 18 и 35:
Проход | Прибыль | Всего сделок | Прибыльность | Матожидание выигрыша | Просадка $ | Просадка % |
271 | 812.38 | 13 | 3.58 | 62.49 | 357.74 | 24.80 |
269 | 796.84 | 13 | 3.83 | 61.30 | 358.60 | 25.37 |
241 | 768.96 | 14 | 3.05 | 54.93 | 378.94 | 26.19 |
Подставив их в эксперт, получим за май месяц действительно 812 долларов прибыли:
Будем считать эту величину максимальным выигрышем, возможным при стандартном подходе, несмотря на всю нечестность заглядывания в будущее.
Теперь переключим параметр UseOptimatic в эксперте в значение true и вернемся назад в начало мая. Для этого поставим периоды снова равными 10 и 15, а все остальные параметры оставим по-умолчанию. При включенной библиотеке эксперт будет анализировать на истории глубиной StartBar баров все сочетания периодов "машек" от двух указаных до плюс-минус Variation процентов (равно 50% по-умолчанию). И для каждого сочетания рассчитываются показатели прибыльности, просадки и другие (по аналогии с тем, как это делается в OptiRunner), после чего выбирается сочетание с лучшими показателями, отвечающее набору заданных ограничений. Повторный анализ проводится каждый OptimaticPeriod период (по умолчанию 1440), т.е. смена периодов может происходить в мае с началом каждых суток. Полный перечень параметров библиотеки Optimatic приведен чуть ниже. Посмотрим, какой результат получится при включенной оптимизации на лету:
Итог - 926 долларов - лучше, чем в случае с оптимизацией на месяц вперед, а просадка - меньше.
Таким образом, библиотека яко-бы может обеспечить хорошую прибыль за счет оперативной оптимизации. Может, но не гарантирует, поскольку оптимизация выполняется, как и в случае со встроенным оптимизатором, на прошлых данных, и любые изменения в рынке способны за достаточно короткий период времени (меньший чем OptimaticPeriod) нарушить оптимальность настроек, и более того, если изменения будут происходить все время, Optimatic не будет успевать подстраиваться под них на нескольких отрезках времени подряд. Тестирование библиотеки выявило проблемы как с выбором глубины истории, так и обобщенных критериев оценки пригодности наборов параметров среди формально прибыльных обширных областей в пространстве оптимизации. В частности, использование библиотеки с различными системами сигналов, на различных таймфреймах и инструментах позволило заключить, что она, в нынешнем варианте, скорее демонстрирует минимизацию потерь, нежели максимизацию прибыли.
Параметры библиотеки Optimatic:
- Variation - процент отклонения параметров от центральных значений (передаются в библиотеку с помощью специальной функции, об этом чуть ниже);
- MaxDimension - максимальное количество шагов по каждому из параметров между пограничными -50% и +50%; если 0 - то ограничений на размер оптимизируемого многомерного массива параметров нет;
- MinProfitFactor - минимальное требуемое значение профит-фактора для того, чтобы набор параметров, позволивший его получить, считался приемлемым;
- MinProfitLossRatio - минимальное требуемое соотношение количеств выигрышей и проигрышей для того, чтобы набор параметров, позволивший его получить, считался приемлемым;
- DrawdownLimit - минимальная допустимая просадка, проценты;
- MaxProfitDisbalance - максимальный допустмый дисбаланс в прибыли, т.е. доля максимальной выигрывшей сделки в общей прибыли;
- MinCntProfit - минимальной требуемое количество выигрышей в день;
- MaxLossSeries - максимальная допустимая длина серии проигрышей;
- StartBar - глубина истории в барах, на которой проводится оптимизация;
- MultiSignal - если true, оценивает повторные однотипные сигналы, например, параллельные покупки и продажи; если false - то виртуальная сделка покупки и продажи может быть одновременно только одна;
- PrintDetails - выводит подробный лог с объяснением, какие параметры были отброшены и по каким критериям;
- KeepLastGoodResults - если на очередном периоде оптимизации не находится хороших параметров, то можно взять последние найденные значения из предыдущего периода - для этого необходимо установить KeepLastGoodResults в true;
- OptimaticPeriod - период, через который библиотека должна запускаться на переоптимизацию параметров (день, неделя, месяц);
- TP - уровень профита в пунктах; если 0 - стратегия не использует выход по тейку, а только по сигналам;
- SL - уровень стоп-лосса в пунктах; если 0 - стратегия не использует выход по стоп-лоссу, а только по сигналам;
- UseOptimapic - включение/отключение библиотеки в эксперте; когда запускается встроенный оптимизатор, OptimaticLic автоматически выключается.
В ходе оптимизации библиотека находит набор параметров с наибольшим профит-фактором и минимальной просадкой из тех, что удовлетворяют всем прочим ограничениям.
Для того, чтобы встроить библиотеку в эксперт, используется двунаправленный программный интерфейс: функции, которые определены в библиотеке и вызываются из эксперта, а также функции, которые следует определить в эксперте, т.к. их будет вызывать Optimatic.
Программный интерфейс OptimaticLib:
- int optilibinit(int MaxParams) - вызывается из функции init эксперта с указанием числа оптимизируемых параметров;
- bool optilibisaverage() - возвращает логический признак того, что последние полученные из библиотеки оптимальные значения параметров были получены усреднением из нескольких других значений с одинаковыми показателями; эксперт может не "доверять" таким параметрам, если "захочет";
- bool optilibistime() - возвращает признак того, что настало время запуска очередной оптимизации;
- int optilibstart() - непосредственно выполнение оптимизации параметров;
- void optilibgetresults(double &result[]) - получение значений оптимизированных параметров;
- void optilibbanlastresults(bool Reset = false) - позволяет запретить библиотеке выбирать последний предложенный ею набор параметров как оптимальный, для чего эксперт должен вызвать эту функцию с параметром false (или без параметра, т.к. false - значение по-уиолчанию); имеет смысл вызывать, если на практике параметры оказались плохими; если в функцию передано значени true, то запрет на последние параметры снимается; поскольку запрет накладывается только на один набор параметров, данная функция может быть малоэффективной: например, если на каком-то периоде предложенные значения 1 и 10 были помечены как запрещенные, то на следующем периоде библиотека вернет близкие 2 и 9, которые в свою очередь будут запрещены, что автоматически разрешит снова значения 1 и 10; иными словами, функционал наложения запрета на конкретные значения параметров пока реализован в сильно упрощенном виде.
Программный интерфейс эксперта с поддержкой OptimaticLib - для общности предлагается все такие эксперты называть с суффиксом -OptiBot:
- void OptimaticCallback(int bar, bool &_BuySignal, bool &_SellSignal, bool &_BuyExitSignal, bool &_SellExitSignal) - процедура вычисления сигналов на баре bar;
- void OptimaticOnInitParams(double &Params[]) - процедура для передачи в библиотеку начальных (центральных) значений оптимизируемых параметров, вокруг которых в диапазоне плюс/минус Variation процентов будет производиться оптимизация;
- void OptimaticOnSetParams(double InParams[]) - вызывается библиотекой после того, как оптимизация проведены; передает полученные в ходе оптимизации значения;
Среди приложенных файлов находится шаблон Demo-OptiBot.mqt (в силу ограничений сайта, файлы с расширением mqt не могут публиковаться, поэтому шаблон был переименован в mq4, и его следует после скачивания переименовать обратно в mqt, разместив в папке templates), в котором все необходимые функции уже определены и общая логика кода учитывает возможность включения/отключения библиотеки. Все, что нужно дописать в шаблоне, это внутренности функции определения торговых сигналов и функций передачи наборов параметров в и из библиотеки.
Остальные нюансы реализации и использования библиотеки можно подчерпнуть из исходного кода.
Следует иметь в виду, что Optimatic является экспериментальной библиотекой (это даже не бета-версия, а демонстрация концепции). Использование Optimatic в реальных торговых системах не рекомендуется. И даже в том случае, если библиотека перейдет со временем в более зрелую стадию, она не может претендовать на звание грааля, поскольку в ней, фактически, проблема выбора параметров торговой системы перерождается в проблему выбора метапараметров оптимизатора. Эта задача не легче, а скорее всего, сложнее, чем исходная. Как её упростить и получить гарантированную прибыль при любых изменениях на рынке - это направление для дальнейших исследований.
Библиотека OptimaticLib использует библиотеку BreakPoint.dll для вывода прогресс-индикатора во время каждого цикла оптимизации.

Библиотека содержит 3 простых функции для отладки и контроля за ходом выполнения MQL4.

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

Данная библиотека состоит из 40 функций, которые могут помочь в статистических вычислениях.

Советник (+индикатор) для загрузки истории котировок текущего инструмента и ТФ