Советник Complex_Expert

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

Файлы предустановок

 

        Не секрет, что большинство используемых трейдерами стратегий торговли являются довольно простыми, но от этого не менее действенными. Чаще всего эти стратегии основаны на стандартных индикаторах, которые встроены в МТ4. И, что самое интересное, сам принцип работы по этим встроенным индикаторам является довольно однообразным за редким исключением. 

        Например, стратегия торговли по индикатору Moving Average чаще всего основана на пересечении двух средних скользящих с разным периодом или разным сдвигом, различные осцилляторы (MACD, Stochastic, RSI, RVI и т. д.) дают сигналы при пересечении своих главных и сигнальных линий или (в случае отсутствия сигнальной линии) при пересечении заданных пользователем уровней.

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

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

        Также стоит учесть возможность комбинирования нескольких индикаторов, так как далеко не каждую стратегию можно реализовать на одном индикаторе. Этого можно достичь, придав одинаковые веса сигналу каждого индикатива. В результате, при использовании двух индикаторов, для получения сигнала BUY нам нужно, чтобы каждый из них дал сигнал BUY. Если присвоить сигналу BUY, полученного от одного индикатора, значение 1, то совместный сигнал от двух систем должен быть равен двум. Сигналу SELL можно присвоить значение -1, тогда суммарный SELL должен быть равен -2. В таком случае все остальные значения суммарного сигнала (0, 1, -1) будут эквивалентны событию "нет сигнала".

        Итак, остается только описать включаемые в код комплексного советника министратегии, каждая из которых основана на одном индикаторе. Описание в каждом случае будет довольно лаконичным, так как мы оперируем всего лишь тремя типами сигналов. А для того чтобы не приводить целиком функцию GetSignal, которая на этот раз вышла очень громоздкой, разобьем ее по индикаторам. Каждому индикатору для включения/выключения соответствует свой параметр, начинающийся со слова "Use", за которым следует сокращенное название индикатора. 

   

    1) Average Directional Movement Index (ADX)

       Оперирует только двумя типами сигналов:   BUY - главная линия находится выше сигнальной,  SELL - главная линия находится ниже сигнальной. Состояние "нет сигнала" не используется. Стратегией можно управлять при помощи внешних переменных ADXPeriod (период индикатора) и ADXPrice (цена, по которой считаются значения).

 
 if (UseADX)
   {
    double PlusDI1 = iADX(Symbol(), 0, ADXPeriod, ADXPrice, MODE_PLUSDI, 1); 
    double MinusDI1 = iADX(Symbol(), 0, ADXPeriod, ADXPrice, MODE_MINUSDI, 1); 
    if (PlusDI1 > MinusDI1)                                                 // Buy Signal
      Signal++;
    if (PlusDI1 < MinusDI1)                                                // Sell Signal
      Signal--;
   }

     

    2) Полосы Боллинджера (Bollinger Bands)

        Присутствуют все три типа сигналов: BUY - цена закрытия предыдущей свечи ниже нижней линии, SELL - цена закрытия предыдущей свечи выше верхней линии, "нет сигнала" - цена закрытия свечи между линиями. Внешние переменные, соответствуют: периоду индикатора (BandsPeriod), смещению вправо (BandsShift), отклонению (BandsDeviation) и цене расчета (BandsPrice).

 
 if (UseBollinger)
   {
    double BandsUp = iBands(Symbol(), 0, BandsPeriod, BandsDeviation, BandsShift, 
                            BandsPrice, MODE_UPPER, 1); 
    double BandsDn = iBands(Symbol(), 0, BandsPeriod, BandsDeviation, BandsShift, 
                            BandsPrice, MODE_LOWER, 1); 
    if (Close[1] < BandsDn)                                                 // Buy Signal
      Signal++;
    if (Close[1] > BandsUp)                                                // Sell Signal
      Signal--;
   }

    

    3) Commodity Channel Index (CCI)

        Также используются все три сигнала, но основное состояние все же "нет сигнала". Редкое появление торговых сигналов соответствует пересечению верхнего уровня сверху вниз (BUY) и пересечению нижнего уровня снизу вверх (SELL). Верхний и нижний уровни определяются значением внешних параметров CCIHighLevel и CCILowLevel. Период и цена расчета индикатора определяются значениями CCIPeriod и CCIPrice.

 
 if (UseCCI)
   {
    double CCI1 = iCCI(Symbol(), 0, CCIPeriod, CCIPrice, 1); 
    double CCI2 = iCCI(Symbol(), 0, CCIPeriod, CCIPrice, 2); 
    if (CCI2 < CCILowLevel && CCI1 > CCILowLevel && CCI1 < CCIHighLevel)    // Buy Signal
      Signal++;
    if (CCI2 > CCIHighLevel && CCI1 < CCIHighLevel && CCI1 > CCILowLevel)  // Sell Signal
      Signal--;
   } 

    

    4) MovingAverage (MA)

        Сигнал рассчитывается по взаимному расположению двух средних скользящих, одна из которых должна иметь меньший период (быстрая МА), а другая, соответственно, больший (медленная МА). Их параметры можно указать в таких переменных: MAFastPeriod и MASlowPeriod (периоды средних), MAFastPrice и MASlowPrice (цены расчета средних), MAFastShift и MASlowShift (смещения вправо), MAFastMethod и MASlowMethod (метод усреднения - простой, экспоненциальный, сглаженный, линейно-взвешенный). Сигнал BUY выдается, когда быстрая МА располагается выше медленной, а сигнал SELL, когда медленная выше быстрой. Состояние "нет сигнала" не используется.

 
 if (UseCrossMA)
   {
    double MAFast = iMA(Symbol(), 0, MAFastPeriod, MAFastShift, MAFastMethod, 
                         MAFastPrice, 1); 
    double MASlow = iMA(Symbol(), 0, MASlowPeriod, MASlowShift, MASlowMethod, 
                         MASlowPrice, 1); 
    if (MAFast > MASlow)                                                    // Buy Signal
      Signal++;
    if (MAFast < MASlow)                                                  // Sell Signal
      Signal--;
   }

    

    5) Parabolic SAR

        Управляется значением внешних переменных SARStep (шаг индикатора) и SARMaximum (максимум индикатора). Сигнал BUY поступает, когда точка параболика находится ниже цены открытия свечи, а сигнал SELL, когда точка находится выше цены открытия свечи. "Нет сигнала" также не используется.

 
 if (UseSAR)
   {
    double SAR = iSAR(Symbol(), 0, SARStep, SARMaximum, 1); 
    if (SAR < Open[1])                                                      // Buy Signal
      Signal++;
    if (SAR > Open[1])                                                     // Sell Signal
      Signal--;
   }

    

    6) Standard Deviation (StDev)

        Этому индикатору соответствует четыре параметра: StDevPeriod (период индикатора), StDevPrice (цена расчета индикатора), StDevShift (смещение вправо) и StDevMethod (метод сглаживания). Сигнал BUY поступает, если значения индикатора растут (предыдущее больше еще более раннего), а сигнал SELL подается, когда значения индикатора падают (предыдущее меньше более раннего). Состояния "нет сигнала" нет.

 
 if (UseStDev)
   {
    double SD1 = iStdDev(Symbol(), 0, StDevPeriod, StDevShift, StDevMethod, 
                         StDevPrice, 1); 
    double SD2 = iStdDev(Symbol(), 0, StDevPeriod, StDevShift, StDevMethod, 
                         StDevPrice, 2); 
    if (SD1 > SD2)                                                          // Buy Signal
      Signal++;
    if (SD1 < SD2)                                                         // Sell Signal
      Signal--;
   }

    

    7) Moving Average Convergence/Divergence (MACD)

        Оперирует четырьмя переменными: MACDFast (период быстрой МА), MACDSlow (период медленной МА), MACDSignal (период сигнальной МА) и MAPrice (цена расчета средних). Сигналы также просты: BUY - главная линия выше сигнальной, SELL - главная линия ниже сигнальной. "Нет сигнала" не используется.

 
 if (UseMACD)
   {
    double MACDMain = iMACD(Symbol(), 0, MACDFast, MACDSlow, MACDSignal, MACDPrice,  
                         MODE_MAIN, 1); 
    double MACDSig = iMACD(Symbol(), 0, MACDFast, MACDSlow, MACDSignal, MACDPrice,
                         MODE_SIGNAL, 1); 
    if (MACDMain > MACDSig)                                              // Buy Signal
      Signal++;
    if (MACDMain < MACDSig)                                             // Sell Signal
      Signal--;
   }

    

    8) Индикатор DeMarker

        Формирует сигналы подобно CCI: BUY - линия индикатора пересекает уровень перекупленности (DMHighLevel) сверху вниз, SELL - линия индикатора пересекает уровень перепроданности (DMLowLevel) снизу вверх, "нет сигнала" - все остальные свечи, где не зафиксированы сигналы покупки или продажи. Период индикатора указывается в переменной DMPeriod.

 
 if (UseDeMarker)
   {
    double DM1 = iDeMarker(Symbol(), 0, DMPeriod, 1); 
    double DM2 = iDeMarker(Symbol(), 0, DMPeriod, 2); 
    if (DM1 > DMLowLevel && DM2 < DMLowLevel && DM1 < DMHighLevel)          // Buy Signal
      Signal++;
    if (DM1 < DMHighLevel && DM2 > DMHighLevel && DM1 > DMLowLevel)        // Sell Signal
      Signal--;
   }

    

    9) Индикатор Envelopes 

        Использует целых пять внешних переменных: EnvPeriod (период индикатора), EnvPrice (цена расчета), EnvShift (сдвиг вправо), EnvMethod (метод сглаживания) и EnvDeviation (отклонение индикатора). Так как внешний вид, да и сама суть индикатора - канал, то сигналы подобны сигналам при работе в канале: BUY - цена закрытия свечи ниже нижней линии, SELL - цена закрытия свечи выше верхней линии и "нет сигнала" - цена закрытия между линиями.

 
 if (UseEnvelopes)
   {
    double EnvUp = iEnvelopes(Symbol(), 0, EnvPeriod, EnvMethod, EnvShift, EnvPrice,
                              EnvDeviation, MODE_UPPER, 1); 
    double EnvDn = iEnvelopes(Symbol(), 0, EnvPeriod, EnvMethod, EnvShift, EnvPrice,
                              EnvDeviation, MODE_LOWER, 1); 
    if (Close[1] < EnvDn)                                                 // Buy Signal
      Signal++;
    if (Close[1] > EnvUp)                                                // Sell Signal
      Signal--;
   }

    

    10) Индикатор Force Index

        К нему относятся три внешние переменные: FIPeriod (период индикатора), FIPrice (цена расчета) и FIMethod (метод усреднения). Сигналы идентичны сигналам индикатора StDev: BUY - растущие значения (предыдущее выше ему предшествующего) и SELL - падающие значения (предыдущее ниже ему предшествующего). Состояние "нет сигнала" не используется.

 
 if (UseForceIndex)
   {
    double FI = iForce(Symbol(), 0, FIPeriod, FIMethod, FIPrice, 1); 
    if (FI > 0)                                                             // Buy Signal
      Signal++;
    if (FI < 0)                                                            // Sell Signal
      Signal--;
   }

    

    11) Индикатор Momentum

        Пользователю доступны для изменения только два параметра: MomPeriod (период моментума) и MomPrice (цена расчета). Сигналы такие же, как и у Force Index: BUY - растущие значения (предыдущее выше ему предшествующего) и SELL - падающие значения (предыдущее ниже ему предшествующего). Состояние "нет сигнала" не используется.

 
 if (UseMomentum)
   {
    double Mom1 = iMomentum(Symbol(), 0, MomPeriod, MomPrice, 1); 
    double Mom2 = iMomentum(Symbol(), 0, MomPeriod, MomPrice, 2); 
    if (Mom1 > Mom2)                                                        // Buy Signal
      Signal++;
    if (Mom1 < Mom2)                                                       // Sell Signal
      Signal--;
   }

    

    12) Moving Average of Oscillator (OsMA)

        Осциллятор обладает таким же набором параметров, как и MACD: OsMAFast (период быстрой МА), OsMASlow (период медленной МА), OsMASignal (период сигнальной МА) и OsMAprice (цена расчета). Но сигналы считаются немного по-другому: BUY - значение гистограммы выше нуля, SELL - значение гистограммы ниже нуля. Состояние "нет сигнала" будет лишь в тех редких случаях, когда значение OsMA будет равно нулю.

 
 if (UseOsMA)
   {
    double OsMA = iOsMA(Symbol(), 0, OsMAFast, OsMASlow, OsMASignal, OsMAPrice, 1); 

    if (OsMA > 0)                                                           // Buy Signal
      Signal++;
    if (OsMA < 0)                                                          // Sell Signal
      Signal--;
   }

    

    13) Индикатор RSI

        Подобен CCI и DeMarker'у. Сигналами являются выход из зон перекупленности (RSIHighLevel) и перепроданности (RSILowLevel). Поэтому редкие сигналы BUY соответствуют пересечению верхнего уровня сверху вниз, а сигналы SELL - пересечению нижнего уровня снизу вверх. Основное состояние "нет сигнала". Период индикатора можно задать в параметре RSIPeriod, а цену расчета в параметре RSIPrice.

 
 if (UseRSI)
   {
    double RSI1 = iRSI(Symbol(), 0, RSIPeriod, RSIPrice, 1); 
    double RSI2 = iRSI(Symbol(), 0, RSIPeriod, RSIPrice, 2); 
    if (RSI2 < RSILowLevel && RSI1 > RSILowLevel && RSI1 < RSIHighLevel)    // Buy Signal
      Signal++;
    if (RSI2 > RSIHighLevel && RSI1 < RSIHighLevel && RSI1 > RSILowLevel)  // Sell Signal
      Signal--;
   }

    

    14) Индикатор RVI

        Несмотря на схожие с RSI аббревиатуры, это совершенно другой индикатор. Пользователю доступен для изменений лишь один параметр - RVIPeriod. Сигналов же только два: BUY - главная линия выше сигнальной, SELL - главная линия ниже сигнальной. Состояние "нет сигнала" не используется.

 
 if (UseRVI)
   {
    double RVIM = iRVI(Symbol(), 0, RVIPeriod, MODE_MAIN, 1); 
    double RVIS = iRVI(Symbol(), 0, RVIPeriod, MODE_SIGNAL, 1); 
    if (RVIM > RVIS)                                                        // Buy Signal
      Signal++;
    if (RVIM < RVIS)                                                       // Sell Signal
      Signal--;
   }

   

     15) Stochastic Oscillator

        Осциллятор состоит из двух линий - главной и сигнальной, что позволяет торговать по сигналам пересечения этих линий. Поэтому сигналы такие: BUY - главная линия выше сигнальной, SELL - главная линия ниже сигнальной. Параметры, доступные пользователю: StochK - %К-период, StochD - %D-период, StochSlowing - замедление индикатора, StochPrice - цена расчета, StochMethod - метод усреднения.

 
 if (UseStochastic)
   {
    double StochM = iStochastic(Symbol(), 0, StochK, StochD, StochSlowing, StochMethod,
                                StochPrice, MODE_MAIN, 1); 
    double StochS = iStochastic(Symbol(), 0, StochK, StochD, StochSlowing, StochMethod,
                                StochPrice, MODE_SIGNAL, 1); 
    if (StochM > StochS)                                                    // Buy Signal
      Signal++;
    if (StochM < StochS)                                                   // Sell Signal
      Signal--;
   }

    

    16) Williams Percent Range (WPR)

        Стоит в одном ряду с RSI, CCI и DeMarker. Поэтому сигналы подобны: BUY - пересечение уровня перекупленности (WPRHighLevel) сверху вниз и SELL - пересечение уровня перепроданности (WPRLowLevel) снизу вверх. Все остальное - "нет сигнала". Изменять извне возможно только параметр периода индикатора - WPRPeriod.

 
 if (UseWPR)
   {
    double WPR1 = iWPR(Symbol(), 0, WPRPeriod, 1); 
    double WPR2 = iWPR(Symbol(), 0, WPRPeriod, 2); 
    if (WPR1 > WPRLowLevel && WPR2 < WPRLowLevel && WPR1 < WPRHighLevel)    // Buy Signal
      Signal++;
    if (WPR1 < WPRHighLevel && WPR2 > WPRHighLevel && WPR1 > WPRLowLevel)  // Sell Signal
      Signal--;
   }

    

    17) Awesome Oscillator (AO)

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

 
 if (UseAO)
   {
    double AO1 = iAO(Symbol(), 0, 1); 
    double AO2 = iAO(Symbol(), 0, 2); 
    double AO3 = iAO(Symbol(), 0, 3); 
    double AO4 = iAO(Symbol(), 0, 4); 
    if (AO1 > 0 && AO3 > AO4 && AO2 < AO3 && AO1 > AO2)                     // Buy Signal
      Signal++;
    if (AO1 < 0 && AO3 < AO4 && AO2 > AO3 && AO1 < AO2)                    // Sell Signal
      Signal--;
   }

    

    18) Accelerator/Decelerator Oscillator (AC)

        Также не имеет параметров. Сигналы очень простые: BUY - две последние гистограммы выше нуля и зеленого цвета (увеличение значений индикатора), SELL - две последние гистограммы ниже нуля и красного цвета (уменьшение значений индикатора), "нет сигнала" - все остальные случаи.

 
 if (UseAC)
   {
    double AC1 = iAC(Symbol(), 0, 1); 
    double AC2 = iAC(Symbol(), 0, 2); 
    double AC3 = iAC(Symbol(), 0, 3); 
    if (AC1 > 0 && AC3 < AC2 && AC2 < AC1)                                  // Buy Signal
      Signal++;
    if (AC1 < 0 && AC3 > AC2 && AC2 > AC1)                                 // Sell Signal
      Signal--;
   }

 

    19) Фракталы (Fractals)

        Не имеет изменяемых параметров. Для восприятия сигналы просты: BUY - последним было пробитие ценой верхнего фрактала, SELL - последним событием было пробитие ценой нижнего фрактала, "нет сигнала" - все остальные случаи. Но в коде это не так просто.

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

 
 if (UseFractals)
   { 
    int i = 3;
    int DnN = 0, UpN = 0;
    double UpFr = 0, DnFr = 0;
    while (i < Bars && (UpFr == 0 || DnFr == 0))
      {
       if (iFractals(Symbol(), 0, MODE_UPPER, i) != 0)
         if (UpFr == 0)
           {
            UpFr = iFractals(Symbol(), 0, MODE_UPPER, i);
            UpN = i;
           } 
       if (iFractals(Symbol(), 0, MODE_LOWER, i) != 0)
         if (DnFr == 0)
           {
            DnFr = iFractals(Symbol(), 0, MODE_LOWER, i);
            DnN = i;
           } 
       i++;    
      }
    if (i < Bars)
      {
       int DnBit = iLowest(Symbol(), 0, MODE_LOW, DnN);
       int UpBit = iHighest(Symbol(), 0, MODE_HIGH, UpN);
       bool BitUp = False, BitDn = False;
       if (High[UpBit] > UpFr) BitUp = True;
       if (Low[DnBit] < DnFr) BitDn = True;
       if (BitUp && BitDn)
         {
          if (UpBit < DnBit)
            Signal++;
           else
            Signal--;
         }
        else
         {
          if (BitUp) Signal++;
          if (BitDn) Signal--;
         } 
      }  
   }

 

    20) Alligator

    Так как индикатор состоит из трех средних скользящих линий, то параметров у него довольно много: JawPeriod (период челюстей, синяя линия), JawShift (сдвиг челюстей вправо), TeethPeriod (период зубов), TeethShift (сдвиг зубов вправо), LipsPeriod (период губ) и LipsShift (сдвиг губ вправо). Также для всех линий используется одинаковый метод усреднения (AlligatorMethod) и цена расчета (AlligatorPrice). Особенностью индикатора является то, что все линии имеют положительный сдвиг вправо. Это позволяет без опаски читать значения индикатора на текущем баре, так как они уже точно сформированы и изменениям не подлежат. Поэтому сигналы подаются такие: BUY - линия губ выше линии зубов, а линия зубов выше линии челюстей; SELL - линия губ ниже линии зубов, а линия зубов ниже линии челюстей. Во всех остальных случаях сигнала нет.

 
 if (UseAlligator)
   {
    double Jaw = iAlligator(Symbol(), 0, JawPeriod, JawShift, TeethPeriod, TeethShift, 
                            LipsPeriod, LipsShift, AlligatorMethod, AlligatorPrice, 
                            MODE_GATORJAW, 0);
    double Teeth = iAlligator(Symbol(), 0, JawPeriod, JawShift, TeethPeriod, TeethShift, 
                              LipsPeriod, LipsShift, AlligatorMethod, AlligatorPrice, 
                              MODE_GATORTEETH, 0);
    double Lips = iAlligator(Symbol(), 0, JawPeriod, JawShift, TeethPeriod, TeethShift, 
                             LipsPeriod, LipsShift, AlligatorMethod, AlligatorPrice, 
                             MODE_GATORLIPS, 0);
    if (Jaw < Teeth && Teeth < Lips)                                        // Buy Signal
      Signal++;
    if (Jaw > Teeth && Teeth > Lips)                                       // Sell Signal
      Signal--;
   }

 

    21) Bill Williams Market Facilitation Index (BWMFI) 

    Не имеет параметров. Основан на выявлении "приседающего бара" (MFI - вниз, объем - вверх). Отсюда и сигналы такие: BUY - цена закрытия бара выше максимума последнего "приседающего бара", SELL - цена закрытия бара ниже минимума последнего "приседающего бара". Во всех остальных случаях сигнала нет.

 
 if (UseBWMFI)
   {
    for (i = 2; i < Bars; i++)
      {
       double MFI = iBWMFI(Symbol(), 0, i);
       double MFI2 = iBWMFI(Symbol(), 0, i+1);
       if (MFI < MFI2 && Volume[i] > Volume[i+1])
         break;
      } 
    if (i < Bars)
      {
       if (Close[1] > High[i])
         Signal++;
       if (Close[1] < Low[i])    
         Signal--;
      }
   }

 

Связывание торговых сигналов   

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

 
 if (UseInd == MathAbs(Signal))
   if (Signal > 0)
     {
      if (LastBuySignal <= LastSellSignal)
        LastBuySignal = Time[0];
     } 
    else
      if (LastSellSignal <= LastBuySignal)
        LastSellSignal = Time[0];

 

    Абсолютное значение Signal, которое к этому моменту сложилось после обхода всех вышеприведенных блоков, сравнивается со значением UseInd. UseInd, в свою очередь, это сумма всех используемых в советнике параметров UseXXX, которые хоть и являются булевыми, имеют свое численное представление 0 или 1. Переменные LastBuySignal и LastSellSignal нужны для определения "давности" сигнала, чтобы советник мог определять, поступил новый сигнал BUY или это повторение старого.

    Для удобства работы снабдим  советник трейлинг-стопом, который состоит из двух уровней. Первый (TralingStop1) - это перевод позиции в безубыток при достижении TrailingStop1 пунктов прибыли, а второй (TrailingStop2) - классический трейлинг-стоп, который начинает свою работу только после вывода сделки в безубыток и достижения ценой TrailingStop2 пунктов прибыли.

 

Тестирование советника

    Напоследок приведем несколько успешных результатов, которые достигнуты при тестировании комплексного советника. Чтобы не перечислять значения многочисленных параметров советника, воспользуемся файлами предустановок (set-файлы). Перед проведением тестирования их необходимо скопировать в папку MT4\tester, а для работы онлайн - в папку MT4\experts\presets.

    Первый тест (рис. 1) демонстрирует комбинирование индикатора CCI и МА на часовом графике, используя исторический период 01.01.2006 - 03.10.2009 (файл предустановок cciplusmaeurusd.set).

 

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

    Результаты притягивают формой кривой баланса, уверенно рвущейся вверх, а также количеством сделок - 317. При этом получена неплохая прибыль 3679 долларов при максимальной просадке 1 666 долларов (ФВ = 2.21). При тестировании с такими же условиями, но на более позднем историческом периоде (04.01.2016 - 29.09.2017) получаем такой вид кривой баланса (см. рис. 2):

Рис. 2. - Обновленный график кривой баланса для EURUSD.

 

    Второй тест (рис. 3) - торговля по индикатору Parabolic SAR на часовом графике за тот же исторический период (файл предустановок parabolicgbp.set)

 

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

    Все то же самое, что и предыдущий тест, но в численном представлении еще лучше. Количество сделок - 702. Чистая прибыль 4715 долларов против максимальной просадки 1390 долларов (ФВ = 3.39). Если запустить тестирование на новом историческом периоде  (04.01.2016 - 29.09.2017), то получим несколько худший, но, все же, вполне приемлемый результат (см. рис. 4):

Рис. 4. - Обновленный график кривой баланса для GBPUSD.

 

    Третий тест (рис. 5) - та же стратегия, но на валютной паре USDJPY (файл предустановок parabolicjpy.set)

 

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

Количество сделок 727, чистая прибыль 4454 долларов, а максимальная просадка еще меньше, чем на фунте - 934 доллара, что дает фактор восстановления близкий к пяти (4.77). Вспомнить подобный результат при тестировании пока не могу. Для периода 04.01.2016 - 29.09.2017 получаем такой результат (см. рис. 6):

Рис. 6. - Обновленный график кривой баланса для USDJPY.

 

И последний, четвертый тест (рис. 7) - стратегия, основанная на индикаторе Stochastic. Тестирование проводилось на том же периоде, но на таймфрейме Н4, пара GBPJPY (файл предустановок stochasticgbpjpyh4.set)

 

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

Отличительной особенностью этого теста является большая конечная прибыль - 11516 долларов (увеличение депозита более чем в два раза за три с половиной года), но справедливости ради стоит заметить, чего это стоило - максимальная просадка 3605 долларов. В итоге фактор восстановления здесь выходит меньший, чем у йены - 3.19.

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

  • Большое количество входных параметров, что не позволяет разработать версию для AutoGraf
  • Для визуального контроля работы эксперта нужно дважды настраивать параметры: в советнике и в самом индикаторе (также есть решение, которое ждите во второй части)
  • Отсутствие сигналов "закрыть BUY" и "закрыть SELL" без открытия противоположной сделки
  • Невозможность подключения пользовательских индикаторов без внесения изменений в код

 

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