Магия фильтрации

Автор: lexy Пятница, Сентябрь 5th, 2014 Нет комментариев

Рубрика: Разное

Большинство разработчиков механических торговых систем (МТС), так или иначе, использует фильтрацию сигналов. При этом считают, что это, хоть и не единственный, но наиболее эффективный способ улучшения характеристик МТС. Начинающие «граалестроители» очень часто попадают под влияние магии фильтров. Ведь как просто — взять готовую торговую стратегию, навесить на неё десяток фильтров и вот он, ура — прибыльный советник.

Однако, есть и противники применения фильтров. Фильтры значительно (иногда в 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 График изменения баланса. Исходный советник без фильтров

Анализ результатов:

  1. Советник прибыльный, и прибыльных сделок больше 60% — это хорошо.
  2. Максимальная просадка 20% от депозита и больше 3000$ при минимальном размере лота — это плохо.
  3. Общее количество сделок вполне достаточно для применения фильтрации (>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 Сравнительная таблица отчётов тестирования П-фильтров

Анализ результатов:

  1. Чистая прибыль увеличилась только на П-фильтре «PERIOD_H1″ (4408.91=>4829.05).
  2. Лидером по матожиданию стал П-фильтр «PERIOD_M30″ (1.34=>3.59).
  3. Максимальная просадка снизилась на всех фильтрах. Минимальное значение просадки получили на фильтре «PERIOD_M5″ (3001.74=>1608.30).
  4. Фильтрация сократила общее количество сделок в 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 График изменения баланса. Д-фильтр по часам

Анализ результатов фильтрации:

  1. Снижения просадки — не добились. Она не только не уменьшилась, но даже немного увеличилась (3001.74 => 3016.21)!?
  2. Чистая прибыль выросла примерно на 50% (4408.91 => 6567.66). Это конечно радует, но количество сделок при этом сократилось почти в 2 раза (3284 => 1590).
  3. Матожидание Д-фильтра (4.13) выше лучшего значения из всех исследованных П-фильтров (3.59).
  4. Количество прибыльных сделок сократилось (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 Сравнительная таблица отчётов тестирования комбинаций двух фильтров: П-фильтра и Д-фильтра

Анализ результатов:

  1. Если сравнивать по критериям прибыль, прибыльность и матожидание, то лучшие результаты показал вариант сложения двух фильтров.
  2. А вот по просадке выигрывает вариант оптимизации фильтров.
  3. В любом случае, фильтрация улучшает характеристики МТС.

Заключение

  1. Так в чём же магия фильтрации? В её простоте и возможности изменить характеристики любого советника.
  2. Предложенная технология создания фильтров, не предназначена для «тупого» копирования. Она лишь показывает, каким образом можно разработать П-фильтр и Д-фильтр для конкретного советника. Фильтр, который подходит для одного советника, другому может быть противопоказан.
  3. И помните, идеальная МТС не нуждается в фильтрах! … Вы ведь такую мечтаете создать систему?
  4. Я знаю, что код советника и фильтров не оптимизирован и тем более не идеален. Но для целей данной статьи был выбран именно такой стиль программирования. В первую очередь для того, чтобы любой «чайник» смог повторить изложенное и создать свои собственные уникальные фильтры.
  5. ВНИМАНИЕ! Ни в коем случае не используйте исследуемый в статье советник в реальной торговле!
Прикрепленные файлы:
 DC2008_revers filters.mq4 (8.4 Kb)
 DC2008_revers.mq4 (7.4 Kb)
Источник: mql4.com

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты