English 中文 Español Deutsch 日本語 Português
Магия фильтрации

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

MetaTrader 4Торговые системы | 15 февраля 2010, 09:39
7 154 21
Sergey Pavlov
Sergey Pavlov

Введение

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

Однако, есть и противники применения фильтров. Фильтры значительно (иногда в 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. ВНИМАНИЕ! Ни в коем случае не используйте исследуемый в статье советник в реальной торговле!
Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (21)
Sergey
Sergey | 26 июн. 2010 в 18:26

В любом случае, любая торговая система - это набор фильтров, которые и определяют логику ее работы, поэтому нельзя говорить о том что дополнительные фильтры настраивают имеющуюся - это уже иная торговая стратегия... то есть использование в коде программы, хоть одного блока if{} - это уже по определению реализация фильтра.... Поэтому все это стартово фигня... начально надо извлекать статистику с рынка, а потом уже тупо вбивать эти параметры в систему... свою или имеющуюся подходящую, при этом очень достойных тут же в кодобазе более, чем достаточно и о чудо! - ты вдруг имеешь сразу прибыльную систему, при этом с гораздо лучшими параметрами, чем извлек сам автор на оптимизации...

Sergey Pavlov
Sergey Pavlov | 2 июл. 2010 в 06:07
dasmen:

В любом случае, любая торговая система - это набор фильтров, которые и определяют логику ее работы, поэтому нельзя говорить о том что дополнительные фильтры настраивают имеющуюся - это уже иная торговая стратегия... то есть использование в коде программы, хоть одного блока if{} - это уже по определению реализация фильтра.... Поэтому все это стартово фигня... ...

"В любом случае, любая торговая система - это набор фильтров" генератор сигналов (торговых событий)!

Речь идёт о фильтрации торговых сигналов! В сам процесс генерации мы не вмешиваемся, а дополняем ТС такими фильтрами, которые исключают какое-то количество ложных сигналов и улучшают характеристики системы, т.е. подстраиваем (адаптируем) её под рынок.

Если все сигналы приносят профит, то в фильтрации необходимости нет. Конечно, фильтр становится частью ТС, но говорить о том, что при этом в результате получили другую систему - не правильно. Если рассуждать по Вашему, то подстройка (или включение шумоподавления) радиоприёмника SONY на более качественный приём какой-то радиостанции приводит к тому, что мы получаем совершенно другой радиоприёмник, например Panasonic.

Sergey
Sergey | 27 июл. 2010 в 14:44
DC2008:
dasmen:

В любом случае, любая торговая система - это набор фильтров, которые и определяют логику ее работы, поэтому нельзя говорить о том что дополнительные фильтры настраивают имеющуюся - это уже иная торговая стратегия... то есть использование в коде программы, хоть одного блока if{} - это уже по определению реализация фильтра.... Поэтому все это стартово фигня... ...

"В любом случае, любая торговая система - это набор фильтров" генератор сигналов (торговых событий)!

"Речь идёт о фильтрации торговых сигналов! В сам процесс генерации мы не вмешиваемся, а дополняем ТС такими фильтрами, которые исключают какое-то количество ложных сигналов и улучшают характеристики системы, т.е. подстраиваем (адаптируем) её под рынок.

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

Тот же производитель SONY может иметь несколько моделей, а марка в данном случае определяется только производителем, так же как и возможности конкретной модели и те же методы приема сигналов оператором - это уже отдельная область стратегий работы с радиоприемом... Так что пример и вовсе ничо не объясняет... Более того - один и тот же торговый сигнал можно улучшить или ухудшить просто управлением капитала, в случае, если мы имеет расчитанную статистическую вероятность сигнала и хотя такой подход в технической терминологии не принято называть фильтром - это все равно фильтр. То есть, если мы имеем вероятность выпадения орла - решки, как вымеренную на 0.5 - то поставив ставку после двух выпаданий орлов подряд на третью решку мы скорее всего выиграем эту ставку. А если мы можем менять размер ставки, то уменьшая размер ставки, после очередного выигрыша в данном случае в два раза и после очередного проигрыша уменьшая в два раза - мы скорее всего также начнем упрямо зарабатывать.... Такая модель запросто может сделать и стратегию - "сливатор" прибыльным и никакой магии... А когда мы извлекаем из тестера стратегии прибыльный результат, без знания матожидания выигрыша каждого конкретного сигнала из которых система скручена, только лишь по результатам совкупности - это гаранированный слив не сегодня, так завтра.... и любые фовардтесты, без контроля статистики каждого сигнала фильтра стратегии в реальной работе - только подпитка иллюзии...


Sergey Pavlov
Sergey Pavlov | 27 июл. 2010 в 19:57
dasmen:
... Так что пример и вовсе ничо не объясняет... Более того - один и тот же торговый сигнал можно улучшить или ухудшить просто управлением капитала, в случае, если мы имеет расчитанную статистическую вероятность сигнала и хотя такой подход в технической терминологии не принято называть фильтром - это все равно фильтр. То есть, если мы имеем вероятность выпадения орла - решки, как вымеренную на 0.5 - то поставив ставку после двух выпаданий орлов подряд на третью решку мы скорее всего выиграем эту ставку. А если мы можем менять размер ставки, то уменьшая размер ставки, после очередного выигрыша в данном случае в два раза и после очередного проигрыша уменьшая в два раза - мы скорее всего также начнем упрямо зарабатывать....
Флаг Вам в руки! НО Вы сбились с пути ...
Sergey
Sergey | 6 авг. 2010 в 02:04
DC2008:

Флаг Вам в руки! НО Вы сбились с пути ...

С чего бы вдруг такое резюме? К примеру, считав вероятность по ряду торговых сигналов по нескольким таймфреймам и рынкам и проанализировав эти данные, с оценкой распределения, могу просто сгенериовать стратегию, которая приносит прибыль одновременно на всех тех торговых инструментах, на которых производился анализ - вот это на мой взгляд как раз и показательно... Будут у Вас такие же результаты, тогда и поговорим контекстно...

МetaTrader 5. Экспорт котировок в .NET приложение, используя WCF сервисы МetaTrader 5. Экспорт котировок в .NET приложение, используя WCF сервисы
Вам необходимо организовать трансляцию котировок из MetaTrader 5 в собственное приложение? Связка MQL5-DLL позволяет создавать подобные решения. В статье продемонстрирован один из способов трансляции котировок из MetaTrader 5 в приложения, написанные на .NET. Мне было рациональнее, интереснее и проще реализовать экспорт котировок именно с использованием этой платформы. К сожалению, с выходом "пятерки" поддержки .Net также не появилось, поэтому по старинке будем использовать как прослойку win32 dll с поддержкой .NET.
Индикатор от индикатора в MQL5 Индикатор от индикатора в MQL5
При написании индикатора, который использует краткую форму вызова функции OnCalculate(), можно упустить то обстоятельство, что индикатор может рассчитываться не только на ценовых данных, но и на данных другого индикатора (встроенного или пользовательского - не имеет значения). Вы хотите улучшить индикатор, чтобы он правильно считался не только на ценовых данных, но и значениях другого индикатора? В этой статье мы по шагам пройдем все необходимые этапы такой модификации и выведем дополнительные полезные правила для правильного написания индикатора.
MQL5.community - Памятка пользователя MQL5.community - Памятка пользователя
Вы недавно зарегистрировались и у вас возникли вопросы: Как вставить картинку в сообщение на форуме, как красиво оформить исходный код MQL5, где находятся ваши Личные сообщения? В этой статье мы подготовили для вас несколько практических советов, которые помогут быстрее освоиться на сайте MQL5.community и позволят в полной мере воспользоваться доступными функциональными возможностями.
Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными? Как за 10 минут написать DLL библиотеку для MQL5 и обмениваться данными?
Так уж сложилось, что сейчас мало кто из разработчиков помнит, как написать простую DLL библиотеку и в чем особенности связывания разнородных систем. Я постараюсь за 10 минут на примерах продемонстрировать весь процесс создания простых DLL библиотек и раскрою некоторые технические детали нашей реализации связывания. Покажу пошаговый процесс создания DLL библиотеки в Visual Studio с примерами передачи разных типов переменных (числа, массивы, строки и т.д.) и защиту клиентского терминала от падений в пользовательских DLL.