Индикатор PeriodAdaptiveMA

Советник DayAdaptiveMA_Expert_V1

Развернутые результаты тестирования

  

        Любимым индикатором многих трейдеров является средняя скользящая линия (Moving Average). С ее простотой и информативностью до сих пор не может сравниться ни один индикатор. Более того, процентов 90% всех индикаторов в той или иной мере используют в своих расчетах среднее значение цены за определенный период.

        Но у классической средней существует один недостаток, который часто вносит некоторую сумятицу в показания индикатора. Этим недостатком является непосредственно период средней - количество элементов данных, использующихся для расчета значения линии. Другими словами, на всем промежутке индикации линии мы видим данные фиксировано за последние PeriodMA (где PeriodMA - период средней) баров. С поступлением нового бара значение цены последнего в ряде бара отбрасывается, а на его место становится значение цены нового бара.

        Такой расчет средней цены может быть удобен по окончании какого-либо периода (дня или недели), но в  начале периода, например, при открытии торгового дня, он становится абсолютно бесполезен. Ведь то, что было вчера, уже мало влияет на теперешнее положение дел. Новый день несет свои тенденции, свое движение, а значит и среднюю цену нужно считать, начиная от открытия дня, а не оглядываться на предыдущий день.

        Также стоит уделить внимание понятию периода средней. Устанавливая фиксированный период на всем протяжении отображения средней линии, трейдер  привязывается к определенным числам, чаще всего это числа Фибоначчи. И дело здесь не в числах Фибоначчи, а именно в постоянности объема данных для усреднения. Зачем это делать? Не логичнее ли оперировать всем набором значений? Пусть после открытия дня прошло два бара. Значит, будем усреднять цену по двум значениям. Появился третий бар, усредним цену по трем значениям, четвертый - по четырем и т. д. В результате, периода средней как такового у нас не будет. С каждым новым баром этот период будет изменяться, а с наступлением нового дня весь расчет начнется заново.

         Описанный принцип построения средней скользящей воплотим в индикаторе PeriodAdaptiveMA (см. рис. 1).

 

Рис. 1. - Внешний вид индикатора PeriodAdaptiveMA.

    Как легко заметить, особенностью адаптивной средней (в данном случае дневной, так как привязка производится к началу торгового дня) является резкий скачок значения в конце дня. Это обусловлено тем, что на конец дня текущий период средней составляет уже более 20 баров, а с наступлением нового дня он падает до единицы и вновь начинает возрастать к концу дня.

    Входных параметров у индикатора PeriodAdaptiveMA всего три:

  • MethodMA - метод скользящей средней. Соответствует одному из четырех методов:  0 - Simple (простая средняя), 1 - Exponential (экспоненциальная средняя), 2 - Smoothed (сглаженная средняя), 3 - Linear Weighted  (линейно-взвешенная).

  • PriceMA - цена, по которой считается средняя. Может принимать одно из семи значений: 0 - Close (по ценам закрытия), 1 - Open (по ценам открытия), 2 - High (по максимумам свечей), 3 - Low (по минимумам свечей), 4 - Median Price (по средней цене (High+Low)/2), 5 - Typical Price (по типичной цене (High+Low+Close)/3), 6 - Weighted Close (по взвешенной цене закрытия (High+Low+Close+Close)/4).

  • LargeTF - таймфрейм, который берется в качестве базового. Открытие новой свечи этого таймфрейма является точкой отсчета для формирования значений средней с самого начала. Этот параметр может принимать такие значения: 1 - M1, 5 - M5, 15 - M15, 30 - M30, 60 - H1, 240 - H4, 1440 - D1, 10080 - W1 и 43200 - MN1. Еще стоит учитывать, что при выборе текущего таймфрейма, большего или равного таймфрейму LargeTF, индикатор работать не сможет. В этом случае в левом верхнем углу экрана будет выдано соответствующее сообщение.

    Что же дает нам полученная адаптивная средняя? Понятно, что в отличие от классической, адаптивная средняя неравномерно реагирует на изменения цены. В начале дня ее реакция на изменения относительно быстрая, так как данных еще немного и эквивалент периоду мал. А вот в конце дня наблюдается обратная картина - период уже возрос, данные накопились. И это приводит к замедленной реакции на изменения цены.

    В отличие от способа построения средней (неклассического), метод работы с ней стоит применять классический. Возьмем две адаптивные средние. Одну построим по максимумам, другую - по минимумам свечей. Получим канал, в котором цена будет появляться чаще, чем за его пределами. И применим тактику работы в канале. То есть, закрытие свечи выше верхней границы канала - это сигнал продажи, соответственно, закрытие свечи ниже нижней границы канала - это сигнал к покупке. Правда, не каждый такой сигнал необходимо исполнять. Ведь всем хорошо известны случаи, когда цена так и вертится вокруг средней без какого-либо направления -  на рынке флэт. Здесь нужно применить какой-то фильтр.

    В качестве фильтра флэтов удобно применять значение средней волатильности, которое показывает стандартный индикатор ATR. Средняя волатильность - это сумма всех длин свечей (разница между максимумом и минимумом свечи) за определенный период, деленная на этот же период. Далее от пользователя требуется задание нижней границы волатильности - среднего значения волатильности в пунктах, которое нужно относить к флэту. Например, для валютной пары GBPUSD средняя волатильность меньше 20 пунктов - это движение без направления. Понятно, что для каждой валютной пары это будет свое уникальное значение и со временем оно должно меняться.

    В итоге получаем следующую торговую систему (см. рис. 2).

 

Рис. 2. - Пример открытия сделок по индикатору PeriodAdaptiveMA с фильтром по ATR.

    На всем приведенном периоде значение ATR выше 20 пунктов (минимум 21, максимум 26). Поэтому любое закрытие свечи выше или ниже границы канала будет подтверждено фильтром по ATR. Воплощение системы в коде можно увидеть, открыв файл DayAdaptiveMA_Expert_V1 (ссылка в начале статьи).

    Как обычно, генерацией сигнала в коде эксперта занимается функция GetSignal, которая выглядит так:

 
//+-------------------------------------------------------------------------------------+
 //| Расчет сигнала по DayAdaptiveMA                                                     |
 //+-------------------------------------------------------------------------------------+
void GetSignal()
 {
 Signal = 0;                                                         // обнуление сигнала
 
 // - 1 - == Расчет дневной адаптивной средней ===========================================
 int DayBeginBar = iBarShift(Symbol(), 0, NowDay);
 ArrayInitialize(BufferHigh, 0);
 ArrayInitialize(BufferLow, 0);
 int Count = 0;
 for (int i = DayBeginBar; i > 0; i--)
   {
    BufferHigh[Count] = High[i];
    BufferLow[Count] = Low[i];
    Count++;  
    }   
  double MAHigh = ND(iMAOnArray(BufferHigh, Count, Count, 0, MethodMA, 0));
 double MALow = ND(iMAOnArray(BufferLow, Count, Count, 0, MethodMA, 0));
// - 1 - == Окончание блока =============================================================
 
 // - 2 - == Сигнал открытия BUY =========================================================
 if (Close[1] < MALow)                                     // Если закрытие свечи ниже МА
   Signal = 1;                                              // то это сигнал открытия BUY
 // - 2 - == Окончание блока =============================================================
 
 // - 3 - == Сигнал открытия SELL ========================================================
 if (Close[1] > MAHigh)                                    // Если закрытие свечи выше МА
   Signal = 2;                                             // то это сигнал открытия SELL
 // - 3 - == Окончание блока =============================================================
}

    В переменной NowDay всегда находится время открытия текущего дня. В итоге DayBeginBar будет указывать на первый бар текущих суток активного таймфрейма. В буферах BufferHigh и BufferLow происходит накопление данных для расчета среднего значения, с которым затем и сравниваются цены закрытия свечей.

    На данный момент приведенная система работает как переворотная - то есть сигнал открытия новой сделки является сигналом закрытия старой. Но в большинстве случаев это не очень эффективно, так как не сохраняет полученную прибыль. Поэтому просто необходимым условием будет применение уровня профита. Его будем вычислять из того же значения ATR. Кратность уровня профита показаниям индикатора пользователь сможет задавать при помощи внешнего параметра эксперта Mul.

    Еще одним ограничителем при совершении сделок будет выступать полученная прибыль. Например, в течение дня была совершена сделка, которая дала прибыль. Если трейдер торгует в неагрессивном стиле, то больше в этот день он производить сделки не будет, что и запрограммируем в эксперте. Если же сделка дала убыток, то следующую откроем с таким профитом, чтобы перекрыть полученный убыток. И так сделки будут открываться до конца дня, пока убыток не будет компенсирован. Для этого эксперт перед открытием новой сделки использует функцию IsTransactions:

 
//+-------------------------------------------------------------------------------------+
 //| Подсчет общей прибыли за текущий день                                               |
 //| Если общая прибыль меньше нуля или равна нулю, то возвращает False                  |
 //| Если общая прибыль больше нуля, то возвращает True                                  |
 //+-------------------------------------------------------------------------------------+
bool IsTransactions()
 {
 Profit = 0;
 for (int i = OrdersHistoryTotal()-1; i >= 0; i--)
   if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
     if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
       if (OrderOpenTime() >= NowDay)
         {
          if (OrderType() == OP_BUY)
            Profit += ND(OrderClosePrice()-OrderOpenPrice())/Tick;
           else 
             Profit += ND(OrderOpenPrice()-OrderClosePrice())/Tick;
         }
 if (Profit > 0) return(True);
 else            return(False);
 }

    Функция находит все сделки, открытые в течение текущего дня и подсчитывает их совокупную прибыль. Если прибыль положительная, то результат выполнения функции True, иначе - False. В результате, советник будет открывать сделки только в случае возврата функцией результата False.

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

    Общий набор входных параметров советника DayAdaptiveMA_Expert_V1 выглядит так:

  • Lots - фиксированный объем сделок, совершаемых советником

  • MinimumProfit - минимальный уровень профита в пунктах, при котором сделка будет открыта. Напомню, профит рассчитывается перемножением значения индикатора ATR и параметра Mul (см. ниже)

  • StopLoss - уровень стоп-приказа в пунктах от цены открытия. Если равен нулю, то советник его не выставляет.

  • Mul - коэффициент, на который умножается значение ATR для формирования уровня профита.

  • MethodMA - метод средней скользящей (от 0 до 3)

  • BeginHour, BeginMinute - время (ЧЧ:ММ), по достижению которого в середине дня можно открывать новые сделки. Умолчательное значение 00:00 позволяет открывать сделки всегда.

  • OpenOrderSound - звук, издаваемый при открытии новой сделки

  • MagicNumber - магик советника для отличия своих сделок от сделок, проводимых на этой же валютной паре другим советником или вручную трейдером.

    Тестирование советника проведем на таймфрейме H1 и историческом промежутке 01.01.2008 - 01.09.2009 (см. рис. 3-6), все значения входных параметров советника взяты по умолчанию:

 

Рис. 3. - График кривой баланса, полученный при тестировании советника на валютной паре EURUSD.

 

Рис. 4. - График кривой баланса, полученный при тестировании советника на валютной паре USDCHF.

 

Рис. 5. - График кривой баланса, полученный при тестировании советника на валютной паре GBPUSD.

 

Рис. 6. - График кривой баланса, полученный при тестировании советника на валютной паре USDJPY.

 

        Полученные результаты не особо радуют. Только по двум валютным парам получена чистая прибыль, да и то ее размер не сопоставим с просадками. Так, на паре EURUSD чистая прибыль составила 494.43 доллара против максимальной просадки 980.45, что дало фактор восстановления меньше единицы (0.5). По GBPUSD результаты еще плачевнее - чистая прибыль 226.92 доллара против максимальной просадки 1629.01 и фактором восстановления 0.14.

        Отсюда следует, что система не может быть использована в автоматическом режиме. Постоянный контроль эксперта трейдером просто необходимо. Для этого со стороны трейдера потребуется выявление направления текущего тренда по другим, отличным от данной, методикам и запрет совершения сделок экспертом против тренда.

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

Игорь Герасько

Сентябрь 2009