Sistema de trading mecánico "Triángulo de Chuvashov"

Genkov | 12 abril, 2016

Introducción

El artículo trata las posibilidades de cálculo de la ubicación de las barras y el tiempo de intersección de las líneas en prospecto. Los principios de generación de líneas de tendencia están cerrados a los de T. De Mark, relacionados con la construcción de un TD en los últimos intervalos de tiempo.

La aplicación que se ofrece se puede integrar en un sistema de trading más complejo como su parte, aunque es un Asesor Experto total.



Principios básicos de construcción de canales entrecruzados

La esencia del patrón del "Triángulo de Chuvashov" reside en la idea de que siempre se tienen los dos últimos fractales más bajos y los dos últimos más altos en cualquier punto de tiempo. Las líneas de tendencia se dibujan a través de los fractales más altos y los dos más bajos.

Si estas dos líneas se entrecruzan durante la continuación de la generación correcta del triángulo, se produce un patrón llamado el "Triángulo de Chuvashov". El punto de intersección de estas dos líneas de trabajo se llama Apex. Numera los 4 fractales en orden de aparición (de izquierda a derecha).

Dibuja una línea vertical por el segundo fractal de la izquierda. Dibuja también una línea vertical por el Apex. El número de velas entre esas dos líneas verticales, incluidas las velas en las lineas, se divide entre 3, se redondea, se coloca a la izquierda del Apex, y se dibuja una tercera línea.

La distancia entre la línea vertical a través del segundo fractal y la línea del medio formará el área real de avance.

Fig. 1. Dibujar el triángulo

Vamos a pasar a dibujar el triángulo.

Puede haber varias posiciones para los últimos 4 fractales, en las que o es imposible dibujar el triángulo o resulta ser muy corto o muy largo.

Fig. 2. Ejemplos de fractales en una posición poco favorable.

Además, es necesario introducir un número de condiciones que sea suficiente para dibujar el triángulo:

Algunas condiciones de la coincidencia de las líneas del triángulo:

Estas condiciones adicionales se han considerado en el bloque del programa de las condiciones de formación del patrón.

Fig. 3. Área real de avance

Parece claro, pero miremos la Img. 3. ¿Cómo se puede definir el número de la barra en la que tiene lugar la intersección de las dos líneas de trabajo?

En el momento del avance de la línea, aún no se sabe si este avance es real, aunque ya sea la hora de entrar al mercado. El bloque de cálculo del área real de avance resuelve este problema utilizando parámetros de tiempo, es decir, define la intersección de las líneas de trabajo en el rango de tiempo.

Se sabe que cada barra aparece en el gráfico después de un tiempo concreto. Por ejemplo, las barras nuevas aparecen en H1 cada hora. Sabiendo la tasa de cambio de precio por unidad de tiempo de cada una de las dos líneas, es posible calcular la hora de la intersección. Sabiendo la cantidad de tiempo de la "base" del Triángulo en el momento de la intersección, es posible calcular el número de barras (unidades de tiempo) antes de la intersección. El área real de avance se define en el mismo bloque.

El Asesor Experto está diseñado en un principio de bloque por bloque.

Los bloques funcionales más repetidos están ubicados generalmente al principio del programa: abriendo y cerrando posiciones, funciones para dibujar señales y líneas. El programa ejecutable principal también tiene bloques separados, como:

A continuación se muestra el fragmento de los bloques funcionales.

// --------------------------------------------------------------------+
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);
     }
//+--------------------------------------------------------------------+

La búsqueda de los puntos de referencia superiores e inferiores para construir las líneas de trabajo del triángulo se proporciona en el circuito de clasificación según las reglas de la creación de fractales.

El número de puntos de referencia se realiza considerando que la "indización de elementos de series de tiempo se realiza desde atrás, desde el último hasta el primero. La barra actual, que es la última de la gama, tiene un índice de 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)-+

Las siguientes condiciones se han incluido en el bloque de convergencia de las líneas de trabajo del triángulo:

  1. Los primeros fractales deberían espaciarse más de 20-30 pips;
  2. Los primeros fractales de una línea en funcionamiento deberían ser menores que el segundo fractal de otra;
  3. Los 4 puntos de referencia son diferentes a "0", es decir, tienen valores reales;
  4. Los parámetros de tiempo de los puntos de referencia deberían ser diferentes a "0";
  5. El primer punto de referencia superior está por debajo del segundo superior y el primer punto más bajo es más alto que el segundo punto más bajo;
  6. La diferencia entre los segundos fractales de la línea no debería exceder los 150 pips.
// ---------------------------------------------------------------------------+
   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
//===========================================================================+

Después de rellenar las condiciones preliminares, calcule las tasas de los cambios de precio para las líneas superiores e inferiores en funcionamiento:

// -----------------------------------------------------------------------------+
   // -   (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)---+
-->

En este punto, los 4 últimos fractales se colocan de acuerdo al triángulo que forma las condiciones, por lo que no está claro aún cómo de lejos estará el Apex y cuando se ubicará el área real de avance. El cálculo del Apex depende de la ubicación del segundo de los cuatro últimos fractales durante su generación (de izquierda a derecha en el gráfico).

El punto de inicio de la línea en funcionamiento larga debería definirse como un punto de intersección vertical dibujado a través del segundo fractal de la línea en funcionamiento más corta. Con respecto a esto, el siguiente algoritmo del programa se bifurca en dos direcciones del cálculo del área real de avance: línea de trabajo "larga" superior y "larga" inferior.

A continuación se muestran los fragmentos de código básico relativos a las direcciones. La segunda dirección se calcula utilizando el mismo algoritmo.

// жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 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)--------------------------+

Ahora se pueden empezar a calcular los parámetros de tiempo del área real de avance.

// ---------------------------------------------------------------------------+
// - (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)-+

Después de crear el patrón, el bloque de dibujo del triángulo empieza a funcionar:

// - (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)-+ 
La siguiente captura muestra el funcionamiento del bloque de dibujo del patrón del "Triángulo de Chuvashov".-->

El bloque de apertura de posiciones entra en acción en ese momento.

Si se completan las condiciones para la apertura de posiciones, se calcula el dibujo del canal con la línea de trabajo superada. Se ha creado el canal.

StopLoss y TakeProfit se calcularán considerando los requisitos del sistema de gestión monetaria y se abrirá una posición (en este caso, la de BUY - vea la captura de pantalla).

Sin embargo, se pueden abrir posiciones en las dos direcciones si se completan las condiciones de apertura en ambas (vea la captura de pantalla).

En ese momento, el programa rastrear la durabilidad del patrón.

Si el tiempo actual excede el tiempo del área real de avance, el programa prohíbe la apertura de posiciones. Si el tiempo actual excede el del Apex, el programa elimina todos los dibujos de patrones, limpiando el gráfico de las ya innecesarias señales y líneas.

La durabilidad del código del bloque se muestra a continuación.

// - (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)-+

Los resultados del funcionamiento de este bloque se muestran en el lado derecho de la captura de pantalla anterior.

El Asesor Experto que se muestra aquí mostró resultados positivos como sistema de trading mecánico durante la prueba automática:

La pequeña conclusión es la siguiente:

Los traders pueden utilizar la técnica de trading descrita como un componente del sistema de trading, pero los filtros de apertura de posición se deben añadir como una mejora.

El autor puede mejorar los filtros propuestos anteriormente con la técnica de Stanislav Chucashov.

Notas sobre los documentos adjuntos: