Скачать MetaTrader 5

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

15 июня 2011, 13:54
Genkov
13
6 891


Введение

В статье рассматриваются возможности расчета расположения баров и времени пересечения трендовых линий в перспективе. Принципы построения трендовых линий близки к подходам Т. Демарка по построению 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)
MQL4 Comments
MQL4 Comments | 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
Пака эта методика мне результатов не принесла, буду учится дальше а так информация нужная!
MQL4 Comments
MQL4 Comments | 12 окт 2012 в 11:06

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

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

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

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

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

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

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

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

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

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

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

См. рисунок:

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

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

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

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

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

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

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

Переход на новые рельсы: пользовательские индикаторы в MQL5 Переход на новые рельсы: пользовательские индикаторы в MQL5

Я не буду перечислять все новые возможности и особенности нового терминала и языка. Их действительно много, и некоторые новинки вполне достойны освещения в отдельной статье. Вы не увидите здесь кода, написанного по принципам объектно-ориентированного программирования — это слишком серьезная тема для того, чтобы просто быть упомянутой в контексте как дополнительная вкусность для кодописателей. В этой статье остановимся подробней на индикаторах, их строении, отображении, видах, а также особенностях их написания по сравнению с MQL4.

Вот мы и получили долгожданные MetaTrader 5 и MQL5 Вот мы и получили долгожданные MetaTrader 5 и MQL5

Это очень краткий обзор MetaTrader 5. Я не могу описать все новшества системы за столь короткий период времени - тестирование стартовало 09-09-2009. Это символическая дата, и я уверен, что это будет счастливым числом. Всего несколько дней у меня на руках бета-версия терминала MetaTrader 5 и MQL5. Я не успел опробовать все, что в нем есть нового, но то, что есть, уже впечатляет.

Портфельная торговля в MetaTrader 4 Портфельная торговля в MetaTrader 4

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

Работа с корзинами валютных пар на рынке Форекс Работа с корзинами валютных пар на рынке Форекс

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