English Русский 中文 Deutsch 日本語 Português
Sistema de Trading Mecánico "Horquilla de Chuvashov"

Sistema de Trading Mecánico "Horquilla de Chuvashov"

MetaTrader 4Sistemas comerciales | 14 septiembre 2015, 12:44
1 534 0
Genkov
Genkov

"Estamos interesados en los valores más recientes para producir líneas de tendencia"
Thomas DeMark

Introducción

Stanislav Chuvashov propuso una técnica de trading de Forexusando el patrón de "horquilla de Chuvashov". En esta técnica, el enfoque del análisis de mercado tiene algo en común con el enfoque de DeMark trazando líneas de tendencia para el último intervalo de tiempo más cercano.


1. Método de elaboración de patrón de líneas "Horquilla de Chuvashov"

El indicador fractals se utiliza para dibujar el "horquilla de Chuvashov" patrón. Se dibuja la línea de tendencia principal pasando a través de los dos fractales vecinos 1 y 2 como se muestra en la tabla de precios (ver figura de abajo). La línea de tendencia alcista principal se dibuja basandose en fractales inferiores; la línea de tendencia bajista principal se dibuja basandose en fractales superiores.


Figura 1. Dibujo de la "horquilla de Chuvashov" patrón

Debemos esperar hasta que un fractal similar 3 se obtiene formado siguiendo el desglose de líneas de tendencia principal en la dirección opuesta a la tendencia. Una línea lateral a través de los fractales 2 y 3 junto a la línea de tendencia principal forma el patrón "horquilla de Chuvashov"(CF). Este es el nombre dado por el autor Stanislav Chuvashov.

El principal requisito del patrón de CF es que la línea lateral de la horquilla debe ser en la dirección de la tendencia. Líneas laterales rompiendo a través de dar lugar a señales: para vender en tendencia alcista y comprar en tendencia bajista.

Abajo está la secuencia de formación del patrón "horquilla de Chuvashov" ejemplificado en EURUSD H1 en 4 días consecutivos.


Figura 2. Formación del patrón "Horquilla de Chuvashov"

La figura 2 muestra la aparición del patrón "horquilla de Chuvashov" (CF) en la tendencia alcista que sugiere el fin de la tendencia o que la tendencia es plana. РњРўS abre una posición de venta.


Figura 3. Nuevo patrón de CF

6 barras (horas) más tarde, surgió que un nuevo patrón de CF con una brecha más amplia (Fig. 3) confirme el patrón anterior que sugere la reversión de la tendencia o ir plana.

MTS cierra la posición anteriorde venta en el nivel de Take Profit y abre una posición de venta nuevo en las condiciones del patrón de CF.


Figura 4. Confirmación del patrón de CF

La Figura 4 muestra que después de la reversión de la tendencia sobre el 11 de octubre, la tendencia que iba hacia abajo se confirma al principio del 12 de octubre por el patrón de CF dirigido hacia abajo.

Al mediodía, un nuevo cambio de tendencia comenzó a tomar forma y el precio se movió hacia la línea lateral del CF. Después del crude de la línea lateral, la posición de venta existente puede ser cerrada y se puede abrir una posición de compra.


Figura 5. Cambio de tendencia

Como puede verse en la figura 5, la tendencia se mantiene hacia arriba en la parte restante del día 12 de octubre y principios del 13 de octubre. Hacia la mitad del día, surge un patrón ascendente del CF. Otro cambio de tendencia se comenzó a mostrar en la mitad del día 13 de octubre. Siguiendo las señales formadas, MTS cerrará la posición de compra y se abrirá una posición de venta.

La anterior secuencia de formación de patrón puede rastrearse mediante el probador de estrategias en el modo de visualización a una velocidad baja, probando el archivo adjunto Fork_Ch_ExpertH1_v2.mq4 como Asesor Experto.


Figura 6. Las señales de Trading

La figura 6 proporciona algunas aclaraciones en cuanto a las señales de apertura y cierre de posiciones.


2. Algunas características del código propuesto para la "Horquilla de Chuvashov" en MQL4

La lista de variables, funciones para la apertura y cierre de órdenes, funciones de trazado de marcas y líneas de tendencia quedan sin comentarios en el código de abajo y no está previsto en el artículo ya que pueden encontrarse en los programas de los archivos adjuntos y son lo suficientemente simples de averiguar.

Tenga en cuenta que algunas variables se incluyen en la función principal del programa Start() ya que deben tender a cero en cada tick.

Comenzamos con la búsqueda de los tres últimos fractales consecutivos situados a lo largo, por ejemplo, de una tendencia bajista. En este caso, obtenemos una horquilla dirigida hacia abajo. Si hay una ruptura por encima de la línea lateral, se puede abrir una posición de compra.

// ===================================================================
// Bucle de búsqueda de los tres últimos fractales consecutivos (Caso de Compra)
// Acostado a lo largo de la tendencia bajista para la construcción del Horquilla de Chuvashov
// ==================================================================+
   for (i=M;i<=N;i++)
    {//loop
    if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>High[i-1] && High[i]>High[i-2])
     {
      VFN++; // contador del fractal encuentrado.

      if(VFN==1) // f1
      { Vnf1=i;                // almacenar el número máximo de barra del fractal encontrado.
        VMF1=High[i];          // almacenar el valor máximo del 1er fractal encontrado.
        tim1=iTime(NULL,0,i);  // almacenar el tiempo del 2 º punto de referencia.
      } //-f1 

    // --------------------------------------------------------------+
      if(VFN==2)                // si se encuentra el 2º fractal, guarde los siguientes valores: Max [i], Nº de vela [i], tiempo [i]:
      { VMF2=High[i];           // almacenar el valor máximo del 2º fractal encontrado.
        if(VMF2>VMF1)           // si el valor máximo del 2 º fractal es mayor que el del 1r fractal(es decir, dirigido hacia abajo),
        { Vnf2=i;               // almacenar el número máximo de barra del fractal encontrado. 
          tim2=iTime(NULL,0,i); // almacenar el tiempo del 2 º punto de referencia.
        }
      }
    // --------------------------------------------------------------+
    if(VFN==3)                  // si se encuentra el 3r fractal, guarde los siguientes valores: Max[i], candlestick no.[i], time[i]:
    { 
      VMF3=High[i];             // almacenar el valor máximo del 3r fractal encontrado.
      if(VMF3>VMF2)             // i el valor máximo del 3r fractal es mayor que el del 2ºfractale,
       {Vnf3=i;                 // almacenar el número máximo de barras del 3r fractal.
        tim3=iTime(NULL,0,i);   // almacednar el tiempo del 3r punto de referencia.
       }
    }
// ------------------------------------------------------------------+
   if(VFN==3) break; // los tres fractales son encuentrados, salir del bucle.
// ------------------------------------------------------------------+ 
    }                 
   }//-bucle 

En el bucle anterior, hemos encontrado tres fractales en la forma especificada, es decir, el 1r fractal es menor que el 2º fractal y el 2º fractal es menor que el 3r fractal. Los fractales 3 º y 2 º son puntos de referencia en la construcción de la línea de tendencia principal y forman la base.

Sin embargo el 3r fractal (su valor) puede llegar a ser inferior a la proyección de la línea de tendencia principal en la vertical del 1r fractal:


Figura 7. Refinamiento de la ubicación del punto de referencia

Por lo tanto, presentamos a una número de operadores que refinan la ubicación del 3er punto de referencia conforme a los requisitos de construcción de patrones.

// ------------------------------------------------------------------+
   if(VMF3>VMF2 && VMF2>VMF1)
    {  
    // Vamos a definir si la línea de tendencia lateral (2) es superior a la proyección de la PRINCIPAL(1)
    // ¿línea de tendencia? Para ello, calculamos el valor del precio de la proyección de la línea de tendencia MAIN(1)
    // en la vertical del valor máximo del fractal 1:
    V_down1=((VMF3-VMF2)/(Vnf3-Vnf2));      // velocidades de caída de la linea de tendencia MAIN(1) de más de 1 bar.
    PricePrL1_1f=VMF2-(Vnf2-Vnf1)*V_down1;  // precio de la proyección de la línea de tendencia MAIN(1) en la vertical del 1r fractal.
    // Compararemos el valor del precio del 1r fractal con el precio de la proyección de la línea de tendencia MAIN(1)
    // en la vertical del valor máximo del 1r fractal, y si el precio máximo del 1r fractal es mayor que el precio de la proyección del
    // linea de tendencia MAIN(1) en el mismo fractal, entonces se cumplen los requisitos de construcción de la horquilla Chuvashov.     
    if(VMF1>PricePrL1_1f) // si ha surgido un patrón de apertura una posición de compra
     {     
     V_down2=((VMF2-VMF1)/(Vnf2-Vnf1));  // velocidades de caída de la linea de tendencia lateral de más de 1 barra.     
     PricePrL2_1b=VMF1-Vnf1*V_down2;     // precio de la proyección de la línea de tendencia Lateral(2) en la actual 1ª BARRA
     PricePrL1_1b=VMF2-Vnf1*V_down1;     // precio de la proyección de la línea de tendencia MAIN(1) en la actual 1ª BARRA
     // Tenga en cuenta que ha emergido el patrón para la apertura de una posición de compra
     patternBuy = true; patternSell = false;   // ha emergido el patrón para abrir una posición de compra
     // trazo de las marcas y líneas de la "horquilla de Chuvashov" patrón
     DelLine(); CreateLine(); CreateArrow();   // trazo de las marcas y líneas después de haber eliminado las anteriores
     }
    }
// ==================================================================+

Si el precio máximo del 1r fractal es mayor que el precio de la proyección de la línea de tendencia MAIN(1) en el mismo fractal, entonces se cumplen los requisitos de contrucción de la horquilla Chuvashov.

Así, el patrón de la "horquilla de Chuvashov" ha sido determinado y podemos trazar las líneas y marcas del patrón respectivo en el gráfico.

Ahora debemos determinar las condiciones y parámetros de la apertura de posición BUY.

// ==================================================================+    
//               apertura de posiciones de Compra                    +
// ==================================================================+
   if(OrdersTotal()<1) // podemos colocar una (o 2, 3 etc.) órdenes  
    {  //abrir una posixión
// ------------------------------------------------------------------+
   if(patternBuy==true)
    { //patternBuy

Sería mejor si la gama de precio durante las últimas 25 barras fuera por lo menos 50 puntos.

Permítanos añadir condiciones adicionales, por ejemplo, una media móvil de periodo de 150 en los últimos 24 o 48 horas (barras) se dirige hacia abajo y el precio será más bajo de 89 puntos en este indicador (nivel Fibo89s).

 // 1ª condición adicional - el rango de precio en las últimas 25 barras es de al menos 50 puntos.
if((High[iHighest(Symbol(),Period(),MODE_HIGH,25,0)]-Low[iLowest(Symbol(),Period(),MODE_LOW,25,0)])>=50*Point)
  {// rango de precios
   // ejemplo de 2ª condición adicional, si el precio es menor de 89 pips por debajo del nivel del Ma144 (MA de 12 al cuadrado) 
  if(Bid<Ma144_1-89*Point &&       // el precio es más bajo que el nivel de Fibo89s   
     (Ma144_1-Ma144_48)<0)         // la pendiente de la Ma144 es negativa
   {//2ª condición adicional

La condición principal para la apertura de una posición es cruzar de la línea de patrón lateral por precio.

Por ejemplo, puede ser como sigue:

if((High[1]>PricePrL2_1b ||                          // El Máximo de la vela es más alto que la proyección lateral de la 1ª barra
    Close[1]>PricePrL2_1b ||                         // cualquier vela que cierre por encima de la proyección de la 1ª barra
    (Open[1]<Close[1] && Close[1]>PricePrL2_1b) ||   // la vela blanca cruza la proyección de la 1ª barra
    Bid>PricePrL2_1b) && Bid<PricePrL2_1b+3*Point)   // no mayor que 3 pips del precio de la proyección de la 1ª barra
   {

Además, definimos los parámetros de Stop Loss y Take Profit. Establecer Stop Loss para ser igual al valor mínimo del precio sobre el intervalo de la barra "0" a la barrade l 2º fractal, es decir, en el bajo nivel del 1r fractal. Establecer Take Profit en el nivel de 0,6 del rango de precios.

Puesto que esta estrategia presupone trazado por fractales más bajos de la tendencia alcista, establecemos Take Profit para estar más de dos rangos del precio mínimo, por ejemplo: 100-200 puntos.

  {// abrir una posición de compra.
   // Calcular el Stop Loss como valor precio Min sobre el intervalo de la barra "0" a la barra del 2º fractal.
  SL_B=(Bid-Low[iLowest(Symbol(),Period(),MODE_LOW,Vnf2,0)])/Point;
  if(SL_B<StopLevel) SL_B=Bid-(StopLevel+2)*Point; // si SL_B es inferior al StopLevel
  TP_B=120;
  Print("  OP_BUY Chuvashov's Fork","  VMF1 = ",VMF1," < ",PricePrH1_1f);
  Op_Buy_Ch();
  return;
  }//- abriendo una posición de compra. 

La búsqueda de los tres últimos fractales consecutivas acostado a lo largo de la tendencia alcista está basado en fractales inferiores y todo el proceso de hacer un patrón ascendente sigue la lógica de un patrón en una tendencia bajista.

//+=======================================================================+
//              proceder al TRAZO de las posiciones abiertas              +
//+=======================================================================+
for (i=OrdersTotal()-1; i>=0; i--)        // bucle de selección órdenes de compra 
   {//bucle de selección órdenes de Compra
  if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {Print("Order selection error = ", GetLastError()); }
   if(OrderType()==OP_BUY )                // si se colocan ódenes de compra
    { //2-type_Buy

Si un patrón de tendencia alcista ha emergido mientras que una posición de compra se abre, significa que el precio ha dado la vuelta alrededor y empezó a ir hacia abajo. La posición de Compra debe ser cerrada.

//+=======================================================================+
//|  Condiciones para el cierre de posiciones de Compra                       +
//+=======================================================================+
   if(patternSell==true)         //  surge un patrón para la apertura de una posición de Venta
    { 
    Print(" cerrar la posición de compra como el patrón opuesto ha emergido");
    Close_B_Ch();         // cerrar la posición de Venta
    return; 
    }
//+=======================================================================+

Pasamos a la modificación de la posición de compra abierta.

El proceso de modificación se divide en 3 etapas. En la primera etapa, trazamos el Stop Loss más cercano a la "pérdida cero". En la segunda etapa, cuando el precio alcanza un beneficio positivo igual o mayor que el Stop Loss, movemos el Stop Loss hasta el nivel de posición de apertura.

// ---- 1ª etapa ------------------------------------------- 1ª etapa ----+
    // Primera etapa de modificación: cuando el precio alcanza al beneficio 
    // igual al valor de Stop Loss, nos movemos SL_B por valor de 1/2 de Stop Loss
    // es decir, más cercano a la posición del nivel de apertura. (+StopLevel)
   if((Bid-OrderOpenPrice())>SL_B*Point        // si la diferencia entre el precio y el valor de apertura es > SL_B
       && OrderStopLoss()<OrderOpenPrice())    // y si el Stop Loss es menor que el nivel de posición de apertura.
    {// modif-1
     OrderModify(OrderTicket(),                // orden #. 
     OrderOpenPrice(),                         // precio de apertuta. 
     OrderStopLoss()+(SL_B/2)*Point,           // Nuevo valor de Stop Loss.
     OrderTakeProfit()+1*Point,                // Nuevo valor de Take Profit.
     0,                                        // Tiempo de caducidad de la orden aplazada.
     Red);                                     // Color de las marcas de modificaciones (guiones).
     return;
    }//-modif-1
// --- fin de la 1ª etapa ---------------------------------------------------+
// ---- 2ª etapà ------------------------------------------- 2ª etapa ----+
    // Segunda etapa de modificación: cuando el precio alcanza repetidamente beneficio 
    // igualar al valor de Stop Loss, pasamos SL_B al nivel de 'pérdida cero', 
    // es decir, al nivel deposición de apertura (+StopLevel). 
   if((Bid-OrderOpenPrice())>SL_B*Point        // si la diferencia entre el precio y el valor de la posición de apertura es > SL_B
       && OrderStopLoss()<OrderOpenPrice())    // y si el Stop Loss es menor que el nivel de la posición de apertura
    {// modif-1
     OrderModify(OrderTicket(),                // orden #. 
     OrderOpenPrice(),                         // precio de apertuta. 
     OrderStopLoss()+(SL_B+StopLevel)*Point,   // Nuevo valor de Stop Loss. 
     OrderTakeProfit()+1*Point,                // Nuevo valor de Take Profit.
     0,                                        // Tiempo de caducidad de la orden aplazada.
     Magenta);                                 // Color de las marcas de modificaciones (guiones).
     return;
    }//-modif-1
// --- fin de la 2ª etapa ---------------------------------------------------+

Cuando el precio alcanza un beneficio de más de 1,5 veces el valor del Stop Loss, trazamos el SL_B para el fractal más cercano inferior que debe ser mayor que el anterior Stop Loss y más adelante los fractales inferiores ascendentes de la tendencia alcista.

// ---- 3ª etapa ---------------------------------------- 3ª etapa -------+
   // Cuando el precio alcanza un beneficio de más de 1,5 veces eel valor de Stop Loss
   // trazar SL_B hasta el fractal inferior más cercano que debe ser superior al anterior Stop Loss 
   if((Bid-OrderOpenPrice())>=(SL_B+SL_B/2)*Point  // si la diferencia entre el precio y el valor de apertura es >SL_B + SL_B/2
       && OrderStopLoss()>=OrderOpenPrice())       // y si Stop Loss está ya en nivel pérdida cero. 
    {// modif2
     // pasar el SL_B al nivel del fractal inferior más cercano,
     // para ello, encontrar el fractal más bajo más cercano:
    for (k=3;k<=24;k++)
     {//loop-M
     if(Low[k]<Low[k+1] && Low[k]<Low[k+2] && Low[k]<Low[k-1] && Low[k]<Low[k-2])
      { // fractal bajo
      VlFl_L=Low[k];             // Min valor del fractal más cercano
     if(VlFl_L>OrderStopLoss())  // fractal que debe ser superior a la anterior Stop Loss
      {// fractal superior al SL_B
      tim1_L=iTime(NULL,0,k);    // Tiempo de este fractal
         ///  string Time1_L=TimeToStr(tim1_L,TIME_DATE|TIME_MINUTES); 
         ///  Print("  Modif-2 ====== ","  Fractal = ","Frak"+k,VlFl_L,"  time = ",Time1_L);           
      // cambio de Stop Loss para el nivel de valor mínimo del fractal menor formado  
      OrderModify(OrderTicket(),            // orden # 
      OrderOpenPrice(),                     // precios de apertura 
      VlFl_L+2*Point,                       // Nuevo valor del Stop Loss. // en pérdida cero
      OrderTakeProfit()+1*Point,            // Nuevo valor del Take Profit.
      0,                                    // Tiempo de caducidad de la orden aplazada.
      Aqua);                                // Color de las flechas de modificación de Stop Loss y/o Take Profit 
      if(VlFl_L!=0)  break;                 // si el fractal se encuentra, salir del bucle
      return;
// --- fian de la 3ª etapa ---------------------------------------------------+

Conclusión

Una breve conclusión es que la muestra introducida MTS produce los mismos resultados positivos cuando está probado por distintos brokers.

La técnica descrita puede utilizarse por los traders como un componente del sistema comercial. Sin embargo debe desarrollarse en términos de filtros para la apertura de posiciones. Los filtros propuestos aquí arriba pueden mejorarse según lo recomendado por el autor de la técnica de Stanislav Chuvashov.

Las recomendaciones pueden encontrarse en 17 lecciones gratis por Stanislav Chuvashov (en ruso).

Notas para los archivos adjuntos:

  • Fork_Ch_ExpertH1_v1.mq4 - MTS "Chuvashov's Fork
  • Fork_Ch_MTS_v2.mq4 - MTS "Chuvashov's Fork" sin comentarios en el texto del programa.

Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/1352

Archivos adjuntos |
Fork_Ch_MTS_v2.mq4 (23.6 KB)
Barras sintéticas - una nueva dimensión de la visualización de información gráfica de los precios Barras sintéticas - una nueva dimensión de la visualización de información gráfica de los precios
El principal inconveniente de los métodos tradicionales para la visualización de información de precios usando barras y velas japonesas es que están limitados al período de tiempo. Tal vez fue óptima en el momento que se crearon estos métodos pero hoy cuando los movimientos del mercado son a veces demasiado rápidos, los precios que se muestran en un gráfico de esta manera no contribuyen a una pronta respuesta al nuevo movimiento. El método de visualización gráfico del precio propuesto no tiene este inconveniente y ofrece un diseño bastante familiar.
Estudiamos la clase CCanvas. Implementación de la transparencia de los objetos gráficos Estudiamos la clase CCanvas. Implementación de la transparencia de los objetos gráficos
¿Está harto del gráfico anguloso de las medias móviles? ¿Quiere usted dibujar en el terminal algo más bonito que un simple rectángulo rellenado? Ahora es posible dibujar de manera vistosa en el terminal. Para ello existe la clase de creación de gráficos personalizados CCanvas. Con ayuda de esta clase, es posible conseguir transparencia, mezclar los colores y alcanzar la ilusión de transparencia con ayuda de la superposición y la mezcla de colores.
Introducción a la teoría de la Lógica difusa Introducción a la teoría de la Lógica difusa
La lógica difusa extiende los límites habituales de la lógica matemática y teoría de conjuntos. En este artículo se muestran principales principios de esta teoría, así como se describen dos sistemas de inferencia lógica difusa tipo Mamdani y Sugeno. Se dan los ejemplos de implementación de los modelos difusos a base de estos dos sistemas usando los medios de la biblioteca FuzzyNet para MQL5.
Análisis fractal de los movimientos de la moneda común Análisis fractal de los movimientos de la moneda común
¿Cómo de independientes son las cotizaciones de la moneda? ¿Son sus movimientos coordinados o ningún movimiento de una de las monedas sugiere el movimiento de la otra? El artículo describe un intento de abordar esta cuestión mediante la dinámica no lineal y los métodos de geometría fractal.