
Магия фильтрации
Введение
Большинство разработчиков механических торговых систем (МТС), так или иначе, использует фильтрацию сигналов. При этом считают, что это, хоть и не единственный, но наиболее эффективный способ улучшения характеристик МТС. Начинающие "граалестроители" очень часто попадают под влияние магии фильтров. Ведь как просто - взять готовую торговую стратегию, навесить на неё десяток фильтров и вот он, ура - прибыльный советник.
Однако, есть и противники применения фильтров. Фильтры значительно (иногда в 2-3 раза) сокращают количество сделок, и при этом нет уверенности, что в будущем они будут также эффективны, как и в прошлом. Наверняка, есть и ещё какие-нибудь убедительные причины.
Вот и давайте, разберёмся во всём по порядку.
Гипотеза о бессмысленности фильтрации
Если советник убыточный ("сливатор"), то вряд ли ему поможет какая либо фильтрация - магия фильтрации здесь бессильна.
Поэтому в рамках данной статьи подобные советники мы рассматривать не будем. Хотя и ведутся исследования квантово-частотных фильтров, способных практически любой "сливатор" превратить в псевдоГрааль.
Гипотеза о вреде фильтрации
Если советник по своим характеристикам приближается к идеальной МТС, то фильтрация будет только ухудшать их.
Следует уточнить, что подразумевается под идеальной МТС. Это такая торговая стратегия, которая генерирует только профитные сделки, т.е. не приносящие убытков. У такой системы количество убыточных сделок = 0.
Что такое фильтр?
В самом простом виде, фильтр торговых сигналов представляет собой логическое ограничение типа: если А не меньше Б (А>=Б), то сигнал пропускаем, а если меньше (А<Б) - то нет. В результате часть сигналов отсеивается. По каким условиям фильтровать - решает сам разработчик торгового робота. Для поиска закономерностей необходимо проанализировать влияния различных факторов на характеристики МТС. А их великое множество. Поэтому, надо подключить свою интуицию, чтобы выбрать наиболее значимые и логически обоснованные.
Пример. Возможно, есть зависимость результатов торговли МТС от величины атмосферного давления в деревне Кукушкино, т.е. можно создать соответствующий фильтр и повысить прибыльность советника, который будет учитывать погоду в российской глубинке. Однако не многие оценят такой новаторский подход к фильтрации, не смотря на то, что он может повысить профитность системы.
Классификация фильтров
При всём многообразии фильтров, применяемых в МТС, их всё-таки можно разделить на два основных класса:
- полосовой фильтр (П-фильтр) - пропускает определённую полосу сигналов;
- дискретный фильтр (Д-фильтр) - выборочное пропускание сигналов по маске (шаблону).
С чего начать?
Давайте рассмотрим механизм фильтрации на примере. Возьмём для этого советник DC2008_revers (см. прикреплённый файл), специально разработанный для этой статьи, и исследуем его характеристики (без использования каких либо фильтров). Вот полученный при тестировании отчёт.
Отчёт
Символ | EURUSD (Euro vs US Dollar) | ||||
Период | 1 Минута (M1) 2009.09.07 00:00 - 2010.01.26 23:59 (2009.09.07 - 2010.01.27) | ||||
Модель | Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов) | ||||
Параметры | Lots=0.1; Symb.magic=9001; nORD.Buy=5; nORD.Sell=5; | ||||
Баров в истории | 133967 | Смоделировано тиков | 900848 | Качество моделирования | 25.00% |
Ошибки рассогласования графиков | 0 | ||||
Начальный депозит | 10000.00 | ||||
Чистая прибыль | 4408.91 | Общая прибыль | 32827.16 | Общий убыток | -28418.25 |
Прибыльность | 1.16 | Матожидание выигрыша | 1.34 | ||
Абсолютная просадка | 273.17 | Максимальная просадка | 3001.74 (20.36%) | Относительная просадка | 20.36% (3001.74) |
Всего сделок | 3284 | Короткие позиции (% выигравших) | 1699 (64.98%) | Длинные позиции (% выигравших) | 1585 (65.68%) |
Прибыльные сделки (% от всех) | 2145 (65.32%) | Убыточные сделки (% от всех) | 1139 (34.68%) | ||
Самая большая | прибыльная сделка | 82.00 | убыточная сделка | -211.00 | |
Средняя | прибыльная сделка | 15.30 | убыточная сделка | -24.95 | |
Максимальное количество | непрерывных выигрышей (прибыль) | 29 (679.00) | непрерывных проигрышей (убыток) | 16 (-290.34) | |
Максимальная | непрерывная прибыль (число выигрышей) | 679.00 (29) | непрерывный убыток (число проигрышей) | -1011.00 (10) | |
Средний | непрерывный выигрыш | 5 | непрерывный проигрыш | 3 |
Рис. 1 График изменения баланса. Исходный советник без фильтров
Анализ результатов:
- Советник прибыльный, и прибыльных сделок больше 60% - это хорошо.
- Максимальная просадка 20% от депозита и больше 3000$ при минимальном размере лота - это плохо.
- Общее количество сделок вполне достаточно для применения фильтрации (>3000).
Конечно, эти выводы уместны исключительно для рассматриваемого периода истории. Как советник будет торговать на другом участке - нам не известно. Однако это не может помешать изменить его характеристики с помощью фильтрации.
Таким образом, для этого советника можно попробовать найти такие фильтры, которые позволят повысить прибыльность и снизить просадку.
Полосовой фильтр (П-фильтр)
Это один из самых популярных и простых фильтров, т.к. результат можно оценить сразу же после тестирования и без дополнительной обработки. Рассмотрим возможные варианты использования его в тестируемом советнике. В качестве параметра полосы пропускания, исследуем сравнение цены открытия бара с ценой его закрытия на разных временных периодах.
Период Н4
//+---------------------------------------------------------------------------------+ // Сигналы на покупку BUY //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................ФИЛЬТРЫ................................... && iOpen(NULL,PERIOD_H4,1)<iClose(NULL,PERIOD_H4,1) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // Сигналы на продажу SELL //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................ФИЛЬТРЫ................................... && iOpen(NULL,PERIOD_H4,1)>iClose(NULL,PERIOD_H4,1) ) { //---- Signal.Sell=true; }
Рис. 2 График изменения баланса. П-фильтр на периоде Н4
Период Н1
//+---------------------------------------------------------------------------------+ // Сигналы на покупку BUY //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................ФИЛЬТРЫ................................... && iOpen(NULL,PERIOD_H1,1)>iClose(NULL,PERIOD_H1,1) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // Сигналы на продажу SELL //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................ФИЛЬТРЫ................................... && iOpen(NULL,PERIOD_H1,1)<iClose(NULL,PERIOD_H1,1) ) { //---- Signal.Sell=true; }
Рис. 3 График изменения баланса. П-фильтр на периоде Н1
Период М30
//+---------------------------------------------------------------------------------+ // Сигналы на покупку BUY //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................ФИЛЬТРЫ................................... && iOpen(NULL,PERIOD_M30,1)<iClose(NULL,PERIOD_M30,1) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // Сигналы на продажу SELL //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................ФИЛЬТРЫ................................... && iOpen(NULL,PERIOD_M30,1)>iClose(NULL,PERIOD_M30,1) ) { //---- Signal.Sell=true; }
Рис. 4 График изменения баланса. П-фильтр на периоде М30
Период М5
//+---------------------------------------------------------------------------------+ // Сигналы на покупку BUY //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................ФИЛЬТРЫ................................... && iOpen(NULL,PERIOD_M5,1)<iClose(NULL,PERIOD_M5,1) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // Сигналы на продажу SELL //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................ФИЛЬТРЫ................................... && iOpen(NULL,PERIOD_M5,1)>iClose(NULL,PERIOD_M5,1) ) { //---- Signal.Sell=true; }
Рис. 5 График изменения баланса. П-фильтр на периоде М5
Для удобства анализа полученных отчётов, они сведены в следующую таблицу.
Без фильтрации | PERIOD_H4 | PERIOD_H1 | PERIOD_M30 | PERIOD_M5 | |
---|---|---|---|---|---|
Начальный депозит | 10000.00 | 10000.00 | 10000.00 | 10000.00 | 10000.00 |
Чистая прибыль | 4408.91 | 4036.33 | 4829.05 | 3852.90 | 4104.30 |
Общая прибыль | 32827.16 | 19138.74 | 27676.50 | 18133.77 | 23717.68 |
Общий убыток | -28418.25 | -15102.41 | -22847.45 | -14280.87 | -19613.38 |
Прибыльность | 1.16 | 1.27 | 1.21 | 1.27 | 1.21 |
Матожидание выигрыша | 1.34 | 2.92 | 2.20 | 3.59 | 2.02 |
Абсолютная просадка | 273.17 | 434.09 | 762.39 | 64.00 | 696.23 |
Максимальная просадка | 3001.74 (20.36%) | 2162.61 (17.48%) | 2707.56 (17.22%) | 2121.78 (16.38%) | 1608.30 (12.46%) |
Относительная просадка | 20.36% (3001.74) | 17.48% (2162.61) | 17.22% (2707.56) | 16.38% (2121.78) | 12.46% (1608.30) |
Всего сделок | 3284 | 1383 | 2195 | 1073 | 2035 |
Короткие позиции (% выигравших) | 1699 (64.98%) | 674 (54.01%) | 1119 (60.59%) | 547 (60.51%) | 1046 (63.48%) |
Длинные позиции (% выигравших) | 1585 (65.68%) | 709 (62.48%) | 1076 (64.96%) | 526 (64.64%) | 989 (66.63%) |
Прибыльные сделки (% от всех) | 2145 (65.32%) | 807 (58.35%) | 1377 (62.73%) | 671 (62.53%) | 1323 (65.01%) |
Убыточные сделки (% от всех) | 1139 (34.68%) | 576 (41.65%) | 818 (37.27%) | 402 (37.47%) | 712 (34.99%) |
Самая большая | |||||
прибыльная сделка | 82.00 | 201.00 | 157.00 | 204.00 | 97.00 |
убыточная сделка | -211.00 | -136.00 | -160.00 | -179.51 | -156.00 |
Средняя | |||||
прибыльная сделка | 15.30 | 23.72 | 20.10 | 27.02 | 17.93 |
убыточная сделка | -24.95 | -26.22 | -27.93 | -35.52 | -27.55 |
Максимальное количество | |||||
непрерывных выигрышей (прибыль) | 29 (679.00) | 27 (817.98) | 36 (1184.32) | 36 (1637.38) | 44 (912.03) |
непрерывных проигрышей (убыток) | 16 (-290.34) | 12 (-636.34) | 13 (-367.07) | 14 (-371.51) | 15 (-498.51) |
Максимальная | |||||
непрерывная прибыль (число выигрышей) | 679.00 (29) | 884.08 (16) | 1184.32 (36) | 1637.38 (36) | 912.03 (44) |
непрерывный убыток (число проигрышей) | -1011.00 (10) | -686.00 (10) | -758.00 (7) | -894.85 (10) | -589.00 (5) |
Средний | |||||
непрерывный выигрыш | 5 | 5 | 5 | 5 | 4 |
непрерывный проигрыш | 3 | 3 | 3 | 3 | 2 |
Табл.1 Сравнительная таблица отчётов тестирования П-фильтров
Анализ результатов:
- Чистая прибыль увеличилась только на П-фильтре "PERIOD_H1" (4408.91=>4829.05).
- Лидером по матожиданию стал П-фильтр "PERIOD_M30" (1.34=>3.59).
- Максимальная просадка снизилась на всех фильтрах. Минимальное значение просадки получили на фильтре "PERIOD_M5" (3001.74=>1608.30).
- Фильтрация сократила общее количество сделок в 1,5-3 раза.
ВЫВОДЫ:
- С помощью П-фильтра можно улучшить характеристики МТС.
- Для дальнейшего анализа выберем П-фильтр "PERIOD_H1", показавший лучшую прибыль.
Дискретный фильтр (Д-фильтр)
Самый простой и интуитивно понятный дискретный фильтр - торговля по часам. Не трудно предположить, что в течение дня советник торгует не стабильно. В какие-то часы он прибыльнее, а в какие-то наоборот - приносит только убытки. Для этого проведём исследование влияния этого фильтра на результативность торговли. Предварительно включив в код эксперта дополнительную внешнюю переменную:
extern int Filter.Hour=0; // Д-Фильтр: торговля по часам //---- extern double Lots=0.1; extern int Symb.magic=9001, nORD.Buy = 5, // макс кол-во ордеров на покупку nORD.Sell = 5; // макс кол-во ордеров на продажу
Ну и сам фильтр:
//+---------------------------------------------------------------------------------+ // Сигналы на покупку BUY //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................ФИЛЬТРЫ................................... && Hour()==Filter.Hour ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // Сигналы на продажу SELL //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................ФИЛЬТРЫ................................... && Hour()==Filter.Hour ) { //---- Signal.Sell=true; }
Итак, если текущий час совпадает с дискретным значением Д-фильтра, то сигнал на продажу или покупку генерируем (пропускаем), в противном случае - нет.
Запускаем тестер в режиме оптимизации (входные параметры указаны на рисунках). Депозит нужно задать максимальный, чтобы исключить ситуацию - "недостаточно средств для открытия позиции" и не потерять часть сделок.
Рис.6 Входные параметры для получения характеристик отклика Д-фильтра
В результате получили характеристики отклика фильтра: прибыль, количество сделок и просадка (ось Y) в функции от времени суток (ось X).
Рис. 7 Характеристики отклика фильтра. Д-фильтрация по часам
Наше предположение о том, что советник в разные часы приносит разную прибыль - подтвердилось!
... Ну, подтвердилось, а что теперь с этим делать? Первое что напрашивается - это запретить ему торговать в те часы, когда он приносит только убытки. Вроде логично. Ну что же, тогда видоизменим Д-фильтр, разрешив торговлю только в прибыльные часы. Другими словами - создадим маску фильтра. Теперь можно включить в код итоговый Д-фильтр и посмотреть отчёт тестирования.
//+---------------------------------------------------------------------------------+ // Сигналы на покупку BUY //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................ФИЛЬТРЫ................................... && (Hour()==0 || Hour()==6 || Hour()==9 || Hour()==10 || Hour()==11 || Hour()==12 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // Сигналы на продажу SELL //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................ФИЛЬТРЫ................................... && (Hour()==0 || Hour()==6 || Hour()==9 || Hour()==10 || Hour()==11 || Hour()==12 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Sell=true; }
Символ | EURUSD (Euro vs US Dollar) | ||||
Период | 1 Минута (M1) 2009.09.07 00:00 - 2010.01.26 23:59 (2009.09.07 - 2010.01.27) | ||||
Модель | Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов) | ||||
Параметры | Filter.Hour=0; Lots=0.1; Symb.magic=9001; nORD.Buy=5; nORD.Sell=5; | ||||
Баров в истории | 133967 | Смоделировано тиков | 900848 | Качество моделирования | 25.00% |
Ошибки рассогласования графиков | 0 | ||||
Начальный депозит | 10000.00 | ||||
Чистая прибыль | 6567.66 | Общая прибыль | 24285.30 | Общий убыток | -17717.64 |
Прибыльность | 1.37 | Матожидание выигрыша | 4.13 | ||
Абсолютная просадка | 711.86 | Максимальная просадка | 3016.21 (18.22%) | Относительная просадка | 18.22% (3016.21) |
Всего сделок | 1590 | Короткие позиции (% выигравших) | 832 (61.30%) | Длинные позиции (% выигравших) | 758 (63.85%) |
Прибыльные сделки (% от всех) | 994 (62.52%) | Убыточные сделки (% от всех) | 596 (37.48%) | ||
Самая большая | прибыльная сделка | 194.00 | убыточная сделка | -161.00 | |
Средняя | прибыльная сделка | 24.43 | убыточная сделка | -29.73 | |
Максимальное количество | непрерывных выигрышей (прибыль) | 40 (1096.16) | непрерывных проигрышей (убыток) | 15 (-336.45) | |
Максимальная | непрерывная прибыль (число выигрышей) | 1289.08 (20) | непрерывный убыток (число проигрышей) | -786.51 (8) | |
Средний | непрерывный выигрыш | 5 | непрерывный проигрыш | 3 |
Рис. 8 График изменения баланса. Д-фильтр по часам
Анализ результатов фильтрации:
- Снижения просадки - не добились. Она не только не уменьшилась, но даже немного увеличилась (3001.74 => 3016.21)!?
- Чистая прибыль выросла примерно на 50% (4408.91 => 6567.66). Это конечно радует, но количество сделок при этом сократилось почти в 2 раза (3284 => 1590).
- Матожидание Д-фильтра (4.13) выше лучшего значения из всех исследованных П-фильтров (3.59).
- Количество прибыльных сделок сократилось (64.98%=> 62.52%)., т.е. фильтр ограничил не только убыточные, но и часть прибыльных сделок.
ВЫВОДЫ:
- Дискретная фильтрация может оказаться эффективней П-фильтрации, но требует более тонкой настройки и подбора оптимальных входных условий.
Фильтрация сигналов двумя и более фильтрами
Не всегда удаётся добиться значительного улучшения характеристик МТС, используя всего один фильтр, чаще устанавливают сразу несколько. При этом возникает вопрос: а как их объединить?
Для исследования возьмём рассмотренные выше фильтры и для упрощения обозначим: фильтр №1 (П-фильтр "PERIOD_H1") и фильтр №2 (Д-фильтр). Первоначально соединим их простым сложением, для этого изменим код советника.
//+---------------------------------------------------------------------------------+ // Сигналы на покупку BUY //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................ФИЛЬТРЫ................................... //---- фильтр №1 && iOpen(NULL,PERIOD_H1,1)>iClose(NULL,PERIOD_H1,1) //---- фильтр №2 && (Hour()==0 || Hour()==6 || Hour()==9 || Hour()==10 || Hour()==11 || Hour()==12 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // Сигналы на продажу SELL //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................ФИЛЬТРЫ................................... //---- фильтр №1 && iOpen(NULL,PERIOD_H1,1)<iClose(NULL,PERIOD_H1,1) //---- фильтр №2 && (Hour()==0 || Hour()==6 || Hour()==9 || Hour()==10 || Hour()==11 || Hour()==12 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Sell=true; }
Затем тестируем созданную комбинацию фильтров и в результате получим следующий отчёт.
Отчёт
Символ | EURUSD (Euro vs US Dollar) | ||||
Период | 1 Минута (M1) 2009.09.07 00:00 - 2010.01.26 23:59 (2009.09.07 - 2010.01.27) | ||||
Модель | Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов) | ||||
Параметры | Lots=0.1; Symb.magic=9001; nORD.Buy=5; nORD.Sell=5; | ||||
Баров в истории | 133967 | Смоделировано тиков | 900848 | Качество моделирования | 25.00% |
Ошибки рассогласования графиков | 0 | ||||
Начальный депозит | 10000.00 | ||||
Чистая прибыль | 6221.18 | Общая прибыль | 20762.67 | Общий убыток | -14541.49 |
Прибыльность | 1.43 | Матожидание выигрыша | 5.47 | ||
Абсолютная просадка | 1095.86 | Максимальная просадка | 3332.67 (20.13%) | Относительная просадка | 20.13% (3332.67) |
Всего сделок | 1138 | Короткие позиции (% выигравших) | 584 (58.39%) | Длинные позиции (% выигравших) | 554 (61.19%) |
Прибыльные сделки (% от всех) | 680 (59.75%) | Убыточные сделки (% от всех) | 458 (40.25%) | ||
Самая большая | прибыльная сделка | 201.00 | убыточная сделка | -159.00 | |
Средняя | прибыльная сделка | 30.53 | убыточная сделка | -31.75 | |
Максимальное количество | непрерывных выигрышей (прибыль) | 28 (1240.15) | непрерывных проигрышей (убыток) | 16 (-600.17) | |
Максимальная | непрерывная прибыль (число выигрышей) | 1240.15 (28) | непрерывный убыток (число проигрышей) | -883.85 (10) | |
Средний | непрерывный выигрыш | 5 | непрерывный проигрыш | 3 |
Рис. 9 График изменения баланса. Два фильтра: П-фильтр + Д-фильтр (простое сложение)
Однако, эти два фильтра можно соединить и другим способом. Предположим, что фильтр №1 настроен лучше, чем фильтр №2. Следовательно, нужно построить новый Д-фильтр. Код советника при этом будет выглядеть следующим образом. Запускаем тестер в режиме оптимизации и получаем новые характеристики фильтра №2 (торговля по часам).
//+---------------------------------------------------------------------------------+ // Сигналы на покупку BUY //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................ФИЛЬТРЫ................................... //---- фильтр №1 && iOpen(NULL,PERIOD_H1,1)>iClose(NULL,PERIOD_H1,1) //---- фильтр №2 && Hour()==Filter.Hour ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // Сигналы на продажу SELL //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................ФИЛЬТРЫ................................... //---- фильтр №1 && iOpen(NULL,PERIOD_H1,1)<iClose(NULL,PERIOD_H1,1) //---- фильтр №2 && Hour()==Filter.Hour ) { //---- Signal.Sell=true; }
Рис. 10 Изменение прибыли по времени для двух Д-фильтров. Сравнительный анализ
Действительно, характеристики отклика фильтра изменились. И в этом нет ни чего удивительного - дополнив советник фильтром №1, мы изменили его свойства. Следовательно, необходимо изменить маску для фильтра №2.
Рис. 11 Характеристики отклика фильтра №2. Д-фильтрация по часам (оптимизированная)
Итоговый вид кода советника.
//+---------------------------------------------------------------------------------+ // Сигналы на покупку BUY //+---------------------------------------------------------------------------------+ if(true && High[0]<iLow(NULL,PERIOD_H1,1) && ORD.Buy<nORD.Buy //.........................................ФИЛЬТРЫ................................... //---- фильтр №1 && iOpen(NULL,PERIOD_H1,1)>iClose(NULL,PERIOD_H1,1) //---- фильтр №2 && (Hour()==0 || Hour()==1 || Hour()==6 || Hour()==7 || Hour()==9 || Hour()==10 || Hour()==12 || Hour()==14 || Hour()==15 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Buy=true; } //+---------------------------------------------------------------------------------+ // Сигналы на продажу SELL //+---------------------------------------------------------------------------------+ if(true && Low[0]>iHigh(NULL,PERIOD_H1,1) && ORD.Sell<nORD.Sell //.........................................ФИЛЬТРЫ................................... //---- фильтр №1 && iOpen(NULL,PERIOD_H1,1)<iClose(NULL,PERIOD_H1,1) //---- фильтр №2 && (Hour()==0 || Hour()==1 || Hour()==6 || Hour()==7 || Hour()==9 || Hour()==10 || Hour()==12 || Hour()==14 || Hour()==15 || Hour()==18 || Hour()==20 || Hour()==22 || Hour()==23 ) ) { //---- Signal.Sell=true; }
Отчёт
Символ | EURUSD (Euro vs US Dollar) | ||||
Период | 1 Минута (M1) 2009.09.07 00:00 - 2010.01.26 23:59 (2009.09.07 - 2010.01.27) | ||||
Модель | Все тики (наиболее точный метод на основе всех наименьших доступных таймфреймов) | ||||
Параметры | Lots=0.1; Symb.magic=9001; nORD.Buy=5; nORD.Sell=5; | ||||
Баров в истории | 133967 | Смоделировано тиков | 900848 | Качество моделирования | 25.00% |
Ошибки рассогласования графиков | 0 | ||||
Начальный депозит | 10000.00 | ||||
Чистая прибыль | 5420.54 | Общая прибыль | 22069.48 | Общий убыток | -16648.94 |
Прибыльность | 1.33 | Матожидание выигрыша | 3.77 | ||
Абсолютная просадка | 826.86 | Максимальная просадка | 2141.24 (14.06%) | Относительная просадка | 14.06% (2141.24) |
Всего сделок | 1439 | Короткие позиции (% выигравших) | 758 (61.87%) | Длинные позиции (% выигравших) | 681 (64.46%) |
Прибыльные сделки (% от всех) | 908 (63.10%) | Убыточные сделки (% от всех) | 531 (36.90%) | ||
Самая большая | прибыльная сделка | 157.00 | убыточная сделка | -154.00 | |
Средняя | прибыльная сделка | 24.31 | убыточная сделка | -31.35 | |
Максимальное количество | непрерывных выигрышей (прибыль) | 30 (772.70) | непрерывных проигрышей (убыток) | 16 (-562.17) | |
Максимальная | непрерывная прибыль (число выигрышей) | 1091.32 (22) | непрерывный убыток (число проигрышей) | -926.15 (15) | |
Средний | непрерывный выигрыш | 5 | непрерывный проигрыш | 3 |
Рис. 12 График изменения баланса в результате оптимизации характеристик двух фильтров
Для удобства анализа отчётов, создадим следующую таблицу.
Без фильтрации | Сложение | Оптимизация | |
---|---|---|---|
Начальный депозит | 10000.00 | 10000.00 | 10000.00 |
Чистая прибыль | 4408.91 | 6221.18 | 5420.54 |
Общая прибыль | 32827.16 | 20762.67 | 22069.48 |
Общий убыток | -28418.25 | -14541.49 | -16648.94 |
Прибыльность | 1.16 | 1.43 | 1.33 |
Матожидание выигрыша | 1.34 | 5.47 | 3.77 |
Абсолютная просадка | 273.17 | 1095.86 | 826.86 |
Максимальная просадка | 3001.74 (20.36%) | 3332.67 (20.13%) | 2141.24 (14.06%) |
Относительная просадка | 20.36% (3001.74) | 20.13% (3332.67) | 14.06% (2141.24) |
Всего сделок | 3284 | 1138 | 1439 |
Короткие позиции (% выигравших) | 1699 (64.98%) | 584 (58.39%) | 758 (61.87%) |
Длинные позиции (% выигравших) | 1585 (65.68%) | 554 (61.19%) | 681 (64.46%) |
Прибыльные сделки (% от всех) | 2145 (65.32%) | 680 (59.75%) | 908 (63.10%) |
Убыточные сделки (% от всех) | 1139 (34.68%) | 458 (40.25%) | 531 (36.90%) |
Самая большая | |||
прибыльная сделка | 82.00 | 201.00 | 157.00 |
убыточная сделка | -211.00 | -159.00 | -154.00 |
Средняя | |||
прибыльная сделка | 15.30 | 30.53 | 24.31 |
убыточная сделка | -24.95 | -31.75 | -31.35 |
Максимальное количество | |||
непрерывных выигрышей (прибыль) | 29 (679.00) | 28 (1240.15) | 30 (772.70) |
непрерывных проигрышей (убыток) | 16 (-290.34) | 16 (-600.17) | 16 (-562.17) |
Максимальная | |||
непрерывная прибыль (число выигрышей) | 679.00 (29) | 1240.15 (28) | 1091.32 (22) |
непрерывный убыток (число проигрышей) | -1011.00 (10) | -883.85 (10) | -926.15 (15) |
Средний | |||
непрерывный выигрыш | 5 | 5 | 5 |
непрерывный проигрыш | 3 | 3 | 3 |
Табл. 2 Сравнительная таблица отчётов тестирования комбинаций двух фильтров: П-фильтра и Д-фильтра
Анализ результатов:
- Если сравнивать по критериям прибыль, прибыльность и матожидание, то лучшие результаты показал вариант сложения двух фильтров.
- А вот по просадке выигрывает вариант оптимизации фильтров.
- В любом случае, фильтрация улучшает характеристики МТС.
Заключение
- Так в чём же магия фильтрации? В её простоте и возможности изменить характеристики любого советника.
- Предложенная технология создания фильтров, не предназначена для "тупого" копирования. Она лишь показывает, каким образом можно разработать П-фильтр и Д-фильтр для конкретного советника. Фильтр, который подходит для одного советника, другому может быть противопоказан.
- И помните, идеальная МТС не нуждается в фильтрах! ... Вы ведь такую мечтаете создать систему?
- Я знаю, что код советника и фильтров не оптимизирован и тем более не идеален. Но для целей данной статьи был выбран именно такой стиль программирования. В первую очередь для того, чтобы любой "чайник" смог повторить изложенное и создать свои собственные уникальные фильтры.
- ВНИМАНИЕ! Ни в коем случае не используйте исследуемый в статье советник в реальной торговле!





- Бесплатные приложения для трейдинга
- Форексный VPS бесплатно на 24 часа
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В любом случае, любая торговая система - это набор фильтров, которые и определяют логику ее работы, поэтому нельзя говорить о том что дополнительные фильтры настраивают имеющуюся - это уже иная торговая стратегия... то есть использование в коде программы, хоть одного блока if{} - это уже по определению реализация фильтра.... Поэтому все это стартово фигня... начально надо извлекать статистику с рынка, а потом уже тупо вбивать эти параметры в систему... свою или имеющуюся подходящую, при этом очень достойных тут же в кодобазе более, чем достаточно и о чудо! - ты вдруг имеешь сразу прибыльную систему, при этом с гораздо лучшими параметрами, чем извлек сам автор на оптимизации...
В любом случае, любая торговая система - это набор фильтров, которые и определяют логику ее работы, поэтому нельзя говорить о том что дополнительные фильтры настраивают имеющуюся - это уже иная торговая стратегия... то есть использование в коде программы, хоть одного блока if{} - это уже по определению реализация фильтра.... Поэтому все это стартово фигня... ...
"В любом случае, любая торговая система - это набор фильтров" генератор сигналов (торговых событий)!
Речь идёт о фильтрации торговых сигналов! В сам процесс генерации мы не вмешиваемся, а дополняем ТС такими фильтрами, которые исключают какое-то количество ложных сигналов и улучшают характеристики системы, т.е. подстраиваем (адаптируем) её под рынок.
Если все сигналы приносят профит, то в фильтрации необходимости нет. Конечно, фильтр становится частью ТС, но говорить о том, что при этом в результате получили другую систему - не правильно. Если рассуждать по Вашему, то подстройка (или включение шумоподавления) радиоприёмника SONY на более качественный приём какой-то радиостанции приводит к тому, что мы получаем совершенно другой радиоприёмник, например Panasonic.
В любом случае, любая торговая система - это набор фильтров, которые и определяют логику ее работы, поэтому нельзя говорить о том что дополнительные фильтры настраивают имеющуюся - это уже иная торговая стратегия... то есть использование в коде программы, хоть одного блока if{} - это уже по определению реализация фильтра.... Поэтому все это стартово фигня... ...
"В любом случае, любая торговая система - это набор фильтров" генератор сигналов (торговых событий)!
"Речь идёт о фильтрации торговых сигналов! В сам процесс генерации мы не вмешиваемся, а дополняем ТС такими фильтрами, которые исключают какое-то количество ложных сигналов и улучшают характеристики системы, т.е. подстраиваем (адаптируем) её под рынок.
Если все сигналы приносят профит, то в фильтрации необходимости нет. Конечно, фильтр становится частью ТС, но говорить о том, что при этом в результате получили другую систему - не правильно. Если рассуждать по Вашему, то подстройка (или включение шумоподавления) радиоприёмника SONY на более качественный приём какой-то радиостанции приводит к тому, что мы получаем совершенно другой радиоприёмник, например Panasonic."
Тот же производитель SONY может иметь несколько моделей, а марка в данном случае определяется только производителем, так же как и возможности конкретной модели и те же методы приема сигналов оператором - это уже отдельная область стратегий работы с радиоприемом... Так что пример и вовсе ничо не объясняет... Более того - один и тот же торговый сигнал можно улучшить или ухудшить просто управлением капитала, в случае, если мы имеет расчитанную статистическую вероятность сигнала и хотя такой подход в технической терминологии не принято называть фильтром - это все равно фильтр. То есть, если мы имеем вероятность выпадения орла - решки, как вымеренную на 0.5 - то поставив ставку после двух выпаданий орлов подряд на третью решку мы скорее всего выиграем эту ставку. А если мы можем менять размер ставки, то уменьшая размер ставки, после очередного выигрыша в данном случае в два раза и после очередного проигрыша уменьшая в два раза - мы скорее всего также начнем упрямо зарабатывать.... Такая модель запросто может сделать и стратегию - "сливатор" прибыльным и никакой магии... А когда мы извлекаем из тестера стратегии прибыльный результат, без знания матожидания выигрыша каждого конкретного сигнала из которых система скручена, только лишь по результатам совкупности - это гаранированный слив не сегодня, так завтра.... и любые фовардтесты, без контроля статистики каждого сигнала фильтра стратегии в реальной работе - только подпитка иллюзии...
Флаг Вам в руки! НО Вы сбились с пути ...
С чего бы вдруг такое резюме? К примеру, считав вероятность по ряду торговых сигналов по нескольким таймфреймам и рынкам и проанализировав эти данные, с оценкой распределения, могу просто сгенериовать стратегию, которая приносит прибыль одновременно на всех тех торговых инструментах, на которых производился анализ - вот это на мой взгляд как раз и показательно... Будут у Вас такие же результаты, тогда и поговорим контекстно...