MENU

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

Основные принципы построения пересекающихся каналов

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

Если эти 2 линии при продолжении вправо пересекаются, образуя треугольник, то мы имеем паттерн - "Треугольник Чувашова". Точка пересечения этих двух рабочих линий называется Апекс. Пронумеруем все 4 фрактала по очередности их возникновения (слева направо).

Через второй слева фрактал проводим вертикальную линию. Также проводим вертикальную линию через Апекс. Количество свечей между этими двумя вертикальными линиями, включая свечи на этих линиях, делим на 3, округляем и откладываем получившееся значение от Апекса влево и проводим третью вертикальную линию.

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


Рис. 1. Пример построения треугольника

Перейдем к построению треугольника.

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

Рис. 2. Примеры неудовлетворительного расположения фракталов

Поэтому необходимо ввести ряд условий, необходимых и достаточных для формирования треугольника:

Некоторые условия схождения линий треугольника:

  • Первые фракталы верхней и нижней линий должны отстоять друг от друга по высоте более чем на 20-30 pip (более точно этот размер можно подобрать при тестировании).
  • Размер между первыми фракталами верхней и нижней линий должен быть меньше размера между вторыми фракталами этих линий.
  • Первый фрактал верхней линии должен быть ниже второго фрактала этой же верхней линии, а первый фрактал нижней линии должен быть выше второго фрактала нижней линии.

Эти дополнительные условия были учтены в программном блоке условий формирования паттерна.

Рис. 3. Зона истинного прорыва

Вроде бы все понятно, но посмотрим рис. 3. Как узнать номер бара, около которого произойдет пересечение двух РЛК?

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

Мы знаем, что каждый бар появляется на графике через определенное время, например на таймфрейме H1 через каждый час. Зная скорость изменения цены в единицу времени каждой из двух линий, можно вычислить время пересечения этих линий. Зная промежуток времени от "основания" Треугольника до момента пересечения, вычислим и количество баров (единиц времени) до пересечения. В этом же блоке определяется зона истинного прорыва.

Советник оформлен поблочно.

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

  • Блок поиска верхних и нижних фракталов;
  • Блок условий формирования паттерна;
  • Блок вычисления зоны истинного прорыва;
  • Блок условий открытия позиций.

Фрагмент функциональных блоков приведен ниже.

// --------------------------------------------------------------------+
void
Op_Sell_Ch()   {   if(!OrderSend(Symbol(),OP_SELL,Lots,Bid,2,Ask+SL_S*Point,       Bid-TP_S*Point," ",Magic,0,Red))       { Print("  Ошибка открытия ордера SELL  # ",GetLastError()); }       return(0);      } // --------------------------------------------------------------------+
void
Op_Buy_Ch()   {   if(!OrderSend(Symbol(),OP_BUY,Lots,Ask,2,Bid-SL_B*Point,       Ask+TP_B*Point," ",Magic,0,Blue))       { Print("  Ошибка открытия ордера SELL  # ",GetLastError()); }       return(0);      } //+--------------------------------------------------------------------+
void
Close_S_Ch()   {   if(!OrderClose(OrderTicket(),OrderLots(),Ask,2,Aqua))         {Print(" Зак.орд.# ",OrderTicket()," Ошибка # ",GetLastError());}       return(0);      } //+--------------------------------------------------------------------+

Поиск верхних и нижних реперных точек для построения рабочих линий (РЛК) треугольника выполнен в цикле перебора баров по правилам построения фракталов.

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

// ====================================================================+
// (блок поиска верхних и нижних фракталов) ---------------------------+
   for (i=M;i<=N;i++) // цикл нахождения реперных точек (фракталов)     {//цикл b    // поиск верхних фракталов -----------------------------------------+    if(High[i]>High[i+1] && High[i]>High[i+2] &&       High[i]>High[i-1] && High[i]>High[i-2])      {// фрат_b       Tfnb++;   // счетчик    // ----------------------------        if(Tfnb==1)                {             // для 1-го фрактала: цена, номер, время.            TF1B=High[i]; Tf1b=i; timf1b=iTime(Symbol(),Period(),i);       }//-счетчик_1    // ----------------------------           if(Tfnb==2)                {//счетчик_2                       // цена, номер, время.             TF2B=High[i]; Tf2b=i; timf2b=iTime(Symbol(),Period(),i); break;            }//-счетчик_2         // ----------------------------        }//-фрат_b     }//-цикл b
// --------------------------------------------------------------------+
   for (i=M;i<=N;i++) // цикл нахождения реперных точек (фракталов)     {//цикл s    // поиск нижних фракталов ------------------------------------------+    if(Low[i]<Low[i+1] && Low[i]<Low[i+2] &&       Low[i]<Low[i-1] && Low[i]<Low[i-2])      {// фрак_s       Tfns++;      if(Tfns==1)                {//счетчик_1                    // цена, номер, время.            TF1S=Low[i]; Tf1s=i; timf1s=iTime(Symbol(),Period(),i);            }//-счетчик_1            if(Tfns==2)                   {//счетчик_2                    // цена, номер, время.             TF2S=Low[i]; Tf2s=i; timf2s=iTime(Symbol(),Period(),i); break;            }//-счетчик_2      }//-фрак_s     }//- цикл s
// ---------------------------(блок поиска верхних и нижних фракталов)-+

В блок схождения РЛК для формирования треугольника включены следующие условия:

  1. Первые фракталы должны отстоять друг от друга более чем на 20-30 pip;
  2. Первые фракталы одной РЛК должны быть меньше вторых другой РЛК;
  3. Все 4 реперные точки отличны от "0" т.е. имеют реальные значения;
  4. Временные характеристики реперных точек должны отличаться от "0";
  5. Первая верхняя реперная точка точно ниже второй верхней и 1-ая нижняя выше 2-ой нижней;
  6. Разность между вторыми фракталами линий не должна превышать 150 pip.
// ---------------------------------------------------------------------------+
   if((TF1B-TF1S)>25*Point && 
      Tf1b<=Tf2s && Tf1s<=Tf2b && 
      TF1B>0 && TF1S>0 && TF2B>0 && TF2S>0 && 
      timf1b!=0 && timf2b!=0 && timf1s!=0 && timf2s!=0 &&
      TF1B<TF2B && TF1S>TF2S && 
      (TF2B-TF2S)/Point<150)   
    {// условия образования тр-ка
//===========================================================================+

После выполнения предварительных условий проведем расчет скоростей изменения цен для верхней и нижней РЛК:

// ---------------------------------------------------------------------------+
   // - (блок Расчета скорость изменения цен)(верхней и нижней pip на один бар)
   if(TF1B!=TF2B) {RatePriceH=MathAbs((TF2B-TF1B)/(Tf2b-Tf1b));} // для верхней
   if(TF1S!=TF2S) {RatePriceS=MathAbs((TF1S-TF2S)/(Tf2s-Tf1s));}   // для нижне 
   // Print(" RatePriceS= ",RatePriceS); Print(" RatePriceH= ",RatePriceH);
// -------------------------------------(блок Расчета скорость изменения цен)-+

На этот момент мы имеем: 4 последних фрактала расположены в соответствии с условиями образования треугольника, но пока не ясно, как далеко будет Апекс и где будет располагаться зона истинного прорыва. Расчет Апекса зависит от расположения второго фрактала из четырех последних по ходу их образования (на графике слева направо).

Начальную точку отсчета для более длинной РЛК надо определять как точку пересечения вертикали, проведенной через второй фрактал короткой РЛК с длинной РЛК. В этой связи, дальнейший алгоритм программы разветвляется на два направления расчета зон истинного прорыва: "длинная" верхняя и "длинная" нижняя РЛК.

Ниже приведены основные фрагменты кода по одному направлению. Второе направление рассчитывается по тому же алгоритму.

// жжжжжжжжжжжжжжжжжжжжжжж 1. верхняя РЛК длиннее нижней  жжжжжжжжжжжжжжжжжжжж+ 
// - (блок поиска точки пересечения РЛК) -------------------------------------+
// Если верхняя РЛК длиннее нижней РЛК - находим точку пересечения  на 50 барах
   if(Tf2b>Tf2s && TF2B>TF1B && TF2S<TF1S)     {// Верхняя РЛК длиннее      // стартовой ценой для расчета значений на каждом баре верхней РЛК      Starting_Price_H=TF2B-RatePriceH*(Tf2b-Tf2s);      // стартовой ценой для расчета значений на каждом баре нижней РЛК      Starting_Price_S=TF2S;      //время построения вертикальной линий в основании треугольника      time_starting=timf2s;      // ------------------------------------     for(int k=1;k<=50;k++)     {//цикл 50b      PricB[k]=Starting_Price_H-RatePriceH*k;          // минус скорость падения      PricS[k]=Starting_Price_S+RatePriceS*k;          // плюс  скорость подъема      // если цены проекций  верхней и нижней линий  совпали,  или цена  верхней     if(PricB[k]<=PricS[k])   // стала меньше нижней значит есть пересечение РЛК      {//есть пересечение      P_Tria=PricB[k-1];       // цена пересечения РЛК (-1) - надо на бар меньше      cut_left=k;  break;      // кол-во баров от основания до точки пересечения      }//-есть пересечение     }//-цикл 50b
// -------------------------------------- (блок поиска точки пересечений РЛК)-+

Теперь можно приступить к расчету временных характеристик зоны истинного прорыва:

// ---------------------------------------------------------------------------+
// - (блок расчета временных отрезков для зоны истинного прорыва)-------------+
// Введем два дополнительных ограничения:

// 1. Апекс не должен отстоять от основания треугольника более, чем на 50 баров

// 2. Апекс не должен быть ближе, чем на 15 баров к основанию треугольника.
   if(cut_left<50 && cut_left>12)     {//треугольник со всеми ограничениями      time_Apex=timf2s+cut_left*T_period;             // время построения Апекса      // разделим кол-во баров на три части, возьмем 2/3 и округлим их до челого      // числа: MathRound(cut_left/3*2) -кол-во баров для зоны истинного прорыва      time_bar_zona=time_starting+MathRound(cut_left/3*2)*T_period; //время зоны      // выполнены условия построения паттерна, вычислена зона истинного прорыва        PatternTch=true;           // сформировался паттерн "Треугольник Чувашова"      }//-треугольник со всеми ограничениями
// --------------(блок расчета временных отрезков для зоны истинного прорыва)-+

Теперь может работать блок отрисовки треугольника после формирования паттерна:

// - (блок отрисовки треугольника после формирования паттерна) ---------------+
   if(PatternTch==true)
    {//есть паттерн
    Del_Frb(); Del_Frs();       // удаляем предыдущие верхние и нижние фракталы
    CreateArrow_Frb(); CreateArrow_Frs();  // наносим верхние и нижние фракталы
    Create_Tr_H(); Create_Tr_S();   // наносим верхние и нижние трендовые линии
    CreateLzona(); CreateLbasis(); CreateLApex(); // наносим вертикальные линии
    CreateTriangleH();               // отрисовка треугольника по верхней линии
    ObjectDelete("TRS");      // удаляем отрисовку треугольника по нижней линии
// -----------------(блок отрисовки треугольника после формирования паттерна)-+
Ниже приведен скриншот работы блока отрисовки паттерна "Треугольник Чувашова":

Далее вступает в действие блок открытия позиций.

Если выполнены условия открытия позиций, будет проведен расчет построения того канала, РЛК которого была пробита. Произойдет прорисовка канала.

Будут рассчитаны StopLoss и TakeProfit с учетом требований системы управления капиталом и открыта позиция (в данном случае BUY - скриншот ниже).

Однако позиции могут быть открыты в обе стороны, если выполнены условия для открытия в обоих направлениях (смотри скриншот ниже)

Далее программа отслеживает время жизни паттерна.

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

Ниже приведен код блока жизни паттерна.

// - (блок определения времени жизни паттерна) -------------------------------+
// если текущее время больше времени предела зоны открытия позиций - паттерн теряет силу
   if((TimeCurrent()-time_bar_zona)>=T_period)     {      PatternTch=false; // паттерн просрочен - ставим запрет на открытие позиций     }     // после того, когда текущее время станет больше времени Апекса     if((TimeCurrent()-time_Apex)>=T_period)      {       // удаляем с графика значки и линии паттерна       Del_Frs(); Del_Frb(); Del_TrLin();       // удаляем линии размеров профита канала по верхней РЛК       ObjectDelete("Tr_B1h"); ObjectDelete("Tr_B1hh"); ObjectDelete("Tr_B1hs");ObjectDelete("Tr_B1s");       // удаляем линии размеров профита канала по нижней РЛК       ObjectDelete("Tr_S1s"); ObjectDelete("Tr_S1sh"); ObjectDelete("Tr_S1ss");ObjectDelete("Tr_S1h");       // удаляем вертикальные линии зоны истинного прорыва       ObjectDelete("L1");ObjectDelete("zona");ObjectDelete("Ap");       ObjectDelete("TRH"); ObjectDelete("TRS");      } // --------------------(блок определения времени жизни паттерна)-+

Результат работы этого блока в правой стороне предыдущего скриншота.

Представленный здесь советник показал положительный результат как МТС при автоматическом тестировании:

  • Отношение общей прибыли к общему убытку P/F = 38869/16480 = 2.36 (больше 2);
  • Количество сделок = 101 (не меньше 100);
  • Процент просадки = 25,18% (см. прикрепленный файл).

Краткий вывод таков:

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

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

Категория: Советники MT4 | Добавил: Mentor (06.01.2012)
Просмотров: 3321 | Рейтинг: 0.0/0
Всего комментариев: 0
avatar