MQL4 - automated forex trading   /  

Статьи

Cтатьи  Торговые системы  Механическая торговая система "Треугольник Чувашова" Авторизуйтесь или зарегистрируйтесь , чтобы добавить новую статью



Автоматический трейдинг в новом MetaTrader 5
и торгуй мобильно!
Почитай статьи про MQL5
Готовься к Чемпионату -

Эта статья о возможностях
MetaTrader 4

и торгуй мобильно!

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


Введение

В статье рассматриваются возможности расчета расположения баров и времени пересечения трендовых линий в перспективе. Принципы построения трендовых линий близки к подходам Т. Демарка по построению TD на последних отрезках времени.

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


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

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

Если эти 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% (см. прикрепленный файл).

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

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

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


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

  • Triangle_H1_v46.mq4 – Предлагаемая МТС
  • Strategy_Tester_Report_46.zip – результат тестирования
  • table_3.zip – для любителей анализа

Прикрепленные файлы:
Strategy_Tester_Report_46.zip (6.6 Kb)
table_3.zip (7.7 Kb)
Triangle_H1_v46.mq4 (36.0 Kb)
Создана: 15.06.2011  Автор: Genkov
Предупреждение: все права на данные материалы принадлежат MetaQuotes Software Corp. Полная или частичная перепечатка запрещена.
Механическая Торговая Система
Механическая Торговая Система "Вилка Чувашова"

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

Синтетические бары – новое слово в отображении ценовой графической информации
Синтетические бары – новое слово в отображении ценовой графической информации

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

11 комментариев: 1 2   Авторизуйтесь или зарегистрируйтесь
говно
07.12.2011 21:27 milroal
Dikons:

Так и не понял почему то, как строятся уровни профитов

- объясните пожалуйста попопулярнее, для особо деревянных...


Насчет деревянности Вы зря. Ведь не все могут всё и сразу! Знания и умение приходят с опытом и во времени. Если Вы хотите поподробнее, то посмотрите бесплатные материалы по методикам ТААЧ. По ссылке на моем сайте http://forexkovtrade.com/ ; http://forexmql.narod.ru/ и дополнительно здесь: http://tinyurl.com/5vdzjns http://tinyurl.com/5wrgpkc Желаю Вам удачных профитов.

12.07.2011 12:06 genkov

Так и не понял почему то, как строятся уровни профитов

- объясните пожалуйста попопулярнее, для особо деревянных...

12.07.2011 11:25 Dikons
Dikons:

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

"...

  • Размер между первыми фракталами верхней и нижней линий должен быть меньше размера между вторыми фракталами этих линий.
  • Первый фрактал верхней линии должен быть ниже второго фрактала этой же верхней линии, а первый фрактал нижней линии должен быть выше второго фрактала нижней линии. ..."

Слова, выделенные красным цветом, должны быть противоположными (меньше > больше, ниже <> выше).

Надеюсь, в программном коде, этой ошибки нет и алгоритм определения верный...


Уважаемый, Dikons! Спасибо за замечание. Вы, наверное, ориентировались по рис 1. Но так как

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

то при расчете на графике цен 1-ым фракталом будет правый, а 2-ым будет следующий (справа налево). В программном коде есть об этом примечание. Наверное, это надо было сделать и в тексте статьи. Учту на будущее.

09.07.2011 22:48 genkov

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

"...

  • Размер между первыми фракталами верхней и нижней линий должен быть меньше размера между вторыми фракталами этих линий.
  • Первый фрактал верхней линии должен быть ниже второго фрактала этой же верхней линии, а первый фрактал нижней линии должен быть выше второго фрактала нижней линии. ..."

Слова, выделенные красным цветом, должны быть противоположными (меньше > больше, ниже <> выше).

Надеюсь, в программном коде, этой ошибки нет и алгоритм определения верный...

09.07.2011 11:42 Dikons
vldim:

Очень обидно, когда человек берет классику, и называет ее своим именем. У Вас совесть вообще есть?

Ваша "инновация" очень похожа на Операционную систему Bolgenos )))


Но за то, его фамилию запомнят во всем мире, а вашу, Владимир, никто так и не узнает! Учитесь!
01.07.2011 23:28 api

Какие-то странные комментарии по поводу авторства?! Человек что-то делает, и у него получается. А похожесть методов и подходов к анализу рынка вполне объяснима т.к. все учатся у классиков. Я провел небольшое сравнение построения трендовых линий по фракталам и построение TD линий с учетом подхода Т.Демарка. http://forexmql.narod.ru/Favourite_indication.htm По моему мнению, предложенная методика построения трендовых линий по фракталам не противоречит классику жанра, и вполне может применяться на практике.

27.06.2011 12:51 genkov

о как... вообще после вилЬки должна быть тарелЬка...а ещё можно и улицу его именем назвать... пиарить так пиарить

21.06.2011 22:50 age_nt

даааа... все идеи (и мои тоже) в конце концов повторяются в других вариантах

замечено, что вершины в длинных треугольниках указывают на будущие диапазоны распределения (флэты с типичными границами от уровня жизни - http://forum.mql4.com/ru/39373/page2)

сами треугольники формируются в диапазонах распределения и если они слишком короткие или длинные действует правило прямоугольника (Подсказки из торговой системы Masterforex-V - внизу страницы http://www.masterforex-v.org/002_010.htm)

а http://codebase.mql4.com/ru/7557 - просто ссылка

18.06.2011 00:59 Geronimo
Да уж. Нужно и себе что ли придумать Веер fozi (фибоначчи)
17.06.2011 23:23 fozi
11 комментариев: 1 2