English Русский 中文 Deutsch 日本語 Português
Estudio de técnicas de análisis de velas (Parte I): Comprobando los patrones existentes

Estudio de técnicas de análisis de velas (Parte I): Comprobando los patrones existentes

MetaTrader 5Probador | 8 mayo 2019, 10:48
3 179 2
Alexander Fedosov
Alexander Fedosov

Contenido

Introducción

El análisis de velas surgió hace más de 20 años, y sigue siendo bastante popular a día de hoy. Alguna gente incluso considera que las velas japonesas son el formato más fácil y cómodo para representar los precios de los activos. El formato de barras, semejante a él, no resulta informativo al cien por cien visualmente. Entre tanto, el formato de velas japonesas es más cómodo en cuanto al ajuste y la representación del color del cuerpo de la vela, lo cual sirve para presentar la información sobre el desarrollo de la situación en el mercado de forma más visual.

Desde que aperecieron las velas japonesas, han surgido muchos tipos de análisis de mercado semejantes y de todo tipo, que comprenden una cierta clasificación de las velas, así como la creación de determinadas combinaciones de las mismas (patrones), que indican posibles cambios en el mercado. Así, existen patrones de continuación de la tendencia actual, el viraje de tendencia y el movimiento lateral.

Sin embargo, la edad y la popularidad del análisis de velas pueden jugarle una mala pasada a aquellos que lo usan guiados por una fe ciega. Los mercados no permanecen inmóviles, y en 20 años ha cambiado tanto la dinámica del mercado, como los factores que influyen en su movimiento en esta u otra dirección. También está claro que han aparecido participantes del mercado que van a valerse de la celebridad y popularidad del análisis de velas para jugar en su contra.

Precisamente de ello nos vamos a ocupar en este artículo. Vamos a tomar varios métodos famosos de determinación del movimiento en los mercados y a comprobar cuánto tienen de actual y efectivo en la realidad de hoy. 


Formulando la tarea

Para valorar la efectividad del funcionamiento del patrón, vamos a desarrollar un algoritmo universal para valorar su dinámica de trabajo. En la fig.1 se muestra el esquema general de acciones, vamos a analizarlo con detalle.


Fig.1 Algoritmo de valoración del funcionamiento del patrón

Paso 1. Elegimos un modelo de velas conocido para ver si se corresponden su valor esperado y el resultado real. Para que el algoritmo resulte más visual, vamos a poner como ejemplo el modelo de velas de Harami Cross (modelo alcista), es decir, se espera una tendencia ascendente. 

Paso 2. Elegimos el intervalo de investigación y el marco temporal. Al mismo tiempo, será posible confirmar el patrón investigado y determinar su efectividad de una forma más amplia. Es posible detectar ciertas leyes a partir de la profundidad de la historia investigada, o encontrar los marcos temporales donde el patrón actual será efectivo o no funcionará en absoluto.

Paso 3. Buscamos cuántas veces se encuentra el modelo de velas elegido en el intervalo investigado de la muestra. Este valor resulta imprescindible para realizar una valoración global. Hablaremos sobre ello un poco más tarde.

Paso 4. analizamos cada coincidencia para ver si hay alguna tendencia ascendente o descendente, o bien ver si no se percibe ninguna de ellas. Aquí deberemos introducir una omisión consciente en cuanto al número de puntos superados por el precio. Supongamos que la tendencia represente la superación por parte del precio de 50 puntos en esta u otra dirección. Cuando el precio alcance este umbral, consideraremos que el movimiento de tendencia tras el patrón investigado no ha tenido lugar.   

Paso 5. ¿Y cómo determinamos la calidad de un movimiento de tendencia? Y es que, la definición del patrón de movimiento de tendencia puede alcanzar los 50 puntos establecidos anteriormente, pero, ¿en cuánto tiempo? En una vela del marco temporal investigado, o puede que en 10. Por eso, la tendencia debe ser suficientemente efectiva, porque resultaría muy arriesgado e ineficiente identificar un patrón y luego esperar largamente un beneficio derivado de la entrada según su señal. Para ello, hemos decidido introducir una valoración de la efectividad de la tendencia por categorías.

  • Categoría A. La tendencia de magnitud designada se alcanza en una sola vela después de detectar el patrón. 
  • Categoría B. La tendencia de magnitud designada se alcanza en dos velas después de detectar el patrón. 
  • Categoría C. La tendencia de magnitud designada se alcanza en tres velas después de detectar el patrón. 

Este tipo de categorización de los resultados de tendencia obtenidos permite valorar de forma más objetiva cuán positivo es el patrón actual.

Paso 6. Aquí calculamos los siguientes valores:

  • Cuántas veces después de detectar el patrón el precio ha ido hacia arriba, y valoramos este movimiento por categorías.
  • Cuántas veces después de detectar el patrón el precio ha ido hacia abajo, y valoramos este movimiento por categorías.

En la fig.2 se muestra un ejemplo de localización, cálculo y categorización de tendencias ascendente y descendente de la muestra general de los modelos de velas encontrados.

Fig.2 Algoritmo y ejemplo de localización de tendencias y su categorización.

Bien, en este ejemplo, de la muestra establecida de 2000 velas en el marco temporal de una hora ( fig.1) se han encontrado 50 coincidencias del patrón definido por nosotros. Después de este, el precio ha ido hacia arriba 20 veces, y hacia abajo 10 veces, según el criterio de 50 puntos mencionado en el paso 4. A continuación, de los 20 casos de tendencia ascendente, el precio ha alcanzado 50 puntos en una vela 5 veces, en 2 velas 7 veces, mientras que en 8 ocasiones el precio ha necesitado tres velas para alcanzar un crecimiento de 50 puntos.

De la misma forma ha sucedido con la tendencia descendente. Por la fig.2, se puede ver con claridad que la oportunidad y velocidad de la tendencia ascendente con el patrón actual resulta preferible. Sin embargo, no siempre podemos determinarlo a ojo. Podemos equivocarnos. Tanto más que al investigar un patrón con diferentes muestras y marcos temporales, resulta sencillo confundirse en esta difusa valoración.

Por eso, hemos decidido introducir un coeficiente conjunto para la valoración general de la efectividad de cualquier patrón en la dirección indicada de la tendencia. Tiene el aspecto que sigue:

Donde E es la efectividad de la tendencia, y P es la probabilidad de aparición de la tendencia. Vamos a analizar la fórmula de efectividad de la tendencia:


Donde A, B, С suponen el número de veces que la tendencia encontrada ha entrado en una de las categorías, y k1, k2, k3 son los coeficientes de los pesos, ya que la relevancia de la entrada en las categorías establecidas es diferente. Una tendencia de la categoría А, en la que el valor se alcanza en una vela, es más significativa que cuando se alcanza en tres. Por defecto, se han establecido las prioridades de la forma siguiente: k1 = 1, k2 = 0.5, k3 = 0.25. se trata de una percepción subjetiva de la relevancia, por eso, cada uno puede asignar las que quiera. S — es la cantidad total de tendencia encontrada del tipo establecido.

La probabilidad de aparición de la tendencia Р supone la relación entre el número de veces que se presenta una tendencia localizada de determinado tipo (A,B o С)) y el número total de modelos de velas de la muestra establecida. En esencia, es la probabilidad de que el precio vaya en una dirección determinada, basada en las acciones anteriores de la historia.

Bien, vamos a calcular la efectividad para las tendencias ascendentes y descendentes en nuestro ejemplo de la fig. 2.  

Fig.3 Resultado del cáculo de la valoración de la efectividad.

Como resultado del cálculo, se han obtenido los siguientes resultados:

  • La efectividad de la tendencia Е realmente ha resultado superior para la tendencia ascendente, lo que ya se podía comprobar visualmente. No obstante, hemos alcanzado la valoración cualitativa.
  • La probabilidad de aparición de la tendencia Р al aparecer el patrón investigado es igual al 40 %, lo que denotará una tendencia ascendente, un 20%, denotará una descendente.
  • La efectividad del patrón investigado con la tendencia ascendente ha resultado más del doble. 

Al investigar la actualidad de posteriores investigaciones de patrones, prestaremos especial atención a dos parámetros: la probabilidad de que el precio vaya en la dirección indicada por el modelo de velas, y el coeficiente obtenido de valoración de la efectividad. 

En esencia, de esta forma, podremos entender tres cosas importantes en nuestra investigación:

  1. Si el patrón funciona en general en los mercados actuales.
  2. Si funciona, ¿cuáles son entonces nuestras oportunidades al aparecer un patrón en el gráfico de que se cumpla el escenario pronosticado por dicho patrón?
  3. Cuánto dinero y a qué velocidad podremos ganar con ello.

 

Desarrollo del prototipo de la interfaz para el análisis de modelos de velas

Para investigar los patrones existentes dentro del modelo propuesto, es impresindible proyectar un envoltorio gráfico cómodo a partir de la tarea establecida. Para no tener que inventar de nuevo la rueda, usaremos la biblioteca de creación de interfaces gráficas EasyAndFastGUI, pensada para este cometido.

Antes de proceder a la implementación práctica, debemos decidir la estructura externa y crear el prototipo de la futura aplicación gráfica. Y, por consiguiente, rellenar su implementación programática.

La estructura general consta de dos pestañas. En la primera de ellas se realizará el análisis de los patrones existentes y los elementos necesarios para el ajuste. Vamos a ver la primera pestaña con mayor detalle.


Fig.3 Estructura de la pestaña Análisis.

Consta de cinco objetos clave de interacción:

  1. Conmutación entre las pestañas Análisis y Ajustes.
  2. Herramienta de búsqueda de los instrumentos de divisa necesarios para el análisis.
  3. El recuadro de resultados incluye el Nombre del patrón investigado, el Número de coincidencias encontradas en el intervalo de la muestra, la Frecuencia con la que se encuentra el patrón en la investigación, la Probabilidad de un movimiento ascendente o descendente, así como el coeficiente de cálculo de la valoración de la efectividad de este patrón al darse tendencias ascendentes o descendentes. Esta información nos indicará en qué medida se corresponde el patrón con el carácter anunciado para el movimiento pronosticado y el que se ha dado en realidad. En qué grado coinciden.
  4. Marco temporal en el que se van a investigar los modelos de velas.
  5. Intervalo de la muestra. Número de velas del marco temporal indicado, en el que se realizará la simulación de patrones.

A continuación, vamos a analizar la pestaña Ajustes. 


Fig.4 Estructura de la Pestaña Ajustes.

En este apartado se han reunido el resto de ajustes responsables de una configuración más detallada de los parámetros que influyen en los resutados de la investigación de patrones.

  1. La lista de velas básicas que participarán al formar los patrones. 
  2. La ventana de diálogo. Se abre al pulsar el botón con el icono de la rueda dentada. En la ventana se encontrarán los ajustes iniciales de los parámetros de las velas básicas que participan en la formación de patrones.
  3. La configuaración de los coeficientes que participan en el cálculo de la valoración de la efectividad del patrón investigado.
  4. El valor umbral de la tendencia, en puntos. Al alcanzar este, sacaremos la conclusión de que el patrón ha confirmado con éxito el movimiento en esta u otra dirección.

Implementando la herramienta

Tras determinar la base teórica y crear el prototipo, debemos determinar el orden de construcción de los elementos de la aplicación. Como podemos ver por la fig.4, tenemos dos ventanas  aparte. En la primera, se encuentran las dos pestañas Análisis y Ajustes; en la segunda, los ajustes individuales adicionales de los tipos de velas. Por eso, los dos principales métodos de construcción tendrán el aspecto siguiente:

//+------------------------------------------------------------------+
//| Creando la interfaz gráfica del programa                         |
//+------------------------------------------------------------------+
bool CProgram::CreateGUI(void)
  {
//--- Creando el panel
   if(!CreateWindow("Pattern Analyzer"))
      return(false);
//--- Creando la ventana de diálogo
   if(!CreateWindowSetting("Settings"))
      return(false);
//--- Finalizando la creación de GUI
   CWndEvents::CompletedGUI();
   return(true);
  }
//+-----------------------------------------------------------------

Veamos ahora con mayor detalle qué incluye cada uno de estos métodos. Advertimos de inmediato que no vamos a aclarar todos los detalles de cada uno de los métodos, solo nos detendremos en las particularidades clave y en los puntos relacionados directamente con el análisis de velas. Bien, el método de construcción de la ventana principal CreateWindow() consta de los siguientes métodos que implementan los elementos de la interfaz:

  • CreateTabs() — implementa las pestañas Análisis y Ajustes.
  • CreateSymbolsFilter() — Campo de edición y caja de verificación para la búsqueda del símbolo necesario o que incluya en sí parte de la palabra buscada.
  • CreateRequest() — Botón cuya pulsación acciona la búsqueda de símbolos.
  • CreateRange() — Campo de edición del intervalo de la muestra.
  • CreateComboBoxTF() — Lista desplegable para seleccionar el marco temporal en el que se realizará el análisis.
  • CreateSymbTable() — Crea un recuadro con los resultados de la búsqueda de símbolos.
  • CreateTable() — Recuadro con los resultados del análisis de los modelos de velas.
  • CreateStatusBar() — Línea de estado que representa el símbolo actualmente elegido para el análisis, o que informa que no ha sido elegido.

 Esta lista de métodos implementa los elementos gráficos en la pestaña Análisis. Un poco más abajo, analizaremos los métodos que se encuentran en la pestaña Ajustes.

  • CreateCandle() — método de construcción del elemento compuesto por una imagen del tipo vela y un botón con un icono de una rueda dentada (pos. 1 en la fig.4). 
  • CreateTextLabel() — método para visualizar los encabezados de texto antes de los grupos de coeficientes (pos.3 en la fig.4).
  • CreateCoef() — método para representar el campo de edición del coeficiente de peso.
  • CreateThresholdValue() — método para representar el campo de edición del valor umbral de beneficio en puntos.

A continuación, analizaremos la estructura de la segunda ventana de ajustes adicionales, implementada por el método CreateWindowSetting().

  • CreateSettingTextLabel() — el método crea una marca-sugerencia textual dinámica para entender para qué vela seleccionada en concreto estamos cambiando un parámetro.
  • CreateSettingCoef() — el método crea un campo de edición para modificar las propiedades de la vela seleccionada.
  • CreateSaveButton() — el método crea un botón para guardar y aplicar las propiedades editadas en el análisis.
  • CreateCancelButton() — el método crea un botón para cancelar todas las acciones con los parámetros de la vela seleccionada.

Una vez creada la interfaz para la interacción, vamos a proceder a implementar los métodos de cálculo y valoración descritos al inicio del apartado Formulando la tarea. Vamos a decidir las etapas de desarrollo, así como las condiciones de entrada que se utilizarán para analizar los modelos de velas.

Fig.5 Resultado de la creación de la interfaz gráfica.

Como ya sabemos, existen patrones de una vela de determinado tipo, de dos, de tres, etcétera. Por eso, vamos a enumerar los tipos básicos de vela a partir de los cuales podemos componer modelos de velas:

  • Vela larga. Cuerpo de la vela > (cuerpo promediado de las últimas cinco velas)*K1, donde К1 es el coeficiente ajustable (fig.4).
  • Vela corta. Cuerpo de la vela < (cuerpo promediado de las últimas cinco velas)*K1.
  • Spinning top. Sombra inferior > cuerpo*K1  y  sombra superior > cuerpo*K1.
  • Doji. Cuerpo de Doji < (intervalo entre el precio máximo y mínimo del precio)*K1.
  • Marubozu. Sombra inferior < cuerpo*K1 o sombra superior < cuerpo*K1.
  • Martillo. Sombra inferior > cuerpo*K1 Sombra superior < cuerpo*K2.

Ahora, vamos a analizar los modelos de velas (patrones) conocidos que van a tomar parte en nuestro método de análisis. Constarán de dos categorías: patrones de una vela y patrones de dos velas.

Los patrones de una vela son:

  • Martillo (modelo alcista).
  • Ahoracado (modelo bajista).
  • Martillo invertido (modelo alcista).

Patrones de dos velas:

  • Estrella fugaz (modelo bajista).
  • Envolvente (modelo alcista).
  • Envolvente (modelo bajista).
  • Cruz de Harami (modelo alcista).
  • Cruz de Harami (modelo bajista).
  • Harami (modelo alcista).
  • Harami (modelo bajista).
  • Estrella Doji (modelo alcista).
  • Estrella Doji (modelo bajista).
  • Claro en las nubes (modelo alcista).
  • Nubes oscuras (modelo bajista).

En el artículo Análisis de los patrones de velas se describe con mayor detalle qué son estas velas, así como las formas de identificarlas. Estos métodos han sido adaptados a parte del algoritmo del método de análisis de velas.

El propio algoritmo tiene el aspecto siguiente:

1. El método CandleType() determina el tipo básico de velas.

//--- Determinamos el tipo de velas   
   res.type=CAND_NONE;
//--- long 
   if(res.bodysize>sum*m_long_coef)
      res.type=CAND_LONG;
//--- sort 
   if(res.bodysize<sum*m_short_coef)
      res.type=CAND_SHORT;
//--- doji
   if(res.bodysize<HL*m_doji_coef)
      res.type=CAND_DOJI;
//--- maribozu
   if((shade_low<res.bodysize*m_maribozu_coef || shade_high<res.bodysize*m_maribozu_coef) && res.bodysize>0)
      res.type=CAND_MARIBOZU;
//--- hammer
   if(shade_low>res.bodysize*m_hummer_coef2 && shade_high<res.bodysize*m_hummer_coef1)
      res.type=CAND_HAMMER;
//--- invert hammer
   if(shade_low<res.bodysize*m_hummer_coef1 && shade_high>res.bodysize*m_hummer_coef2)
      res.type=CAND_INVERT_HAMMER;
//--- spinning top
   if(res.type==CAND_SHORT && shade_low>res.bodysize*m_spin_coef && shade_high>res.bodysize*m_spin_coef)
      res.type=CAND_SPIN_TOP;

2. El método PatternType() determina el tipo de patrón partiendo de los datos obtenidos de CandleType() para la vela investigada o un conjunto de dos velas que forman uno de los modelos de velas mencionados anteriormente.

for(int i=m_range_total;i>3;i--)
     {
      CandleType(symbol,cand2,i);                                                      // vela anterior
      CandleType(symbol,cand1,i-1);                                                    // vela anterior

      //--- Martillo invertido, modelo alcista
      if(cand2.trend==DOWN &&                                                             // comprobando la dirección de la tendencia
         cand2.type==CAND_INVERT_HAMMER)                                                  // comprobando "martillo invertido"
        {
         m_invert_hummer_total++;
         GetCategory(symbol,i-3,invert_hummer_coef);
        }

      //--- Ahorcado, modelo bajista
      if(cand2.trend==UPPER &&                                                            // comprobando la dirección de la tendencia
         cand2.type==CAND_HAMMER)                                                         // comprobando "martillo"
        {
         m_handing_man_total++;
         GetCategory(symbol,i-3,handing_man_coef);
        }
      //--- Martillo, modelo alcista
      if(cand2.trend==DOWN &&                                                             // comprobando la dirección de la tendencia
         cand2.type==CAND_HAMMER)                                                         // comprobando "martillo"
        {
         m_hummer_total++;
         GetCategory(symbol,i-3,hummer_coef);
        }
      //---
      //--- Estrella fugaz, modelo bajista
      if(cand1.trend==UPPER && cand2.trend==UPPER &&                                      // comprobando la dirección de la tendencia
         cand2.type==CAND_INVERT_HAMMER && cand1.close<=cand2.open)                       // comprobando "martillo invertido"
        {
         m_shooting_star_total++;
         GetCategory(symbol,i-4,shooting_star_coef);
        }

      //--- Envolvente, modelo alcista
      if(cand1.trend==DOWN && cand1.bull && cand2.trend==DOWN && !cand2.bull && // comprobando la dirección de la tendencia y la dirección de la vela
         cand1.bodysize>cand2.bodysize &&
         cand1.close>=cand2.open && cand1.open<cand2.close)
        {
         m_engulfing_bull_total++;
         GetCategory(symbol,i-4,engulfing_bull_coef);
        }

      //--- Envolvente, modelo bajista
      if(cand1.trend==UPPER && cand1.bull && cand2.trend==UPPER && !cand2.bull && // comprobando la dirección de la tendencia y la dirección de la vela
         cand1.bodysize<cand2.bodysize &&
         cand1.close<=cand2.open && cand1.open>cand2.close)
        {
         m_engulfing_bear_total++;
         GetCategory(symbol,i-4,engulfing_bear_coef);
        }

      //--- Cruz de Harami, modelo alcista
      if(cand2.trend==DOWN && !cand2.bull &&                                              // comprobando la dirección de la tendencia y la dirección de la vela
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // comprobando la "longitud" de la primera vela y la vela Doji
         cand1.close<cand2.open && cand1.open>=cand2.close)                               // Doji está dentro del cuerpo de la primera vela
        {
         m_harami_cross_bull_total++;
         GetCategory(symbol,i-4,harami_cross_bull_coef);
        }

      //--- Cruz de Harami, modelo bajista
      if(cand2.trend==UPPER && cand2.bull &&                                              // comprobando la dirección de la tendencia y la dirección de la vela
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // comprobando la "longitud" de la primera vela y la vela Doji
         cand1.close>cand2.open && cand1.open<=cand2.close)                               // Doji está dentro del cuerpo de la primera vela 
        {
         m_harami_cross_bear_total++;
         GetCategory(symbol,i-4,harami_cross_bear_coef);
        }

      //--- Harami, modelo alcista
      if(cand1.trend==DOWN && cand1.bull && !cand2.bull &&                                // comprobando la dirección de la tendencia y la dirección de la vela
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU)  &&                         // comprobando la "longitud" de la primera vela
         cand1.type!=CAND_DOJI && cand1.bodysize<cand2.bodysize &&                        // la segunda vela no es Doji, y el cuerpo de la primera vela es mayor que el de la segunda
         cand1.close<cand2.open && cand1.open>=cand2.close)                               // el cuerpo de la segunda vela está dentro del cuerpo de la primera vela 
        {
         m_harami_bull_total++;
         GetCategory(symbol,i-4,harami_bull_coef);
        }

      //--- Harami, modelo bajista
      if(cand1.trend==UPPER && !cand1.bull && cand2.bull &&                               // comprobando la dirección de la tendencia y la dirección de la vela
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) &&                          // comprobando la "longitud" de la primera vela
         cand1.type!=CAND_DOJI && cand1.bodysize<cand2.bodysize &&                        // la segunda vela no es Doji, y el cuerpo de la primera vela es mayor que el de la segunda
         cand1.close>cand2.open && cand1.open<=cand2.close)                               // el cuerpo de la segunda vela está dentro del cuerpo de la primera vela 
        {
         m_harami_bear_total++;
         GetCategory(symbol,i-4,harami_bear_coef);
        }

      //--- Estrella de Doji, modelo alcista
      if(cand1.trend==DOWN && !cand2.bull && // comprobando la dirección de la tendencia y la dirección de la vela
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // comprobando la "longitud" de la 1 vela y 2 Doji
         cand1.close<=cand2.open)                                                         // la apertura de Doji por debajo es igual al cierre de la primera vela 
        {
         m_doji_star_bull_total++;
         GetCategory(symbol,i-4,doji_star_bull_coef);
        }

      //--- Estrella de Doji, modelo bajista
      if(cand1.trend==UPPER && cand2.bull && // comprobando la dirección de la tendencia y la dirección de la vela
         (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && cand1.type==CAND_DOJI && // comprobando la "longitud" de la 1 vela y 2 Doji
         cand1.open>=cand2.close)                                                         //la apertura de Doji por encima es igual al cierre de la primera vela
        {
         m_doji_star_bear_total++;
         GetCategory(symbol,i-4,doji_star_bear_coef);
        }

      //--- Claro en las nubes, modelo alcista
      if(cand1.trend==DOWN && cand1.bull && !cand2.bull && // comprobando la dirección de la tendencia y la dirección de la vela
         (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU) && (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && // comprobando la "longitud" de la vela
         cand1.close>(cand2.close+cand2.open)/2 && // cierre de la segunda por encima de la mitad de la primera
         cand2.open>cand1.close && cand2.close>=cand1.open)
        {
         m_piercing_line_total++;
         GetCategory(symbol,i-4,piercing_line_coef);
        }

      //--- Nubes oscuras, modelo bajista
      if(cand1.trend==UPPER && !cand1.bull && cand2.bull && // comprobando la dirección de la tendencia y la dirección de la vela
         (cand1.type==CAND_LONG || cand1.type==CAND_MARIBOZU) && (cand2.type==CAND_LONG || cand2.type==CAND_MARIBOZU) && // comprobando la "longitud" de la vela
         cand1.close<(cand2.close+cand2.open)/2 && // cierre de la 2 por debajo de la mitad del cuerpo de la 1
         cand1.close<cand2.open && cand2.close<=cand1.open)
        {
         m_dark_cloud_cover_total++;
         GetCategory(symbol,i-4,dark_cloud_cover_coef);
        }
     }

3. Como podemos ver en la lista de arriba, al identificar uno de los patrones establecidos, se comprueba la historia con el método GetCategory(); para ser más exactos, se comprueba en qué dirección ha ido el precio después de aparecer la señal. Es decir, para cada patrón encontrado se determinan las categorías de movimiento de precio como se describe en la fig.1.

//+------------------------------------------------------------------+
//| Determinando las categorías de beneficio                         |
//+------------------------------------------------------------------+
bool CProgram::GetCategory(const string symbol,const int shift,int &category[])
  {
   MqlRates rt[];
   int copied=CopyRates(symbol,m_timeframe,shift,4,rt);
   int rating=0;
//--- Obteniendo los datos de las velas anteriores
   if(copied<4)
      return(false);
   double high1,high2,high3,low1,low2,low3,close0,point;
   close0=rt[0].close;
   high1=rt[1].high;
   high2=rt[2].high;
   high3=rt[3].high;
   low1=rt[1].low;
   low2=rt[2].low;
   low3=rt[3].low;
   if(!SymbolInfoDouble(symbol,SYMBOL_POINT,point))
      return(false);

//--- Comprobando Uptrend
   if((int)((high1-close0)/point)>=m_threshold_value)
     {
      category[0]++;
     }
   else if((int)((high2-close0)/point)>=m_threshold_value)
     {
      category[1]++;
     }
   else if((int)((high3-close0)/point)>=m_threshold_value)
     {
      category[2]++;
     }

//--- Comprobando Downtrend

   if((int)((close0-low1)/point)>=m_threshold_value)
     {
      category[3]++;
     }
   else if((int)((close0-low2)/point)>=m_threshold_value)
     {
      category[4]++;
     }
   else if((int)((close0-low3)/point)>=m_threshold_value)
     {
      category[5]++;
     }
   return(true);
  }

4. Después de determinar las categorías y calcular "cuántas veces y en qué dirección se ha movido el precio después de detectar el patrón", se calculan los parámetros Frecuencia, Probabilidad de movimiento hacia arriba o hacia abajo, así como el coeficiente de valoración de la efectividad del patrón elegido tanto para la tendencia ascendente, como para la descendente. Deesto se encarga el método CoefCalculation().

//+------------------------------------------------------------------+
//| Calculando los coeficientes de valoración de la efectividad      |
//+------------------------------------------------------------------+
bool CProgram::CoefCalculation(const int row,int &category[],int found)
  {
   double p1,p2,k1,k2;
   int sum1=0,sum2=0;
   for(int i=0;i<3;i++)
     {
      sum1+=category[i];
      sum2+=category[i+3];
     }
//---
   p1=(found>0)?NormalizeDouble((double)sum1/found*100,2):0;
   p2=(found>0)?NormalizeDouble((double)sum2/found*100,2):0;
   k1=(found>0)?NormalizeDouble((m_k1*category[0]+m_k2*category[1]+m_k3*category[2])/found,3):0;
   k2=(found>0)?NormalizeDouble((m_k1*category[3]+m_k2*category[4]+m_k3*category[5])/found,3):0;

   m_table.SetValue(3,row,(string)p1,2);
   m_table.SetValue(4,row,(string)p2,2);
   m_table.SetValue(5,row,(string)k1,2);
   m_table.SetValue(6,row,(string)k2,2);
//--- Actualizar el recuadro
   m_table.Update(true);
   m_table.GetScrollVPointer().Update(true);
   m_table.GetScrollHPointer().Update(true);
   return(true);
  }

Usando estos valores como base, comparamos cuánto se corresponde el patrón investigado con el modelo de movimiento que debe mostrar.


Resultados de la investigación

Para investigar los modelos de velas, tomaremos el conjunto de símbolos de la categoría forex.major en el terminal MetaTrader 5. Para no introducirlos todos uno a uno, hemos decidido añadir una palabra especial que nos ofrezca esta lista. Por ello, al introducir la palabra Major, se representará el conjunto necesario como se muestra en la fig.6.

Fig.6 Selección rápida del conjunto de símbolos major.

Vamos a suponer que no realizaremos ningún ajuste adicional de los modelos de velas. Solo cambiaremos el Valor umbral de la tendencia en puntos. Esto se ve condicionado por el hecho de que se deba corregir el beneficio en diferentes marcos temporales, puesto que objetivos demasiado grandes en los marcos temporales menores provocarán resultados nulos, mientras que objetivos pequeños para los marcos temporales mayores conllevarán un resultado ideal. 

Como prueba, elegiremos dos marcos temporales y cambiaremos el Valor umbral. De esta forma, veremos qué resultados logramos. Hemos decidido analizar una muestra de simulación pequeña, de lo contrario, si analizamos cada pareja de divisas en los 21 periodos propuestos, y además cambiamos la muestra y otros parámetros, nos encontraremos con multitud de información monótona en la que resultará fácil confundirse. En cualquier caso, usted podrá simular por sí mismo la pareja, el marco temporal y el intervalo de muestra que necesite con diferentes valores umbral.

Bien, aquí tenemos el primer conjunto de parámetros no estándar:

  • Conjunto Major.
  • Marco temporal М15.
  • Valor umbral de beneficio: 100 puntos (para las cotizaciones de 5 decimales.

Los resultados de la simulación de las siete parejas se muestran en la fig.7, un poco más abajo.

Fig.7 Resultados del análisis en el marco temporal М15.

Vamos a analizar con mayor detalle la pareja EURUSD, usándola como ejemplo para comprobar la actualidad de los modelos de velas en las condiciones establecidas. Como podemos ver por la imagen de arriba, los patrones se destacan con un color concreto que indica sus modelos de movimiento. Los rojos son los modelos que indican una posible tendencia descendente, mientras que los verdes indican una posible tendencia ascendente. Bien, vamos a comprobar cómo se corresponde esto con los resultados obtenidos.

Fig.8 Resultados del análisis con la pareja de divisas EURUSD.

El pirmer patrón es Hammer (Martillo), y su modelo presupone un movimiento ascendente. En las condiciones que hemos establecido, en el 30% de los casos sucede así, mientras que en el 10% tiene lugar un movimiento descendente. En este caso, además, debemos recordar que el movimiento no es inferior al umbral de 100 puntos establecido por nosotros. Teniendo en cuenta que en la muestra histórica, en más de un tercio de los casos su aparición muestra un movimiento ascendente, podemos presuponer que confirma la hipótesis de que el modelo de velas indica una tendencia ascendente.

No obstante, esto no significa que esta observación sea automáticamente aplicable a todos los demás marcos temporales y muestras. Aquí estamos hablando de un caso y unos resultados concretos.

Vamos a ver ahora Engulfing Bear (Envolvente, modelo bajista). Se considera que indica una tendencia descendente, por lo que merece la pena elegir una posición corta. Sin embargo, el resultado muestra que, en estas condiciones, el modelo de velas en la mayoría de los casos se comporta de una forma totalmente distinta: en el 20% de los casos después de la aparición del patrón, el precio ha ido hacia arriba un mínimo de 100 puntos, mientras que solo ha ido hacia abajo en ese número de puntos en un 9% de los casos, menos de la mitad de veces. Aquí, las observaciones nos muestran que, en las condiciones creadas, se comporta de forma opuesta a la debida.

Como tercer caso, tomaremos Harami Bull (Harami, modelo alcista). Como podemos ver por su nombre y la marca verde, este modelo indica que hay una señal de compra. Pero aquí se observa prácticamente la misma cantidad de movimientos en ambas direcciones, un 17% contra un 19%. ¿Podemos decir que este modelo muestra alguna señal determinada? Tenemos grandes dudas al respecto, ya que ninguna de las direcciones predomina. Por eso, en esta situación, deberíamos evitar usar este patrón para comerciar en el marco temporal de 15 minutos con la pareja de divisas EURUSD.


Resumiendo

Basándonos en los resultados obtenidos, podemos sacar las siguientes conclusiones: no todo está tan claro como nos indican los modelos de velas. Es mucho lo que depende de las condiciones en las que aparecen. Por eso, el comportamiento de un patrón puede ser distinto, no ya en todo mercado, sino en una sola pareja de divisas con diferentes marcos temporales. ¡Hay que confiar, pero también que comprobar!


Conclusión

Al final del artículo se adjunta un fichero con todos los archivos enumerados, clasificados por carpetas. Por eso, para que funcione correctamente, basta con colocar la carpeta MQL5 en la carpeta raíz del terminal.

Programas usados en el artículo:

#
 Nombre
Tipo
Descripción
1
PatternAnalyzer.mq5 Interfaz gráfica
 Panel de instrumentos para analizar el modelo de velas.
2 MainWindow.mqh Biblioteca  Biblioteca para la construcción de la interfaz gráfica
3 Program.mqh Biblioteca  Biblioteca de métodos para la creación de los elementos de la interfaz y los cálculos


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

Archivos adjuntos |
MQL5.zip (433.39 KB)
Miguel Angel Diaz Oviedo
Miguel Angel Diaz Oviedo | 5 dic. 2019 en 21:37

pero como se usa?



com o lo lanzo en mt5?

fobos3_1
fobos3_1 | 2 ene. 2021 en 16:46
Miguel Angel Diaz Oviedo:

pero como se usa?



com o lo lanzo en mt5?

No se puede usar en el probador de estrategias (al menos yo no pude).

Pero no es necesario, puede hacerlo en la ventana de cualquier instrumento, sólo arrastra el AE desde la ventana del navegador a la ventana del instrumento. 

Previamente debes compilarlo en el metaeditor.


El poder del ZigZag (Parte II): Ejemplos de obtención, procesamiento y representación de datos. El poder del ZigZag (Parte II): Ejemplos de obtención, procesamiento y representación de datos.
En la primera parte, describimos un indicador ZigZag modificado y una clase para la obtención de datos de los indicadores de este tipo. Ahora vamos a mostrar cómo crear indicadores basados ​​en dichas herramientas, además de escribir un experto para las pruebas, que realizará transacciones según las señales generadas por el indicador ZigZag. Como añadido, en este artículo se ofrecerá una nueva versión de la biblioteca de creación de interfaces gráficas EasyAndFast.
Utilidad para la selección y navegación en MQL5 y MQL4: añadiendo la búsqueda automática de patrones y visualización de símbolos encontrados Utilidad para la selección y navegación en MQL5 y MQL4: añadiendo la búsqueda automática de patrones y visualización de símbolos encontrados
En este artículo, seguiremos ampliando las capacidades de la utilidad para la selección y navegación por los instrumentos. Esta vez vamos a crear nuevas pestañas, con la apertura de las cuales van a abrirse sólo aquellos símbolos que correspondan a unos u otros parámetros nuestros. Asimismo, aprenderemos a incluir fácilmente nuestras propias pestañas con las reglas de filtración necesarias.
Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte I): Concepto, organización de datos y primeros resultados Biblioteca para el desarrollo rápido y sencillo de programas para MetaTrader (Parte I): Concepto, organización de datos y primeros resultados
Tras analizar una ingente cantidad de estrategias comerciales, ejecutar multitud de encargos de preparación de programas para los terminales MT5 y MT4, y visitar distintos sitios web de MetaTrader, hemos llegado a la conclusión de que una mayoría aplastante de esta diversidad se construye en la práctica sobre un número fijo de funciones elementales, acciones y valores que se repiten de un programa a otro. El resultado de semejante trabajo es la biblioteca multiplataforma "DoEasy", que permite crear fácil y rápidamente programas para МetaТrader 5 y МetaТrader 4
El poder del ZigZag (Parte I). Desarrollando la clase base del indicador El poder del ZigZag (Parte I). Desarrollando la clase base del indicador
Muchos investigadores no prestan la atención suficiente a la definición del comportamiento de los precios. En este caso, además, se usan métodos complejos que con frecuencia son simplemente «cajas negras», tales como: aprendizaje de máquinas o redes neuronales. En estos casos, lo más importante es: «¿Qué datos suministrar a la entrada para el entrenamiento de este u otro modelo?»