Механическая Торговая Система "Вилка Чувашова"

Genkov | 27 декабря, 2010

"Нас интересует последние значения для построения линий тренда"
Т. Демарк

Введение

Станислав Чувашов предложил методику своей разработки по торговле на Forex при помощи построения паттерна "Вилка Чувашова". В этой методике подход к анализу состояния рынка перекликается с подходом Т. Демарка к построению линий тренда для последнего ближайшего отрезка времени.


1. Метод построения линий паттерна "Вилка Чувашова"

Для построения "Вилки Чувашова" используется индикатор фракталов. На графике цен (смотри рис ниже) через два соседних фрактала 1 и 2 строим основную трендовую линию. Основную трендовую линию вверх строим по нижним фракталам, основную трендовую линию вниз строим по верхним фракталам.


Рисунок 1. Построение "Вилки Чувашова"

Ждем, когда сформируется такой же фрактал 3 после пробоя основной трендовой линии в противоположную сторону тренда. Ответвленная линия, построенная через 2 и 3 фракталы в составе с основной трендовой линией, образуют паттерн "Вилка Чувашова" (ВЧ). Так ее назвал автор Станислав Чувашов.

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

Ниже приведена последовательность формирования паттернов "Вилки Чувашова" на примере 4-х последовательных дней пары EURUSD на таймфрейме H1.


Рисунок 2. Возникновение паттерна "Вилка Чувашова"

На рис. 2 показано возникновение паттерн "Вилка Чувашова" (ВЧ) на восходящем тренде, предвещая окончание тренда или перехода его во флет. МТС открыла позицию SELL.


Рисунок 3. Новый паттерн ВЧ

Спустя 6 баров (часов) образовался новый паттерн ВЧ с более широкой вилкой (рис. 3), подтверждающий предыдущий паттерн о развороте тренда или перехода тренда во флет.

МТС закрыла предыдущую позицию SELL по Take Profit, и открыла позицию SELL снова по условиям паттерна ВЧ.


Рисунок 4. Подтверждение паттерна ВЧ

Рис. 4 показывает, что тренд, развернувшись 11 октября, пошел вниз, что подтверждает в начале 12 октября паттерн ВЧ, направленный вниз.

В середине дня наметился новый разворот тренда, т.к. цена направилась в сторону ответвленной линии ВЧ. После пересечения ответвленной линии можно закрывать имеющуюся позицию SELL, и открывать позицию BUY.


Рисунок 5. Разворот тренда

Как видно из рис. 5, оставшуюся часть дня 12 октября и начало дня 13 октября, тренд продолжал двигаться вверх. Ближе к середине дня образовался паттерн ВЧ, направленный вверх. В середине дня 13 октября снова наметился разворот тренда вниз. После сформировавшихся сигналов МТС закроет позицию BUY и откроет позицию SELL.

Приведенную выше последовательность формирования паттернов можно проследить на тестере стратегий в визуальном режиме лучше на медленной скорости, протестировав прикрепленный файл в качестве эксперта Vilka_Ch_Demo20.mq4.


Рисунок 6. Торговые сигналы

Рисунок 6 дает некоторые пояснения по сигналам открытия и закрытия позиций.


2. Некоторые особенности предлагаемого кода "Вилка Чувашова" в MQL4

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

Обратите внимание на то, что некоторые переменные внесены в главную функцию программы Start(), поскольку эти переменные должны обнуляться при каждом тике.

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

for (i=M;i<=N;i++)
    {//цикл
    if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>High[i-1] && High[i]>High[i-2])
     {//фрактал
      VFN++;           // счетчик найденного фрактала.
      // ------------------------------------------------------------+
      if(VFN==1)       // если 1-ый фрактал найден, запоминаем значения: Max[i], № свечи[i], время[i]:
        {// f1
           Vnf1=i;        // запоминаем номер Max бара найденного фрактала.
           VMF1=High[i];  // запоминаем Max значение 1-ого найденного фрактала.
           tim1=iTime(NULL,0,i);        // запоминаем время 1-ой опорной точки.
         }//-f1
    // --------------------------------------------------------------+
    if(VFN==2)        // если 2-ый фрактал найден, запоминаем значения: Max[i], № свечи[i], время[i]:
      {// f2
          VMF2=High[i];    // запоминаем Max значение 2-ого найденного фрактала.
          if(VMF2>VMF1)    // если Max значение 2-го фрактала больше 1-го (т.е. направлена вниз),
            {
              Vnf2=i;      // запоминаем номер Max бара найденного фрактала.
              tim2=iTime(NULL,0,i);      // запомним время 2-ой опорной точки.
            }
       }//-f2
    // --------------------------------------------------------------+
    if(VFN==3)       // если 3-ый фрактал найден, запоминаем значения: Max[i], № свечи[i], время[i]:
     {//f3
          VMF3=High[i];    // запоминаем Max значение 3-ого найденного фрактала.
          if(VMF3>VMF2)    // если Max значение 3-го фрактала больше 2-го,
           {
             Vnf3=i;       // запоминаем номер Max бара 3-го фрактала.
             tim3=iTime(NULL,0,i);       // запоминаем время 3-ей опорной точки.
           }
     }//-f3
// ------------------------------------------------------------------+
   if(VFN==3) break; // найдены все три фрактала, выходим из цикла.
// ------------------------------------------------------------------+ 
    }//-фрактал                      
   }//-цикл 

В приведенном выше цикле мы нашли три фрактала, расположенных заданным образом, т.е. 1-й фрактал ниже 2-го фрактала, и 2-ой фрактал ниже 3-го фрактала. 3-й и 2-ой фракталы являются опорными точками для построения Основой трендовой линии и они являются базовыми для построения.

А вот 3-й фрактал (его значение) может оказаться ниже проекции основной трендовой линии на вертикале 1-го фрактала:


Рисунок 7. Уточнение положения реперной точки

Поэтому вводится ряд операторов, уточняющих положение 3-ей реперной точки в соответствии с требованиями к построению паттерна.

// ------------------------------------------------------------------+
   if(VMF3>VMF2 && VMF2>VMF1)
    {  
    // Определим  - находится ли ответвлённая (2) трендовая линия ВЫШЕ проекции, ОСНОВНОЙ(1)
    // трендовой линии? Для этого вычислим значение цены проекции ОСНОВНОЙ(1) трендовой линии
    // на вертикале Max значения 1-го фрактала:
    V_down1=((VMF3-VMF2)/(Vnf3-Vnf2));      // скорости падения ОСНОВНОЙ(1) трендовой линии за 1 бар.
    PricePrL1_1f=VMF2-(Vnf2-Vnf1)*V_down1;  // цена проекции ОСНОВНОЙ(1) трендовой линии на вертикале 1-го фрактала.
    // теперь сравним цену значения 1-го фрактала с ценой проекции ОСНОВНОЙ(1) трендовой линии
    // на вертикале Max значения 1-го фрактала, и если Max цена 1-го фрактала Выше цены проекции
    // ОСНОВНОЙ(1) трендовой линии на этом же фрактале, условия построения Вилки Чувашова выполнены.     
    if(VMF1>PricePrL1_1f) // если сформировался паттерн для открытия поз Buy
     {     
     V_down2=((VMF2-VMF1)/(Vnf2-Vnf1));  // скорости падения ответвленной трендовой линии за 1 бар.     
     PricePrL2_1b=VMF1-Vnf1*V_down2;     // цена проекции Ответвлённой(2) трендовой линии на текущем 1-ом БАРЕ.
     PricePrL1_1b=VMF2-Vnf1*V_down1;     // цена проекции ОСНОВНОЙ(1) трендовой линии на текущем 1-ом БАРЕ
     // запоминаем, что сформировался паттерн для открытия поз Buy
     patternBuy = true; patternSell = false;   // сформировался паттерн для открытия поз Buy
     // наносим значки и линии "Вилки Чувашова"
     DelLine(); CreateLine(); CreateArrow();   // наносим значки и линии, удалив предыдущие 
     }
    }
// ==================================================================+    

Если Max цена 1-го фрактала выше цены проекции ОСНОВНОЙ(1) трендовой линии на этом же фрактале, условия построения Вилки Чувашова выполнены.

Таким образом, определился паттерн "Вилка Чувашова" - наносим на график значки и линии паттерна.

Теперь надо определиться с условиями и параметрами открываемой позиции BUY.

// ==================================================================+    
//                    Открытие позиций BUY                           +
// ==================================================================+
   if(OrdersTotal()<1) // играем в одну(или 2..3..и т.д.) позицию  
    {  //откр поз
// ------------------------------------------------------------------+
   if(patternBuy==true)
    { //patternBuy

Лучше если размах цен за последние 25 баров будет составлять не менее 50 пунктов.

Введем дополнительные условия, например, скользящая средняя периода 150 за последние 24 или 48 часов (баров) будет направлена вниз и цена будет отстоять от этого индикатора на 89 пунктов ниже (уровень Fibo89s).

 // 1-ое доп.усл - размах цен за последние 25 баров не менее 50 пунктов.
if((High[iHighest(Symbol(),Period(),MODE_HIGH,25,0)]-Low[iLowest(Symbol(),Period(),MODE_LOW,25,0)])>=50*Point)
  {// размах цен
   // 2-ое доп.усл. например, если цена находится ниже 89 pip под уровнем Ma144 (MA среднее 12 в квадрате) 
  if(Bid<Ma144_1-89*Point &&       // цена находится ниже Fibo89s   
     (Ma144_1-Ma144_48)<0)         // наклон Ma144 отрицательный
   {//2-ое доп.усл. 

Основным условием открытия позиции является пересечение ценой ответвленной линии паттерна.

Например, оно может быть таким:

if((High[1]>PricePrL2_1b ||                     // Max свечи выше ответвленной проекции 1-го Бара
    Close[1]>PricePrL2_1b ||                    // любая свеча закрылась выше проекции 1-го Бара
    (Open[1]<Close[1] && Close[1]>PricePrL2_1b) ||   // белая свеча  пересекла проекцию 1-го Бара
    Bid>PricePrL2_1b) && Bid<PricePrL2_1b+3*Point)   // не выше 3 pip от цены проекции 1-го Бара
   {

Далее определяемся с параметрами Stop Loss и Take Profit. Устанавливаем Stop Loss, равное минимальному значению цены на отрезке от "0" бара до бара 2-го фрактала т.е. на Low уровне первого фрактала. Устанавливаем Take Profit на уровне 0,6 от размаха цен.

Поскольку в этой стратегии применяется отслеживание по нижним фракталам восходящего тренда, то Take Profit установим больше двух минимальных размахов цен, например 100 - 200 пунктов.

  {// открытие поз Buy.
   // Вычислим Stop Loss как Min значение цены на отрезке от "0" бара до бара 2-го фрактала.
  SL_B=(Bid-Low[iLowest(Symbol(),Period(),MODE_LOW,Vnf2,0)])/Point;
  if(SL_B<StopLevel) SL_B=Bid-(StopLevel+2)*Point; // если SL_B окажется меньше StopLevel
  TP_B=120;
  Print("  OP_BUY вилка Чувашова","  VMF1 = ",VMF1," < ",PricePrH1_1f);
  Op_Buy_Ch();
  return;
  }//- открытие поз Buy. 

Поиск последних трех следующих друг за другом фракталов, лежащих на восходящем тренде, определяем по нижним фракталам, и весь процесс для построения паттерна, направленного вверх производим, применяя логику построения паттерна на нисходящем тренде.

//+=======================================================================+
//                   переходим к ОТСЛЕЖИВАНИЮ открытых позиций            +
//+=======================================================================+
for (i=OrdersTotal()-1; i>=0; i--)        // цикл выбора ордеров  BUY 
   {//цикл выбора поз. Buy
  if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {Print("Ошибка выбора ордера = ", GetLastError()); }
   if(OrderType()==OP_BUY )                // если открыт ордер в покупку
    { //2-тип_Buy

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

//+=======================================================================+
//|  Условия для закрытия позиций BUY                                     +
//+=======================================================================+
   if(patternSell==true)         //  появился паттерн для открытия поз.Sell
    { 
    Print(" закрытие поз BUY - т.к. сформировался противоположный паттерн");
    Close_B_Ch();         // закрываем поз. SELL
    return; 
    }
//+=======================================================================+

Переходим к модификации открытой позиции BUY.

Процесс модификации разбит на 3-и этапа. На первом этапе подтягиваем Stop Loss поближе к "безубытку". На втором этапе при достижении ценой положительного профита, равного или большего размера Stop Loss, передвигаем Stop Loss на уровень открытия позиции.

// ---- 1-ый этап ------------------------------------------ 1-ый этап ---+
    // Первый этап модификации заключается в том, при достижении ценой профита 
    // равного величины Stop Loss, переставляем SL_B на величину 1/2 от Stop Loss
    // т.е. ближе к уровню открытия позиции. (+StopLevel)
   if((Bid-OrderOpenPrice())>SL_B*Point        // если разность между ценой и величиной открытия >SL_B
       && OrderStopLoss()<OrderOpenPrice())    // и если Stop Loss ниже открытия позиции.
    {// модиф-1
     OrderModify(OrderTicket(),                // # ордера. 
     OrderOpenPrice(),                         // цена открытия. 
     OrderStopLoss()+(SL_B/2)*Point,           // Новое значение Stop Loss.
     OrderTakeProfit()+1*Point,                // Новое значение Take Profit.
     0,                                        // Время истечения отложенного ордера.
     Red);                                     // Цвет значков (черточек) модификации.
     return;
    }//-модиф-1
// --- end 1-ый этап -----------------------------------------------------+
// ---- 2-ый этап ------------------------------------------ 2-ый этап ---+
    // Второй этап модификации заключается в том, при повторном достижении ценой профита 
    // равного величины Stop Loss, переставляем SL_B на уровень 
    // без убытка т.е. на уровень открытия поз.(+StopLevel). 
   if((Bid-OrderOpenPrice())>SL_B*Point        // если разность между ценой и величиной открытия позици >SL_B
       && OrderStopLoss()<OrderOpenPrice())    // и если Stop Loss ниже открытия позиции
    {// модиф-1
     OrderModify(OrderTicket(),                // # ордера. 
     OrderOpenPrice(),                         // цена открытия. 
     OrderStopLoss()+(SL_B+StopLevel)*Point,   // Новое значение Stop Loss. 
     OrderTakeProfit()+1*Point,                // Новое значение Take Profit.
     0,                                        // Время истечения отложенного ордера.
     Magenta);                                 // Цвет значков (черточек) модификации.
     return;
    }//-модиф-1
// --- end 2-ой этап -----------------------------------------------------+

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

// ---- 3-ой этап --------------------------------------- 3-ой этап ------+
   //  При достижении ценой величины профита большего размера Stop Loss, чем в 1.5 раза
   //  подтянем SL_B на ближайший нижний фрактал, который должен быть выше предыдущего Stop Loss
   if((Bid-OrderOpenPrice())>=(SL_B+SL_B/2)*Point  // если разность между ценой и величиной открытия >SL_B+SL_B/2
       && OrderStopLoss()>=OrderOpenPrice())       // и если Stop Loss уже на уровне безубытка. 
    {// модиф2
     // передвигаем SL_B на уровень ближайшего нижнего фрактала,
     // для этого найдем ближайший нижний фрактал:
    for (k=3;k<=24;k++)
     {//цикл-М
     if(Low[k]<Low[k+1] && Low[k]<Low[k+2] && Low[k]<Low[k-1] && Low[k]<Low[k-2])
      { // фрактал Low
      VlFl_L=Low[k];             // Min значение ближайшего фрактала
     if(VlFl_L>OrderStopLoss())  // фрактал, который должен быть выше предыдущего Stop Loss
      {// фрактал выше SL_B
      tim1_L=iTime(NULL,0,k);    // Время этого фрактала
         ///  string Time1_L=TimeToStr(tim1_L,TIME_DATE|TIME_MINUTES); 
         ///  Print("  Модиф-2 ====== ","  Фрактал = ","Frak"+k,VlFl_L,"  время = ",Time1_L);           
      // переносим Stop Loss на уровень Min значения сформированного нижнего фрактала 
      OrderModify(OrderTicket(),            // # ордера 
      OrderOpenPrice(),                     // цена открытия 
      VlFl_L+2*Point,                       // Новое значение Stop Loss. // в безубытке
      OrderTakeProfit()+1*Point,            // Новое значение Take Profit.
      0,                                    // Время истечения отложенного ордера.
      Aqua);                                // Цвет стрелок модификации Stop Loss и/или Take Profit
      if(VlFl_L!=0)  break;                 // если фрактал найден - выходим из цикла
      return;
// --- end 3-й этап ------------------------------------------------------+


Заключение

Краткий вывод таков, что при тестировании у разных брокеров представленная пробная МТС дает примерно одинаковые положительные результаты.

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

Рекомендации можно посмотреть в бесплатных 17-ти уроках Станислава Чувашова.

Пояснения к прикрепленным файлам: