Mechanisches Handelssystem "Chuvashov's Dreieck"

Genkov | 29 April, 2016

Einführung

Der Artikel befasst sich mit Möglichkeiten zur Berechnung der Lage von Balken und voraussichtlicher Trendlinien-Schnittpunktzeit. Die Trendlinien Generierungsprinzipien sind nah an denen von T. DeMarks, bezogen auf den Aufbau von Trendlinien auf den letzten Zeitintervallen.

Die angebotene Anwendung kann als Teil in komplexere Systeme integriert werden, obwohl es ein vollwertiger automatisierter Expert Advisor ist.



Grundlagen des Aufbaus überschneidender Kanäle

Das Wesen des "Chuvashovs Dreieck" Muster liegt in der Idee, dass wir immer die zwei unteren und die zwei oberen Fractale zu jedem beliebigen Zeitpunkt haben. Trendlinien werden durch die zwei oberen und zwei unteren Fractale gezogen.

Wenn diese zwei Linien sich auf der rechten Seite schneiden, ein Dreieck erzeugend, dann haben wir das "Chuvashovs Dreieck" genannte Muster. Der Schnittpunkt dieser beiden Arbeitslinien nennt sich Apex. Nummerieren Sie alle 4 Fractale entsprechend Ihrem Erscheinen (von links nach rechts).

Zeichnen Sie die vertikale durch das zweite linke Fractal. Außerdem ziehen Sie die vertikale Linie durch den Apex. . Die Anzahl der Kerzen zwischen diesen zwei vertikalen Linien, einschließlich der Kerzen auf den Linien, wird dividiert durch 3, gerundet links zu dem Apex gesetzt und die dritte vertikale Linie wird gezeichnet.

Der Abstand zwischen der durch das zweite Fractal gezogenen Vertikalen und der mittleren Vertikalen wird den tatsächlichen Durchbruchbereich bilden.

Abb. 1. Zeichnen des Dreiecks

Gehen wir zum Zeichnen des Dreiecks.

Es können mehrere Positionen der letzten 4 Fractale bestehen, an denen es entweder unmöglich ist das Dreieck zu zeichnen, oder es stellt sich als zu kurz oder zu lang heraus.

Abb. 2. Beispiele ungünstiger Lagen von Fractalen

Daher ist es notwendig eine Anzahl an Bedingungen einzuführen, die ausreichend sind zum Zeichnen des Dreiecks:

Einige Bedingungen der Dreiecks Linien Konvergenz:

  • Die ersten Fractale der oberen und unteren Linie sollen mit mehr als 20-30 Pips Abstand in der Höhe auseinander liegen Dieser Wert kann während des Tests genauer spezifiziert werden).
  • Die Größe der ersten Fractale der oberen und unteren Linien solle kleiner sein als die Größe zwischen den zweiten Fractalen dieser Linie.
  • Das erste Fractal der oberen Linie sollte niedriger sein als das zweite Fractal der gleichen Linie, während das erste Fractal der unteren Linie oberhalb des zweiten der Linie liegen sollte.

Diese zusätzlichen Bedingungen wurden berücksichtigt in den Programm-Block der Muster-bildenden Bedingungen.

Abb. 3. Tatsächlicher Durchbruchbereich

Es scheint klar zu sein, aber gehen wir zu Abb. 3. Wie können wir die Nummer des Balkens bestimmen, an dem der Schnittpunkt der beiden Arbeitslinie auftreten wird?

In dem Moment des Linien-Durchbruchs ist es noch nicht bekannt, ob dies ein wirklicher Durchbruch ist, obwohl es bereits Zeit ist in den Markt einzutreten! Der tatsächliche Durchbruchbereich-Berechnungsblock löst diese Frage mit Zeitparametern, d.h. er bestimmt den Schnittpunkt der Arbeitslinien im Zeitbereich.

Wir wissen, dass jeder Balken auf dem Chart nach einer bestimmten Zeit erscheint. Beispielsweise erscheinen Balken auf einen H1 Chart einmal in der Stunde. Die Rate der Kursänderung pro Zeiteinheit für jede der Zwei Linien zu kennen, ermöglicht es die Zeit der Kreuzung zu berechnen. Durch das Kennen der Menge an Zeit von der "Basis" des Dreiecks bis zu dem Moment der Kreuzung, ist es möglich die Anzahl der Balken (Zeiteinheiten) vor der Kreuzung zu berechnen. Der tatsächliche Durchbruchbereich wird in demselben Block bestimmt.

Der Expert Advisor ist auf einer Block-für-Block Basis entworfen.

Die am häufigsten wiederholten Funktionsblöcke befinden sich in der Regel am Anfang des Programms: Öffnen und Schließen von Positionen, Funktionen zum Zeichnen von Zeichen und Linien. Das ausführbare Hauptprogramm enthält außerdem separate Blöcke, wie zum Beispiel:

  • Block für die Suche nach oberen und unteren Fractalen,
  • Block der Muster-bildenden Bedingungen,
  • Block für die Berechnung des tatsächlichen Durchbruchbereichs,
  • Block der Bedingungen zum Öffnen von Positionen.

Das Fragment der Funktionsblöcke ist im Folgenden dargestellt.

// --------------------------------------------------------------------+
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 order open error  # ",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 order open error  # ",GetLastError()); }
      return(0);
     }
//+--------------------------------------------------------------------+
void Close_S_Ch()
  {
  if(!OrderClose(OrderTicket(),OrderLots(),Ask,2,Aqua))  
      {Print(" Cl.ord.# ",OrderTicket()," Error # ",GetLastError());}
      return(0);
     }
//+--------------------------------------------------------------------+

Die Suche nach den oberen und unteren Bezugspunkten für den Aufbau der Arbeitslinien des Dreiecks wird bereitgestellt in der Sortierschleife der Balken, nach den Regeln der Fractalerzeugung.

Die Nummerierung der Bezugspunkte wird ausgeführt unter Berücksichtigung, dass "Indexieren der Elemente von Zeitreihen wird rückwärts ausgeführt, von dem letzten zu dem ersten. Der aktuelle Balken, welcher der allerletzte in dem Array ist, hat einen Index von 0".

// ====================================================================+
// (upper and lower fractals searching block) ---------------------------+
   for (i=M;i<=N;i++) // reference points (fractals) searching loop
    {//loop b
   // searching for upper fractals -----------------------------------------+
   if(High[i]>High[i+1] && High[i]>High[i+2] && 
      High[i]>High[i-1] && High[i]>High[i-2])
     {// frac_b
      Tfnb++;   // counter 
   // ----------------------------  
     if(Tfnb==1)     
           {             // for the 1 st fractal: price, index, time.
           TF1B=High[i]; Tf1b=i; timf1b=iTime(Symbol(),Period(),i); 
      }//-counter_1
   // ----------------------------
          if(Tfnb==2)    
           {//counter_2                       // price, index, time.
            TF2B=High[i]; Tf2b=i; timf2b=iTime(Symbol(),Period(),i); break;
           }//-counter_2
        // ----------------------------   
     }//-frac_b
    }//-b loop
// --------------------------------------------------------------------+
   for (i=M;i<=N;i++) // reference points (fractals) searching loop
    {//s loop
   // searching for lower fractals ------------------------------------------+
   if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && 
      Low[i]<Low[i-1] && Low[i]<Low[i-2])
     {// frac_s
      Tfns++; 
     if(Tfns==1)     
           {//counter_1                    // price, index, time.
           TF1S=Low[i]; Tf1s=i; timf1s=iTime(Symbol(),Period(),i); 
           }//-counter_1
           if(Tfns==2)      
            {//counter_2                    // price, index, time.
            TF2S=Low[i]; Tf2s=i; timf2s=iTime(Symbol(),Period(),i); break;
           }//-counter_2
     }//-frac_s
    }//- loop s 
// ---------------------------(upper and lower fractals searching block)-+

Die folgenden Bedingungen wurden in den Konvergenz-Block der Arbeitslinien zum Bilden des Dreiecks eingeschlossen:

  1. Die ersten Fractale sollten 20-30 Pips voneinander beabstandet sein,
  2. Das erste Fractal einer Arbeitslinie sollte Weniger sein als das zweite einer anderen,
  3. Alle 4 Bezugspunkte unterscheiden sich von "0", d.h. sie haben reale Werte,
  4. Zeitparameter von Bezugspunkten müssen sich von "0" unterscheiden,
  5. Der erste obere Bezugspunkt liegt unterhalb dem zweiten oberen und der erste untere Punkt ist höher als der zweite untere Punkt,
  6. Die Differenz zwischen den zweiten Fractalen der Linien sollte 150 Pips nicht überschreiten.
// ---------------------------------------------------------------------------+
   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)   
    {// triangle drawing conditions
//===========================================================================+

Nach Erfüllung der Vorbedingungen, berechnen sie die Raten der Kursänderungen für obere und untere Arbeitslinien:

// -----------------------------------------------------------------------------+
   // -   (block Price change rate calculation)(upper and lower pips per one bar)
   if(TF1B!=TF2B) {RatePriceH=MathAbs((TF2B-TF1B)/(Tf2b-Tf1b));} // for the upper
   if(TF1S!=TF2S) {RatePriceS=MathAbs((TF1S-TF2S)/(Tf2s-Tf1s));} // for the lower 
   // Print(" RatePriceS= ",RatePriceS); Print(" RatePriceH= ",RatePriceH);
// -------------------------------------(block Price change rate calculation)---+

An diesem Punkt befinden sich 4 letzte Fractale nach den Bedingungen zur Dreiecksbildung, obwohl es noch nicht klar ist, wie weit der Apex sein wird und wo der tatsächliche Durchbruchbereich sich befinden wird. Die Apex-Berechnung ist anhängig von dem zweiten Fractal aus den letzten vier während ihrer Entstehung ab (von links nach rechts auf dem Chart).

Der Anfangspunkt für die lange Arbeitslinie muss definiert werden als ein Schnittpunkt der Vertikalen durch das zweite Fractal der kurzen Arbeitslinie durch die lange. In dieser Hinsicht ist der weitere Programmalgorithmus in zwei Richtungen der tatsächlichen Durchbruchbereiche-Berechnung verzweigt: "lange" obere und "lange" untere Arbeitslinie

Grundlegende Code-Fragmente, die eine der Richtungen berücksichtigen sind weiter unten dargestellt. Die zweite Richtung wird mit dem gleichen Algorithmus berechnet.

// ???????????????????????????????? 1. upper working line is longer than the lower one  ??????????????????????????????????????+ 
// - (block of searching for the working line's intersection point) ----------------------------------------------------------+
// If the upper working line is longer than the lower one - find the intersection point on 50 bars
   if(Tf2b>Tf2s && TF2B>TF1B && TF2S<TF1S)
    {// The upper working line is longer
     // the starting price for calculation of values at each bar of the upper working line 
     Starting_Price_H=TF2B-RatePriceH*(Tf2b-Tf2s); 
     // the starting price for calculation of values at each bar of the upper working line 
     Starting_Price_S=TF2S;
     //the time of drawing the vertical line at the triangle's base
     time_starting=timf2s; 
     // ------------------------------------
    for(int k=1;k<=50;k++)
    {//50b loop
     PricB[k]=Starting_Price_H-RatePriceH*k;      // minus fall rate
     PricS[k]=Starting_Price_S+RatePriceS*k;      // plus rising rate
                            //       if prices of the upper and lower lines' projections coincide or the price of the upper one 
    if(PricB[k]<=PricS[k])  // has become less than that of the lower one, then there is the intersection with the working line 
     {//there is the intersection
     P_Tria=PricB[k-1];                                        // working line intersection price (-1) - should be one bar less
     cut_left=k;  break;                                       //     number of bars from the base up to the intersection point
     }//-there is an intersection
    }//-50b loop
// -------------------------------------- (block of searching for working line's intersection point)--------------------------+

Jetzt können wir anfangen die Zeitparameter des tatsächlichen Durchbruchbereichs zu berechnen:

// ---------------------------------------------------------------------------+
// - (block of calculating time intervals for the actual breakthrough area)-----------+
// Introduce two additional limitations:
// 1. The Apex should not be located more than 50 bars far from the triangle's base
// 2. The Apex should not be located closer than 15 bars to the triangle's base.
   if(cut_left<50 && cut_left>12)
    {//triangle with all limitations
     time_Apex=timf2s+cut_left*T_period;                        // Apex generation time
     //  divide the number of bars by three, take 2/3 and round them off to the integer
     // value: MathRound(cut_left/3*2) -number of bars for the actual breakthrough area
     time_bar_zona=time_starting+MathRound(cut_left/3*2)*T_period;          //area time
     //      pattern creation conditions fulfilled, actual breakthrough area calculated  
     PatternTch=true;                          // "Chuvashov's Triangle" pattern formed
     }//-triangle with all limitations
// ------------(block of calculating time intervals for the actual breakthrough area)-+

Nun, nachdem das Muster gebildet wurde, kann der Block zum Zeichnen des Dreiecks seine Arbeit aufnehmen:

// - (block of drawing the triangle after the pattern has been formed) ---+
   if(PatternTch==true)
    {//there is a pattern
    Del_Frb(); Del_Frs();       // delete previous upper and lower fractals
    CreateArrow_Frb(); CreateArrow_Frs();  // draw upper and lower fractals
    Create_Tr_H(); Create_Tr_S();       // draw upper and lower trend lines
    CreateLzona(); CreateLbasis(); CreateLApex();    // draw vertical lines
    CreateTriangleH();               // draw the triangle by the upper line
    ObjectDelete("TRS");   // delete the triangle drawing by the lower line
// -----(block of drawing the triangle after the pattern has been formed)-+ 
The screenshot below displays the operation of "Chuvashov's Triangle" pattern drawing block:

Der Block zum Öffnen von Positionen tritt dann in Aktion.

Wenn die Bedingungen zum Positionsöffnen erfüllt sind, wird das Zeichnen des Kanals mit der überschrittenen Arbeitslinie berechnet. Der Kanal wurde erstellt.

StopLoss und TakeProfit werden unter Berücksichtigung der Anforderungen des Money-Management Systems berechnet und die Position wird geöffnet(In diesem Fall, die Buy-Position - siehe Screenshot unten).

Allerdings kann die Position in zwei Richtungen geöffnet werden, wenn die Bedingungen in beide Richtungen erfüllt sind (siehe Screenshot unten).

Das Programm verfolgt dann die Lebenszeit des Musters

Wenn die aktuelle Zeit die Zeit des tatsächlichen Durchbruchs überschreitet, führt das Programm ein Verbot zum Öffnen von Positionen ein. Wenn die Aktuelle Zeit den Apex übertrifft, löscht das Programm alle Musterzeichnungen und bereinigt das Chart von den bereits unnötigen Zeichen und Linien.

Lebenszeit des Musters Block wird unten angezeigt.

// - (block defining the pattern's life time) -------------------------------+
// if the current time exceeds the actual breakthrough area boundary's time, the pattern loses its power
   if((TimeCurrent()-time_bar_zona)>=T_period)
    {
     PatternTch=false; // the pattern is outdated - introduce the ban on opening positions
    }
    // after the current time exceeds the Apex one
    if((TimeCurrent()-time_Apex)>=T_period) 
     {
      // delete pattern signs and lines from the chart 
      Del_Frs(); Del_Frb(); Del_TrLin();
      // delete the lines of channel profit size by the upper working line 
      ObjectDelete("Tr_B1h"); ObjectDelete("Tr_B1hh"); ObjectDelete("Tr_B1hs");ObjectDelete("Tr_B1s");
      // delete the lines of channel profit size by the lower working line 
      ObjectDelete("Tr_S1s"); ObjectDelete("Tr_S1sh"); ObjectDelete("Tr_S1ss");ObjectDelete("Tr_S1h");
      // delete the vertical lines of the actual breakthrough area
      ObjectDelete("L1");ObjectDelete("zona");ObjectDelete("Ap");
      ObjectDelete("TRH"); ObjectDelete("TRS");
     }
// --------------------(block defining the pattern's life time)-+

Ergebnisse dieser Blockoperation werden rechts im vorherigen Screenshot angezeigt.

Der hier vorgestellte Expert Advisor zeigte positive Ergebnisse als mechanisches Handelssystem während des automatischen Tests:

  • Bruttogewinn und Bruttoverlust Verhältnis P/F = 38869/16480 = 2.36 (mehr als 2);
  • Anzahl der Trades = 101 (nicht weniger als 100);
  • Rückgang Prozentsatz = 25,18% (siehe angehangene Datei).

Das kurze Fazit ist wie folgt:

Die beschriebene Technik kann von Tradern als Handelssystem-Komponente verwendet werden, aber ein Positionsöffnung-Filter sollte als Verbesserung hinzugefügt werden.

Die hier oben vorgeschlagenen Filter können verbessert werden, wie es empfohlen wird von dem Autor der Technik Stanislav Chuvashov.

Hinweise zu den angehangenen Dateien:

  • Triangle_H1_v46.mq4 – angebotenes MTC
  • Strategy_Tester_Report_46.zip – Testergebnis
  • table_3.zip – für Fans der Analyse