English 中文 Español Deutsch 日本語 Português
Механическая торговая система "Треугольник Чувашова"

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

MetaTrader 4Торговые системы | 15 июня 2011, 13:54
15 711 13
Genkov
Genkov


Введение

В статье рассматриваются возможности расчета расположения баров и времени пересечения трендовых линий в перспективе. Принципы построения трендовых линий близки к подходам Т. Демарка по построению 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 – для любителей анализа

Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (13)
[Удален] | 12 июл. 2011 в 09:25

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

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

Genkov
Genkov | 12 июл. 2011 в 10:06
Dikons:

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

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


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

MIRAAL
MIRAAL | 7 дек. 2011 в 20:27
говно
Dmivik Shepelev
Dmivik Shepelev | 23 авг. 2012 в 13:46
Пака эта методика мне результатов не принесла, буду учится дальше а так информация нужная!
[Удален] | 12 окт. 2012 в 11:06

Добрый день, коллеги!

Советник, который бы работал на пробитии ценой фигуры "Треугольник" - отличная идея.

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

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

Какие существенные условия для выявления этой фигуры? Сформулирую:

- формируется после мощного ценового движения (импульса),

- отрисовывает минимум 5 волн (бывает 7 и даже 9).

Какой можно из этого сделать вывод?

Для идентификации "треугольника" нам потребуется не 4, а 6 фракталов (или же 5 из них):

3 фрактала - со стороны противоположной направлению предшествующего импульса (при росте цены - верхние фракталы, формируют линию сопротивления),

3 фрактала - со стороны предшествующего импульса (при росте цены - нижние фракталы, формируют линию поддержки).

См. рисунок:

Поскольку, перед началом прорыва частенько происходит так называемый "продерг" цены в завершении пятой волны (т.е. она может закончиться ниже основания третьей), то этот - последний - фрактал можно не учитывать при идентификации и разметки линий поддержки/сопротивления. В таком случае нам необходимо использовать 5 фракталов: 3+2.

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

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

RSI (7) > 70 на первом фрактале - сигнал к формированию треугольника с прорывом по тренду - вверх,

RSI (7) < 30 на первом фрактале - сигнал к формированию треугольника с прорывом по тренду - вниз.

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

С удовольствием бы потестировал такого советника!

Платежи и методы оплаты Платежи и методы оплаты
MQL5.community предлагает широкие возможности заработка трейдерам и разработчикам торговых приложений для терминала MetaTrader. В этой статье мы расскажем, как происходит оплата сервисов MQL5 и вывод заработанных денег, а также как обеспечивается безопасность операций.
Анализ основных характеристик временных рядов Анализ основных характеристик временных рядов
В статье представлен класс, предназначенный для осуществления быстрой предварительной оценки характеристик различных временных рядов. При этом производится оценка статистических параметров, автокорреляционной функции, строится гистограмма и производится спектральная оценка временного ряда.
Создание собственных критериев оптимизации параметров эксперта Создание собственных критериев оптимизации параметров эксперта
Терминал МetaTrader 5 дает новые возможности для оптимизации параметров создаваемых экспертов. Кроме уже имеющихся в тестере критериев оптимизации, разработчики получили инструмент для создания собственных критериев. Это открывает поистине безграничные возможности в тестировании и оптимизации экспертов. В статье рассматриваются практические способы построения таких критериев - как простых, так и достаточно сложных.
Теория адаптивных индикаторов и ее реализация в MQL5 Теория адаптивных индикаторов и ее реализация в MQL5
В этой статье будут описаны принципы написания адаптивных индикаторов и их реализация в MQL5. В качестве примеров рассмотрены индикаторы Adaptive Cyber Cycle, Adaptive Center of Gravity и Adaptive RVI. Все эти индикаторы были впервые представлены в книге Джона Элерса "Cybernetic Analysis for Stocks and Futures".