MQLabs: Канал в окружении

Советник  NB_Channel

Индикатор  NB_Channel

Файлы стратегий для Autograf 4.0

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

   

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

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

    Ярким представителем индикаторов, отображающих наклонный канал последних колебаний рынка, является NB_Channel (см. рис. 1), названный по инициалам его создателя - Николая Билака (nickbilak). Алгоритм построения канала довольно прост. Индикатор находит два последних фрактала (верхних или нижних) - первая опорная и вторая опорная точки, через которые проводится одна граница канала. Впоследствии к ним добавляется противоположный по типу экстремум (третья опорная точка), через который проводится линия, параллельная найденной границе канала. Третья опорная точка выбирается таким образом, чтобы на участке от первой до второй опорной точек все цены оказались внутри канала.

    Под фракталами в данном случае имеются в виду локальные экстремумы, сформированные на участке среди некоторого количества свечей. Определение у них такое же, как у фракталов Билла Вильямса. Только, в отличие от стандартных фракталов, использующих диапазон в пять баров, индикатор NB_Channel может варьировать это значение и находить фракталы среди любого количества свечей. К примеру, на рис. 1 фрактал фиксируется на участке в 12 баров.

    Для указания размера фрактала в индикаторе служит параметр BarsForFract. Нулевое значение разрешает использование предустановленных автором величин, которые различны для каждого таймфрейма. Число 12 как раз соответствует таймфрейму H1.

Рис. 1. - Индикатор NB_Channel.

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

    Стратегия вырисовывается следующая. При касании цены одной из границ канала, на некотором отдалении от границы устанавливается два противоположных отложенных ордера. Это может быть как пара Buy Stop и Sell Stop, так и пара Buy Limit и Sell Limit. Расстояние от цены открытия ордера до границы канала условно названо Delta. Значение Delta может быть задано жестко в пунктах или в процентах от ширины канала. Это же касается значений стопа и профита, к которым можно применить статический метод установки - в пунктах, или динамический - проценты от ширины канала.

    Если ни один из отложенных ордеров не сработал до нового пересечения ценой какой-либо границы канала, то ордера перемещаются в соответствии с новыми условиями. При срабатывании любого отложенного ордера противоположный ордер удаляется и до полного закрытия сделки все последующие сигналы системы игнорируются.

    Ниже приведен список настроечных параметров эксперта, которые потребуются пользователю для управления действиями робота:

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

  • UsePipsStop - способ задания отступа ордеров от границ канала, стопов и профитов. Значение True указывает на применение значений в пунктах, а False - в процентах от ширины канала.

  • Delta - расстояние от границы канала до цены открытия ордера в пунктах. Используется при UsePipsStop = True.

  • TakeProfit - размер максимальной прибыли сделки в пунктах. Используется при UsePipsStop = True.

  • StopLoss - размер максимального убытка в пунктах. Используется при UsePipsStop = True.

  • PercentDelta - расстояние от границы канала до цены открытия ордера в процентах от текущей ширины канала. Используется при UsePipsStop = False.

  • PercentTP - максимальный размер прибыли в процентах от текущей ширины канала. Используется при UsePipsStop = False.

  • PercentSL - максимальный размер убытка в процентах от текущей ширины канала. Используется при UsePipsStop = False.

  • UseMedianLine - использовать ли среднюю линию канала как границу канала. При значении True касание ценой линии будет воспринято как сигнал для установки отложенных ордеров. При значении False средняя линия игнорируется.

  • TrailingStop1 - уровень прибыли в пунктах, при котором стоп-приказ будет перемещен на цену открытия сделки (безубыток).

  • TrailingStop2 - расстояние в пунктах, на котором должен следовать стоп-приказ позиции за ценой после вывода позиции в безубыточное состояние.

  • BarsForFract - параметр, сходный по назначению с настроечным параметром индикатора NB_Channel.

  • UseStopOrders - указание типа отложенных ордеров. При значении True используются стоповые ордера - Buy Stop и Sell Stop. При значении False - лимитные ордера Buy Limit и Sell Limit.

    Для расчета текущих границ канала в код эксперта перенесен алгоритм индикатора NB_Channel. Этот алгоритм оформлен в виде функции GetLastLevels:

 
//+-------------------------------------------------------------------------------------+
  //| Нахождение трех последних экстремумов                                               |
  //+-------------------------------------------------------------------------------------+
  void GetLastLevels()
  {
  // - 1 - ================================= Инициализация переменных =====================
   LowV = 0;                                                       // Одна из границ канала
   HighV = 0;                                                      // Одна из границ канала
   int CurrentBar = 2;                        // Поиск фракталов начинается со второго бара
   int B1=-1, B2=-1, UpDown=0;  // Номера фрактальных баров и флаг типа последнего фрактала
  // - 1 - ====================================== Окончание блока =========================
  
  // - 2 - ======== Поиск двух последних фракталов - двух верхних или двух нижних =========
   while((B1 == -1 || B2 == -1) && CurrentBar < Bars)
     {
      if (UpDown < 1 &&                           // если еще не был найден верхний фрактал
          CurrentBar == iLowest(Symbol(), Period(), MODE_LOW, BFF*2+1, CurrentBar-BFF)) 
        {
         if (UpDown == 0)                       // Еще ни один из экстремумов найден не был
           {
            UpDown = -1;                             // Следующий фрактал ожидается верхний
            B1 = CurrentBar;           // Сохраняется номер бара, на котором найден фрактал
            double P1=Low[B1];                             // Сохраняется значение фрактала
           }
          else                                               // уже был найден один фрактал
           {
            B2=CurrentBar;                    // Поэтому найденный верхний сохраняется в B2
            double P2=Low[B2];                             // Сохраняется значение фрактала
           }
        }
      if (UpDown > -1 &&                           // если еще не был найден нижний фрактал
          CurrentBar == iHighest(Symbol(), Period(), MODE_HIGH, BFF*2+1, CurrentBar-BFF)) 
        {
         if (UpDown == 0)                       // Еще ни один из экстремумов найден не был
           { 
            UpDown = 1;                               // Следующий фрактал ожидается нижний
            B1=CurrentBar;             // Сохраняется номер бара, на котором найден фрактал
            P1=High[B1];                                   // Сохраняется значение фрактала
           }
          else                                             // уже был найден нижний фрактал
           { 
            B2=CurrentBar;                     // Поэтому найденный нижний сохраняется в B2
            P2=High[B2];                                   // Сохраняется значение фрактала
           }
        }
      CurrentBar++;                                            // Переход к следующему бару
     }
   if(B1 == -1 || B2 == -1) return;
  // - 2 - ====================================== Окончание блока =========================
      
  // - 3 - ==== Расчет прямой по найденным точкам и расчет второй параллельной прямой =====
   double Step = (P2-P1)/(B2-B1);                         // К - коэффициент наклона прямой
   P1 = P1-B1*Step;                         // B - коэффициент сдвига прямой по оси абсцисс
   if (UpDown == 1)                             // если была найдена пара верхних фракталов
     {                           // необходимо найти одну нижнюю точку, через которую будет
                                                // проведена прямая, параллельная найденной
      double PP = Low[2]-2*Step;       // попытка провести линию через минимум второго бара
      for (int i = 3; i <= B2; i++)                   // Поиск до второго фрактального бара 
        if (Low[i] < PP+Step*i)                  // если минимум этого бара ниже прямой, то 
          PP=Low[i]-i*Step;                // прямая проводится через минимум текущего бара
     } 
    else                                              // Была найдена пара нижних фракталов
     {           // производится поиск верхней точки, через которую будет проведена прямая,
      PP = High[2]-2*Step;                                        // параллельная найденной
      for(i = 3; i <= B2; i++)                         // Поиск до вторго фрактального бара
        if (High[i] > PP+Step*i)                // Если максимум этого бара выше прямой, то 
          PP=High[i]-i*Step;              // прямая проводится через максимум текущего бара
     }
  // - 3 - ====================================== Окончание блока =========================
     
  // - 4 - ========================= Формирование границ канала и отображение канала ======
   LowV = PP;  // Одна граница (не обязательно нижняя)
   HighV = P1; // Вторая граница (не обязательно верхняя)
   Middle = (P1 + PP)/2; // Средняя
   ShowChannel(Time[0], P1, Time[B2], P2, PP, PP+Step*B2);
  // - 4 - ====================================== Окончание блока =========================
  }

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

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

    В начале третьего блока вычисляются коэффициенты K (переменная Step) и B (переменная P1), соответствующие уравнению прямой, которую можно провести через найденные точки. Далее находится третья опорная точка канала, которая будет являться минимумом свечи, если первые две опорные точки - максимумы, и максимумом свечи, если первые опорные точки - минимумы. Через третью опорную точку проводится вторая граница канала.

    Четвертый блок заполняет значения LowV и HighV, а также Middle - точка середины канала. Здесь же вызывается функция отображения канала, что делает ненужным присутствие на графике индикатора NB_Channel.

    Установка отложенных ордеров производится в функции Trade. Ее вызов происходит, если текущая цена Bid равна значению LowV, HighV или Middle (при условии, что UseMedianLine имеет значение True):

 
//+-------------------------------------------------------------------------------------+
  //| Начало торговой сессии                                                              |
  //+-------------------------------------------------------------------------------------+
  void Trade(double WorkLine)
  {
  // - 1 - ========= Преобразование размеров стопа и профита в единицы инструмента ========
   if (UsePipsStop) 
     {
      double sl = StopLoss*Point;             // Уровень стопа, отложенный от цены открытия
      double tp = TakeProfit*Point;         // Уровень профита, отложенный от цены открытия
      double delta = Delta*Point;   // Цена открытия, отложенная от пробитой границы канала
     }
    else
     {
      double CW = MathAbs(HighV- LowV);                                    // ширина канала
      sl = CW*(PercentSL/100.0);              // Уровень стопа, отложенный от цены открытия
      tp = CW*(PercentTP/100.0);            // Уровень профита, отложенный от цены открытия
      delta = CW*(PercentDelta/100.0);//Цена открытия,отложенная от пробитой границы канала
     } 
  // - 1 - =================================== Окончание блока ============================
  
  // - 2 - ====== Перемещение ордера Buy Stop/Limit при возникновении нового пробития =====
   if (BSTicket > 0 || BLTicket > 0)
     {
      if (BSTicket > 0)                                            // найден ордер Buy Stop
        {
         double Price = NP(WorkLine + delta + Spread);        // Расчет новой цены открытия
         int ticket = BSTicket; 
        } 
       else                                                       // найден ордер Buy Limit
        {
         Price = NP(WorkLine - delta + Spread);               // Расчет новой цены открытия
         ticket = BLTicket;
        } 
      double TP = NP(Price+tp);                        // Профит в пунктах от цены открытия
      double SL = NP(Price-sl);                          // Стоп в пунктах от цены открытия
      if (OrderSelect(ticket, SELECT_BY_TICKET) && OrderCloseTime() == 0)   // выбор ордера
        if (MathAbs(Price - OrderOpenPrice()) >= Tick) // Если цена отличается от имеющейся
          if (WaitForTradeContext())
            if (!OrderModify(OrderTicket(), Price, SL, TP, 0))      // Изменение параметров
              {           // если операция прошла неудачно, то необходимо пробовать еще раз
               SignalLine = WorkLine;       // для этого значение текущей линии сохраняется
               Print("BUY-ордер# ", OrderTicket(), ", WorkLine = ", WorkLine, ", delta = ",
                     delta, ", Price = ", Price, ", SL = ", SL, ", TP = ", TP, ", Bid = ",
                     Bid);
               return;
              }
     }
  // - 2 - =================================== Окончание блока ============================
  
  // - 3 - ====== Перемещение ордера Sell Stop/Limit при возникновении нового пробития ====
   if (SSTicket > 0 || SLTicket > 0)
     {
      if (SSTicket > 0)                                           // найден ордер Sell Stop
        {
         Price = NP(WorkLine - delta);                        // Расчет новой цены открытия
         ticket = SSTicket;
        } 
       else                                                      // найден ордер Sell Limit
        {
         Price = NP(WorkLine + delta);
         ticket = SLTicket;
        } 
      TP = NP(Price-tp);                               // Профит в пунктах от цены открытия
      SL = NP(Price+sl);                                 // Стоп в пунктах от цены открытия
      if (OrderSelect(ticket, SELECT_BY_TICKET) && OrderCloseTime() == 0)   // выбор ордера
        if (MathAbs(Price - OrderOpenPrice()) >= Tick) // Если цена отличается от имеющейся
          if (WaitForTradeContext())
            if (!OrderModify(OrderTicket(), Price, SL, TP, 0))// Изменение параметров
              {           // если операция прошла неудачно, то необходимо пробовать еще раз
               SignalLine = WorkLine;       // для этого значение текущей линии сохраняется
               Print("SELL-ордер# ", OrderTicket(), ", Price = ", Price, ", SL = ", SL,
                     ", TP = ", TP, ", Bid = ", Bid);
               return;
              }
     }
  // - 3 - =================================== Окончание блока ============================
  
  // - 4 - ====== Установка ордера Buy Stop или Buy Limit, если не найдены таковые ========
   if (BSTicket < 0 && BLTicket < 0 && BuyTicket < 0 && SellTicket < 0)
     {
      if (UseStopOrders)//Если нужно использовать стоповые ордера, устанавливается Buy Stop
        {
         Price = NP(WorkLine + delta + Spread);
         int Type = OP_BUYSTOP;
        } 
       else           // Если нужно использовать лимитные ордера, устанавливается Buy Limit
        {
         Price = NP(WorkLine - delta + Spread);
         Type = OP_BUYLIMIT;
        } 
      TP = NP(Price+tp);                               // Профит в пунктах от цены открытия
      SL = NP(Price-sl);                                 // Стоп в пунктах от цены открытия
        if (OpenOrderCorrect(Type, Price, Lots, SL, TP) != 0)           // Установка ордера
          {               // При не состоявшейся установке откладывается до следующего тика
           SignalLine = WorkLine;
           return;
          } 
     }
  // - 4 - =================================== Окончание блока ============================
       
  // - 5 - ====== Установка ордера Sell Stop или Sell Limit, если таковые не найдены ======
   if (SSTicket < 0 && SLTicket < 0 && SellTicket < 0 && BuyTicket < 0)
     {
      if (UseStopOrders)//Если нужно использовать стоповые ордера,устанавливается Sell Stop
        {
         Price = NP(WorkLine - delta);
         Type = OP_SELLSTOP;
        } 
       else          // Если нужно использовать лимитные ордера, устанавливается Sell Limit
        {
         Price = NP(WorkLine + delta);
         Type = OP_SELLLIMIT;
        } 
      TP = NP(Price-tp);                               // Профит в пунктах от цены открытия
      SL = NP(Price+sl);                                 // Стоп в пунктах от цены открытия
        if (OpenOrderCorrect(Type, Price, Lots, SL, TP) != 0)           // Установка ордера
          {               // При не состоявшейся установке откладывается до следующего тика
           SignalLine = WorkLine;
           return;
          } 
     }
  // - 5 - =================================== Окончание блока ============================
      
   SignalLine = 0;         // Все операции завершены успешно, значение линии не сохраняется
  }

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

    В первом блоке, в соответствии со значением параметра UsePipsStop, формируются расстояние от границы канала до цены открытия отложенных ордеров, их размера стопа и размера профита. Все эти величины вычисляются в пунктах. В случае указания фиксированного размера Delta, TakeProfit и StopLoss соответствующие значения просто умножаются на минимальное изменение цены Point. Если же заданы параметры в процентном соотношении от ширины канала, то сначала вычисляется ширина канала, а затем полученное значение переводится в пункты для каждого параметра. В итоге формируются переменные sl, tp и delta.

    Второй и третий блоки идентичны. Они исполняются в случае существования отложенных ордеров. Их назначение - проверка правильности установки ордеров. Это нужно в случае возникновения нового пересечения границы канала, до которого не сработал ни один отложенный ордер. О факте наличия или отсутствия ордеров можно узнать, проверив значения переменных BuyTicket, SellTicket, BSTicket, SSTicket, BLTicket и SLTicket. В них хранятся тикеты найденных ордеров, которые были установлены экспертом. Отрицательное значение переменной свидетельствует об отсутствии соответствующего ордера.

    Аналогичным образом идентичными выступают блоки 4 и 5. Они исполняются в случае отсутствия соответствующего отложенного ордера и хотя бы одной позиции. Обязанностью блоков является установка отложенных ордеров.

    Связующим звеном эксперта, как всегда, выступает функция start:

 
//+-------------------------------------------------------------------------------------+
  //| expert start function                                                               |
  //+-------------------------------------------------------------------------------------+
  int start()
    {
  // - 1 -  == Разрешено ли советнику работать? ===========================================
     if (!Activate || FatalError)             // Отключается работа советника, если функция
      return(0);           //  init завершилась с ошибкой  или имела место фатальная ошибка
  // - 1 -  == Окончание блока ============================================================
     
  // - 2 - == Сбор информации об условиях торговли ========================================
     Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);                 // текущий спрэд
     StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);  // текущий уровень стопов 
  // - 2 - === Окончание блока ============================================================
  
  // - 3 - ======================= Поиск своих ордеров и трейлинг позиции =================
     FindOwnOrder();
     if (BuyTicket > 0 || SellTicket > 0)
       TrailingStopDoubleLevel();
  // - 3 - =================================== Окончание блока ============================
  
  // - 4 - =============== Удаление ордера, противоположного текущей позиции ==============
     if (BuyTicket > 0 || SellTicket > 0)                    // Если обнаружена позиция, то
       DeletePending();                                             // удаляются все ордера
  // - 4 - =================================== Окончание блока ============================
  
  // - 5 - ============================ Получение значений границ канала ==================
     if (LastBar != Time[0])
       {
        GetLastLevels(); 
        LastBar = Time[0];
       } 
  // - 5 - =================================== Окончание блока ============================
  
  // - 6 - ============= Установка ордеров при пробитии одной из границ канала ============
     NewBid = ND(MarketInfo(Symbol(), MODE_BID));     
     
     // Установка ордеров, если достигнута одна из линий
     if (SignalLine != 0)
       Trade(SignalLine);
      else 
       if (MathAbs(NewBid - HighV) < Tick)
         Trade(HighV);
        else 
         if (MathAbs(NewBid - LowV) < Tick) 
           Trade(LowV);
          else
           if (UseMedianLine && MathAbs(NewBid - Middle) < Tick)
             Trade(Middle);  
  // - 6 - =================================== Окончание блока ============================
     
     return(0);
    }

    Первый и второй блоки стандартные и в комментариях не нуждаются. Третий блок выполняется при поступлении каждого нового тика. Сначала вызывается функция FindOwnOrder, где формируются значения переменных BuyTicket, SellTicket, BSTicket, SSTicket, BLTicket и SLTicket. В случае присутствия позиции BUY или SELL выполняется вызов функции TrailingStopDoubleLevel, которая проверяет необходимость перемещения стоп-приказа ближе к цене.

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

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

    Шестой блок вызывает функцию Trade в одном из четырех случаев: были установлены не все отложенные ордера на предыдущем тике (значение SignalLine не равно нулю), произошло касание границы канала LowV, произошло касание границы канала HighV или произошло касание средней линии канала и при этом UseMedianLine равно True.

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

    Исторический период тестирования устанавливается с 01.01.2009 (для GBPUSD - с 01.01.2008 для увеличения количества сделок) до 15.05.2010, таймфрейм Н1. Для каждой из валютных пар подобраны индивидуальные значения расстояния от границы канала PercentDelta, размера стопа PercentSL и размера профита PercentTP. Остальные параметры использовались со значениями по умолчанию: Lots = 0.1, UsePipsStop = False. Значения Delta, TakeProfit и StopLoss в данном случае игнорировались, так как использовались расчетные значения в процентах от ширины канала. UseMedianLine = False, TrailingStop1 = 20000 (можно сказать, трейлинг отключен), TrailngStop2 = 50 (никогда не сработает, потому как не сработает первый трейлинг), UseStopOrders = True (использовались стоповые ордера). Результаты тестирования приведены на рис. 2 - 5.

                Рис. 2. - Результаты тестирования эксперта NB_Channel_MQLabs на валютной паре EURUSD.

EURUSD. Значения изменяемых параметров были взяты такие: PercentDelta = 14, PercentTP = 20, PercentSL = 50. Кривую баланса никак не назовешь оплотом надежности. Достаточно бодрый начальный подъем был сменен унылым штилем с заметным снижением, который лишь под конец тестирования был сменен новым, но уже не столь уверенным подъемом. Чистая прибыль смогла добраться до значения 2847 долларов, а максимальная просадка остановилась на величине 1318 долларов. В итоге получается фактор восстановления 2.16, что нельзя назвать хорошим результатом. В совокупности с видом кривой баланса можно точно сказать о том, что использование стратегии на EURUSD в реальных условиях противопоказано.

                Рис. 3. - Результаты тестирования эксперта NB_Channel_MQLabs на валютной паре USDCHF.

USDCHF. Оптимальные параметры для франка такие: PercentDelta = 22, PercentTP = 13, PercentSL = 38. Кривая баланса в принципе лишена какой-либо периодичности. Генератор случайных чисел по сравнению с полученным результатом выглядит предпочтительнее. И все же при таких обстоятельствах стратегия сумела закончить тестирование в прибыльной зоне: чистая прибыль 540 долларов, максимальная просадка 637 долларов. О значении фактора восстановления, как и о применении советника на валютной паре USDCHF, говорить не приходится.

                      Рис. 4. - Результаты тестирования эксперта NB_Channel_MQLabs на валютной паре GBPUSD.

GBPUSD. Входные параметры эксперта: PercentDelta = 59, PercentTP = 65, PercentSL = 59. В сравнении с полученными ранее результатами кривая баланса наиболее устойчива. Хотя с позиции абсолютной надежности до идеала еще очень далеко, так как присутствуют некоторые нервные скачки, а рост кривой достаточно неравномерен. Чистая прибыль составила 3477 долларов, а максимальная просадка 1098 долларов. То есть фактор восстановления 3.17, что дает основания для проявления некоторого интереса к полученным результатам.

Учитывая, что тестирование охватило 28 месяцев, среднемесячная прибыль выходит 124.18 доллара, что в пересчете на один год будет 1490.16 долларов. Минимальный депозит для стратегии потребуется порядка 3000 долларов. В итоге приблизительная годовая доходность 50%. А это не так уж и мало.

                        Рис. 5. - Результаты тестирования эксперта NB_Channel_MQLabs на валютной паре USDJPY.

USDJPY.  Результаты показаны при параметрах: PercentDelta = 40, PercentTP = 38, PercentSL = 64. В случае с йеной получается наиболее стабильная из всех рассмотренных сегодня кривая баланса. Немного скомкано лишь начало. Начиная же с 60-ой сделки и до конца тестирования, наблюдается устойчивый, а главное равномерный, рост. Чистая прибыль не бьет рекорды - 1820 долларов, но и максимальная просадка невелика - 505 долларов. Итоговый фактор восстановления 3.6 - наибольший сегодня.

Стартовый депозит для применения стратегии на валютной паре USDJPY потребуется 1500 долларов. Среднемесячная прибыль эксперта, судя по результатам тестирования, 113.75 доллара. То есть годовая прибыль составит 1365 долларов. В итоге годовая доходность около 90%.

Стратегию нельзя назвать универсальной. Ее можно ограниченно применять на некоторых валютных парах. Достоинством системы является преобладание прибыльных сделок над убыточными (наилучший показатель у USDCHF - 75%, худший у GBPUSD - 56%), а также короткие серии убыточных сделок (наименьшая серия на EURUSD и USDCHF - 3, наибольшая на GBPUSD - 6).

 Доработка стратегии для использования в AutoGraf 4.0

    Представление эксперта NB_Channel в виде стратегии для AutoGraf 4.0 требует преобразования большей части входных параметров советника во входные параметры AutoGraf. Эта участь не постигнет лишь четыре переменные: Lots, Delta, TakeProfit и StopLoss. Для них существуют стандартные настроечные элементы панели управления AutoGraf. Так, параметру Lots соответствует одноименный элемент Lots, параметру TakeProfit - TP, параметру StopLoss - SL, а параметру Delta - Ds.

 

    Оставшиеся девять внешних переменных эксперта NB_Channel будут соответствовать параметрам AutoGraf с AT_1 до AT_9 включительно в следующем порядке:

  1. AT_1 - UsePipsStop (0 - в процентах от ширины канала, 1 - указывать настройки в пунктах)

  2. AT_2 - PercentDelta (работает при AT_1 = 0, иначе игнорируется)

  3. AT_3 - PercentTP (при AT_1 = 0, иначе игнорируется)

  4. AT_4 - PercentSL (при AT_1 = 0, иначе игнорируется)

  5. AT_5 - UseMedianLine (0 - не использовать среднюю линию канала, 1 - использовать среднюю линию)

  6. AT_6 - TrailingStop1

  7. AT_7 - TrailingStop2

  8. AT_8 - BarsForFract

  9. AT_9 - UseStopOrders (0 - применять лимитные ордера, 1 - применять стоповые ордера)

Для запуска советника из-под AutoGraf 4.0 требуется совершить такие шаги:

  • Воспользоваться ссылкой Файлы стратегий для Autograf 4.0 и распаковать полученный архив в папку MT4\experts\libraries.

  •  Запустить AutoGraf.

  •  Для работы советника в ключе приведенных результатов в окне настроек AutoGraf (закладка "Входные параметры") выставить правильные значения параметров AT_1 -  AT_9 (полное повторение результатов при этом не гарантируется).

  • Выбрать стратегию №3. Для этого необходимо передвинуть вверх значок So и среди названий стратегий найти значок S3, который также потянуть вверх.

  • Запустить функцию автоматической торговли, передвинув значок AT в верхнее положение.

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

     

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

     

Май 2010

Специально для компании Admiral Markets

 

0
 
 
Share |

Комментарии

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

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Проверка на СПАМ:
  ____    _             _   ____                 
| _ \ | |__ ____ | | | _ \ __ _ _ __
| | | | | '_ \ |_ / | | | |_) | / _` | | '__|
| |_| | | |_) | / / | | | _ < | (_| | | |
|____/ |_.__/ /___| |_| |_| \_\ \__, | |_|
|_|
Enter the code depicted in ASCII art style.
Общие вопросы
info@admiralmarkets.com.ua
Техническая поддержка
support@admiralmarkets.com.ua
Необходимые файлы и документы
Филиальная сеть
Условия перепечатки материалов с сайта
Уведомление о рисках
Карта сайтаКарта сайта
Политика конфиденциальности