Kaur
Руслан Каюмов

 
Уровень 47

  Торгую в компаниях:

  Моя торговля


График торгового счета Kaur


Группа "Школа трейдеров"

Рейтинг 330



Оптимизация торговой стратегии по месяцам - TMY

В марте я показывал тест стратегии T201 за период с 2002-го по 2015-ый года.



Несмотря на устойчивость системы, результат оставляет желать лучшего. Средний годовой доход равен средней просадке. Максимальная просадка достигает 75% (в таблице этого не видно, так как максимальная просадка достигнута не внутри одного года). Есть 2 убыточных года.

Я искал способы оптимизации, но такие, чтобы это не сказалось на устойчивости стратегии. Пытался вводить трейлинг, раннюю фиксацию убыточных позиций, динамические стопы… Но все не то.

 
 

Анализируем работу стратегии по месяцам


Затем я решил проанализировать работу ТС по месяцам. Прежде всего меня интересовало его поведение в праздничный период — две недели до НГ и две недели после. В этом году я не останавливал работу в праздники, потому что у меня не было тестов на этот счет.

Я провел тесты ТС, составляя отдельные графики для каждого месяца.
Да, для января и декабря результаты были не очень.

Вот тест стратегии при торговле за 13 лет только в январе:


Как видите, в январе большие скачки эквити в разные стороны. Это увеличивает фактор непредсказуемости и потенциальную просадку.

Декабрь себя ведет так:


Что ж, для уверенности Декабрь-Январь можно исключить. Я пытался также исключать их не полностью, а частично (вторую половину декабря и первую половину января) — результат оказывался хуже.

Но этой статьи бы не было, если все сводилось бы к исключению праздничного периода. Удивительно стало вот что. Есть месяцы, которые почти все 13 лет стабильно давали только плюс, показывали идеальный график.
Смотрим:





Я напоминаю, что эти графики показывают торговлю внутри выбранного месяца на протяжении 13-ти последних лет. Т.е. с 2002 года торговля в Феврале, Мае, Сентябре и Ноябре была практически идеальна. ТТТ

И наоборот, есть месяцы, которые стабильно показывали все это время минус. Например, Август


 
 

Результат оптимизации по месяцам


Итак, на основании проведенных тестов я исключил из торговли Декабрь-Январь, Август, Октябрь.

Результат торговли по оставшимся месяцам


Сравните с первым изображением в статье. График эквити выправился, средняя просадка уменьшилась, средний годовой доход вырос, убыточные года исчезли. Общая максимальная просадка тоже снизилась с 75% до 50%.

При этом исключение месяцев является довольно мягкой оптимизацией. Ведь не приходится изменять параметры стратегии. Значит риск подгонки не увеличивается. Максимум, чем мы рискуем при такой оптимизации, — недополучить прибыль по сравнению с исходной стратегией.

Данная версия ТС получила номер Т205 и была установлена на ПАММ Альпари.

 
 

Почему это может сработать?


Одним из самых известных трейдеров, который использует статистику по месяцам, дням недели и пр., является Ларри Вильямс. Об этом он пишет в своей книге «Долгосрочные секреты краткосрочной торговли». В частности, продвигает там концепцию TDW (Trading Day of the Week) и TDM (Trading Day of the Mounth).

Моя стратегия — найти смещение типа TDW и TDM, а затем соединить его с другим смещением, чтобы перетасовать колоду в свою пользу. Если бы вы и я играли в карты на деньги, поверьте, я пришел бы с меченой и подтасованной колодой, и это именно то, как я хочу торговать: чтобы как можно больше шансов было в мою пользу.
Ларри Вильямс, «Долгосрочные секреты краткосрочной торговли»

(Ларри Вильямс — известный трейдер, управляющий и автор книг. Прославился благодаря победе в Кубке Робинсона, когда ему удалось на фьючерсах заработать $1 млн. из $10 тыс.)


TDM отличается от того, что я делал выше в статье.
Если пользоваться номенклатурой Ларри, то метод торговых месяцев стоит назвать TMY, или просто TM — Trading Mounth of the Year.
Но по сути это все частные случаи одного метода, который использует статистику календарных торговых периодов.

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

Я исключил по итогам теста Август, провальный график для августа вы видели. Сезон отпусков? Раньше я делал исследование сезонной активности рынков. Вторая половина августа оказалась одним из самых низковолатильных периодов. Возможно, ключ в этом.

Так или иначе я верю в закономерности на основе календарных периодов. Они обладают большим смыслом, чем некоторые индикаторы.

 
 

Как самому проверить торговый робот на месяцы и дни недели?


В MQL добавить такую проверку несложно. Используйте соответственно функции TimeMonth() и TimeDayOfWeek()
Чтобы применить функцию к актуальной дате помещаем внутрь скобок TimeCurrent()

Условие на проверку месяца или дня недели вставляем в блок проверки условия на открытие BUY и SELL.
Например, выражение if (TimeMonth(TimeCurrent())==1 позволит поставить условие на торговлю только в Январе.

Я советую сначала составлять графики для отдельных периодов, оценить динамику эквити и только потом принимать решение об исключении этого периода.

Так в моем торговом роботе выглядит конечный код (не будем усложнять рационализацией и выносом в параметры), исключающий из торговли Декбарь, Январь, Август, Октябрь:
if (TimeMonth(TimeCurrent())!=12 && TimeMonth(TimeCurrent())!=1 && TimeMonth(TimeCurrent())!=8 && TimeMonth(TimeCurrent())!=10)
{
  // ...здесь проверки на открытие BUY и SELL
}
  • +10
  • Просмотров: 10126
  • 6 апреля 2015, 20:51
  • Kaur
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Школа трейдеров", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
16 января 2015
23 апреля 2015

Комментарии (6)

+
+5
Мой эксперимент с советником 20/200 Pips.

Убыточные месяцы: 3,4,6,8.
Убыточные дни понедельник и среда.

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

if(OrdersTotal()<1 && Month()!=3  && Month()!=4  && Month()!=6  && Month()!=8 /*&& Month()==month*/)


Тест до:

Тест после:



//+------------------------------------------------------------------+
//|                                               20/200 expert.mq4  |
//|                                                    1H   EUR/USD  |
//|                                                    Smirnov Pavel |
//|                                                 www.autoforex.ru |
//+------------------------------------------------------------------+

#property copyright "Smirnov Pavel"
#property link      "www.autoforex.ru"

extern int TakeProfit= 200; // Уровень тейкпрофит в пунктах
extern int StopLoss = 2000; // уровень стоплосс в пунктах
extern int TradeTime=18;
extern int t1=7;
extern int t2=2;
extern int delta=70;
extern int month=1;
extern double lot=0.1;

int ticket;
bool cantrade=true;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OpenLong(double volume=0.1)
  {
   int slippage=10;
   string comment="20/200 expert (Long)";
   color arrow_color=Red;
   int magic=0;

   ticket=OrderSend(Symbol(),OP_BUY,volume,Ask,slippage,Ask-StopLoss*Point,
                    Ask+TakeProfit*Point,comment,magic,0,arrow_color);
   if(ticket>0)
     {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
        {
         Print("Buy order opened : ",OrderOpenPrice());
         return(0);
        }
     }
   else
     {
      Print("Error opening Buy order : ",GetLastError());
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OpenShort(double volume=0.1)
  {
   int slippage=10;
   string comment="20/200 expert (Short)";
   color arrow_color=Red;
   int magic=0;

   ticket=OrderSend(Symbol(),OP_SELL,volume,Bid,slippage,Bid+StopLoss*Point,
                    Bid-TakeProfit*Point,comment,magic,0,arrow_color);
   if(ticket>0)
     {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
        {
         Print("Sell order opened : ",OrderOpenPrice());
         return(0);
        }
     }
   else
     {
      Print("Error opening Sell order : ",GetLastError());
      return(-1);
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if((TimeHour(TimeCurrent())>TradeTime)) cantrade=true;
// проверяем есть ли открытые ордера ...
   if(OrdersTotal()<1 && Month()!=3  && Month()!=4  && Month()!=6  && Month()!=8 /*&& Month()==month*/)
     {
      // ... если нет ни одного открытого ордера, то идем дальше
      // проверяем настало ли время для торговли
      if((TimeHour(TimeCurrent())==TradeTime) && (cantrade))
        {
         // ... если настало время, то
         if((Open[t1]-Open[t2])>delta*Point) //Если цена изменилась на величину delta
           {
            //условие выполнено значит входим в короткую позицию:
            // проверяем есть ли свободные деньги для открытия короткой позиции
            if(AccountFreeMarginCheck(Symbol(),OP_SELL,lot)<=0 || GetLastError()==134)
              {
               Print("Not enough money");
               return(0);
              }
            OpenShort(lot);
            cantrade=false; //запрещаем торговать повторно до следующего бара
            return(0);
           }
         if((Open[t2]-Open[t1])>delta*Point) //Если цена изменилась на величину delta
           {
            // условие выполнено значит входим в длинную позицию
            // проверяем есть ли свободные деньги на счету
            if(AccountFreeMarginCheck(Symbol(),OP_BUY,lot)<=0 || GetLastError()==134)
              {
               Print("Not enough money");
               return(0);
              }
            OpenLong(lot);
            cantrade=false;
            return(0);
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+


Редактирован: 6 апреля 2015, 23:46
avatar

  34  AM2 Сообщений: 15871 - Андрей

  • 6 апреля 2015, 23:06
+
+1
Интересно. И тоже помимо января исключен август.
avatar

  47  Kaur Автор Сообщений: 1327 - Руслан Каюмов

  • 7 апреля 2015, 22:19
+
+2
Руслан, как называется ПАММ? вложусь немного.
avatar

  4  krebsaleks Сообщений: 5 - Александр

  • 7 апреля 2015, 10:48
+
+2
ПАММ вот — ***(удалено, ПАММ ликвидирован)
Но сделок на нем пока не открывалось. Есть смысл подождать, пока на нем накопится история.
Редактирован: 16 июля 2017, 10:18
avatar

  47  Kaur Автор Сообщений: 1327 - Руслан Каюмов

  • 7 апреля 2015, 22:18
+
0
Скинул небольшую сумму посмотрим
avatar

  6  pomk93 Сообщений: 59

  • 16 июля 2017, 07:09
+
0
Можно узнать, куда Вы скинули? Вроде скидывать некуда на данный момент.
avatar

  47  Kaur Автор Сообщений: 1327 - Руслан Каюмов

  • 16 июля 2017, 10:19

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари