English Русский 中文 Deutsch 日本語 Português
Un ayudante para el trader basado en un análisis MACD ampliado

Un ayudante para el trader basado en un análisis MACD ampliado

MetaTrader 4Ejemplos | 6 enero 2016, 10:02
678 0
Genkov
Genkov

Introducción

El histograma de MACD es uno de los mejores indicadores de tendencia del precio. Como indica el Dr. A. Elder, la tendencia del precio queda determinada por las dos últimas barras del periodo de tiempo en cuestión. Sin embargo, cuando utilizamos esas dos barras no podemos decir nada más. Aunque claro, un trader con experiencia analizando histogramas será capaz de ver un poco más allá gracias a su imaginación e intuición. Bien, si tomamos las tres últimas barras para hacer nuestro análisis, la información que obtendremos mejorará considerablemente tanto en cantidad como en calidad.

El algoritmo de nuestro script compara las diferencias entre los incrementos de las barras cero, primera y segunda del histograma MACD.. Por ejemplo, si la diferencia de las barras anterior y actual supera la diferencia existente entre la barra anterior y la precedente, entonces la tendencia es alcista y tiene una aceleración positiva. Si la diferencia es menor, significa que el crecimiento de la tendencia se ralentiza (tendencia amortiguada), y debería pensar en cerrar su posición larga.

Una mirada rápida a la secuencia de comandos:

El script se puede utilizar por lo menos en dos direcciones.

En primer lugar, sirve como ayudante de trading porque puede definir los puntos de entrada y salida del mercado, y toma decisiones sobre la cantidad de lotes empleados (volumen) en las posiciones, así como la dirección y la aceleración positiva o negativa del volumen del histograma.

En segundo lugar, también sirve para analizar los datos históricos. Cuando adjunte el script al gráfico aparecerá la ventana de propiedades donde puede especificar (cambiar) el número de barras iniciales y el marco temporal. Si utiliza el script para hacer trading en tiempo real, debe establecer el número de barras iniciales a cero (la barra actual más reciente) o a uno (como desee el usuario), y también tiene que especificar el marco temporal que desee para abrir o mantener posiciones.

//+------------------------------------------------------------------+
//|                                                 TrendMACD v5.mq4 |
//| Análisis del histograma MACD en las tres últimas barras   Genkov |
//|                                                     genkov@bk.ru |
//+------------------------------------------------------------------+
#property copyright "Genkov"
#property link      "genkov@bk.ru"
// si comenta las líneas siguientes, la ventana de propiedades no se mostrará
#property show_inputs   
extern int a = 0;            // aquí puede especificar la barra inicial
//extern int period = 1;     //  1 minuto 
//extern int period = 5;     //  5 minutos 
//extern int period = 15;    // 15 minutos 
extern int period = 30;      //  30 minutos
//extern int period = 60;    // marco temporal
//extern int period = 240;   // 4 horas
//extern int period = 1440;  // día
//extern int period = 10080; // semana
//extern int period = 43200; // mes
//+------------------------------------------------------------------+

La variable principal 'a' es para el número inicial de barras y la variable global 'period' es para los marcos temporales. La variable interna para hacer los cálculos y las comparaciones se define después de lanzar la función:

int start()
  {
    int b,c;
    b=a+1; c=b+1;
//----
double Macd_h1_a= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,a);
double Macd_h1_b= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,b);
double Macd_h1_c= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,c);

Ponga aquí el operador Print() para controlar visualmente los cálculos, esto puede ser útil para analizar eventos pasados (en el historial). El multiplicador "*1000" sirve para facilitar la lectura de los resultados obtenidos. Puede utilizar cualquier otro valor.

Print("   Macd_h1_c= ",Macd_h1_c*1000,"   Macd_h1_b= ",
          Macd_h1_b*1000,"   Macd_h1_a= ",Macd_h1_a*1000);

Si desea desactivar las alertas sustituya el uno por el cero en el operador "int Message = 1;". Del mismo modo, para visualizar la información, comente los operadores "int Message = 1;" y "Message == 1;" y sustituya todos los operadores Alert() con operadores Print(), entonces podrá ver la información en la pestaña "Asesores Expertos" del terminal cliente.

El programa brinda la posibilidad de calcular el tiempo de operación del script con la función GetTickCount(). Con este objetivo, escriba el siguiente operador al principio del programa:

int start=GetTickCount();
//…
//…, y al final del programa:
Alert("   Tiempo de cálculo  ", GetTickCount()-start," milisegundo"); 

El código principal del script está formado por bloques que comparan los estados, la posición y el tamaño de los ratios de las diferencias de los valores del histograma en las barras analizadas.

Se analizan los posibles estados transitorios (situaciones). Por ejemplo:



En total, hay 6 bloques de comparación: los bloques 1-2 para MACD debajo el eje:

// ----------------------MACD debajo del eje-------------------------1--&
  if(Macd_h1_c<0.0&&Macd_h1_a<0.0&&Macd_h1_a<0.0) 
   {
     // incremento de la barra "0" en relación con la primera
     double r1=MathAbs(MathAbs(Macd_h1_a)-MathAbs(Macd_h1_b));
     // incremento de la barra "1" en relación a la "2" 
     double r2=MathAbs(MathAbs(Macd_h1_b)-MathAbs(Macd_h1_c));
// -- MACD está debajo - la tendencia es bajista
   if(Macd_h1_c>Macd_h1_b&&Macd_h1_b>Macd_h1_a)
    {
     if(r1>r2) 
     {
     Alert("En la barra ",a," MACD<0 = ",Macd_h1_a,
           "  La tendencia es bajista con aceleración");
     }
    if(r1<r2) 
     {
     Alert("En la barra ",a," MACD<0 = ",Macd_h1_a,
           "  La tendencia es bajista con retraso");
     }
    if((r1==r2)||MathAbs(r1-r2)<0.000015)
     {
     Alert("En la barra ",a," MACD<0 = ",Macd_h1_a,
           "  La tendencia es bajista con aceleración constante");
     }
    }
// -- MACD está debajo - la tendencia es alcista
   if(Macd_h1_c<Macd_h1_b&&Macd_h1_b<Macd_h1_a)
    {
    if(r1>r2) 
     {
     Alert("En la barra ",a," MACD<0 =",Macd_h1_a,
           "  La tendencia es alcista con aceleración");
     }
    if(r1<r2) 
     {
     Alert("En la barra ",a," MACD<0 = ",Macd_h1_a,
           "  La tendencia es alcista con retraso");
     }
    if((r1==r2)||MathAbs(r1-r2)<0.000015)
     {
     Alert("En la barra ",a," MACD<0 = ",Macd_h1_a,
           "  La tendencia es alcista con aceleración constante");
     }
    }
// --- MACD está debajo - la tendencia se invierte hacia abajo    
   if(Macd_h1_c<Macd_h1_b&&Macd_h1_b>Macd_h1_a)
    {
    if(r1>r2) 
     {
     Alert("En la barra ",a," MACD<0 = ",Macd_h1_a,
           "  La tendencia se invierte hacia abajo con aceleración");
     }
    if(r1<r2)
     {
     Alert("En la barra ",a," MACD<0 = ",Macd_h1_a,
           "  La tendencia se invierte hacia abajo con retraso");
     }
    }
// --- MACD está debajo - la tendencia se invierte hacia arriba
   if(Macd_h1_c>Macd_h1_b&&Macd_h1_b<Macd_h1_a)
    {
    if(r1>r2)
     {
     Alert("En la barra ",a," MACD<0 = ",Macd_h1_a,
           "  La tendencia se invierte hacia arriba con aceleración");
     }
     if(r1<r2) 
     {
     Alert("En la barra ",a," MACD<0 = ",Macd_h1_a,
           "  La tendencia se invierte hacia arriba con retraso");
     }
    }
   if(MathAbs(MathAbs(Macd_h1_a)-MathAbs(Macd_h1_b))<0.0002 && 
      MathAbs(MathAbs(Macd_h1_c)-MathAbs(Macd_h1_b))<0.0002)
    {
    Alert("En la barra ",a,", es plano! dentro del rango de:  ",Macd_h1_c,
          "   ",Macd_h1_b,"   ",Macd_h1_a);
    }
   }

El bloque 2-3 es muy parecido: MACD por arriba del eje (ver los archivos adjuntos).

El bloque 3-4 es para cruzar el eje por arriba:

// ------------cruce del eje por arriba------------------3--&
   if(Macd_h1_c<0.0 && Macd_h1_b<0.0 && Macd_h1_a>0&&  // c<0 b<0
      Macd_h1_c<Macd_h1_b&&Macd_h1_b<Macd_h1_a)  
    {
     r1=MathAbs(Macd_h1_a)+MathAbs(Macd_h1_b);
     r2=MathAbs(Macd_h1_c)-MathAbs(Macd_h1_b);
    if(MathAbs(r1)>MathAbs(r2))
     {
     Alert("En la barra ",a," la tendencia cruza el eje por arriba con aceleración ");
     }
    if(MathAbs(r1)<MathAbs(r2))
     {
     Alert("En la barra ",a," la tendencia cruza el eje por arriba con retraso ");
     }
    }
//---     
   if(Macd_h1_c<0.0 && Macd_h1_b>0.0 && Macd_h1_a>0&&  // b>0 a>0
      Macd_h1_c<Macd_h1_b&&Macd_h1_b<Macd_h1_a)
    {
     r1=MathAbs(Macd_h1_a)-MathAbs(Macd_h1_b);
     r2=MathAbs(Macd_h1_c)+MathAbs(Macd_h1_b);
    if(MathAbs(r1)>MathAbs(r2))
     {
     Alert("En la barra ",a," la tendencia cruza el eje por arriba con aceleración");
     }
    if(MathAbs(r1)<MathAbs(r2))
     {
     Alert("En la barra ",a," la tendencia cruza el eje por arriba con retraso");
     }
    }

De igual modo, el bloque 4-5 se utiliza para cruzar el eje por debajo (ver los archivos adjuntos).

El bloque 5-6 gestiona la inversión de la tendencia por debajo del eje, y el bloque 6-7 lo hace por encima del eje. Estos bloques están comentados y son de utilidad para aquellos/as que quieran analizar los datos históricos (ver los archivos adjuntos).


Este es un ejemplo del script trabajando sobre el historial:





Si desea utilizar el script para hacer trading, la cabecera tiene que tener este aspecto:

//+------------------------------------------------------------------+
//|                                                 TrendMACD v6.mq4 |
//|     para hacer trading                                           |
//+------------------------------------------------------------------+
 
#property copyright "Genkov"
#property link      "genkov@bk.ru"
extern int a = 0;      // especifique aquí la barra inicial
extern int period = 30;       // establezca aquí el valor de periodo
//+------------------------------------------------------------------+
int start()
  { 
   int b,c; b=a+1; c=b+1;
//----
  double Macd_h1_a= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,a);
  double Macd_h1_b= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,b);
  double Macd_h1_c= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,c);
…
….

Los otros bloques de comparación son los mismos que los de la versión básica.

A continuación se muestra un ejemplo del script para hacer trading:





¡Obsérvese que los valores de las variables 'a' y 'period' se tienen que establecer antes de comenzar el script! En la versión de trading, es más razonable establecer la barra inicial a uno, puesto que la barra cero puede estar incompleta cuando se están solicitando datos, por ejemplo, al principio o a la mitad de un período.

En conclusión, espero que este script sirva de ayuda tanto a los traders principiantes como a los más experimentados, y que la cantidad de errores disminuya por lo menos un 10 por ciento. ¡Feliz trading a todo el mundo!

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

Archivos adjuntos |
TrendMACD_v5.mq4 (11.36 KB)
TrendMACD_v6.mq4 (9.63 KB)
Asesores Expertos basados en sistemas populares de trading, y un poco de alquimia en la optimización de robots (Parte III) Asesores Expertos basados en sistemas populares de trading, y un poco de alquimia en la optimización de robots (Parte III)
En el presente artículo el autor continúa analizando la implementación de algoritmos de sistemas de trading sencillos, y explica cómo automatizar el backtesting. Los traders principiantes y los desarrolladores noveles de EA encontrarán especialmente útil este texto.
Análisis comparativo de 30 indicadores y osciladores Análisis comparativo de 30 indicadores y osciladores
El presente artículo describe el funcionamiento de un Asesor Experto que realiza el análisis comparativo de 30 indicadores y osciladores. El objetivo es compilar un paquete de índices eficaz para hacer trading.
Diagnóstico de mercado por pulsos Diagnóstico de mercado por pulsos
En este artículo intentamos visualizar la intensidad de algunos mercados en particular, así como sus sus periodos de tiempo. El objetivo es detectar sus regularidades y patrones de comportamiento.
Asesores Expertos basados en sistemas populares de trading, y un poco de alquimia en la optimización de robots (Parte II) Asesores Expertos basados en sistemas populares de trading, y un poco de alquimia en la optimización de robots (Parte II)
En este artículo el autor continúa analizando la implementación de algoritmos de los sistemas de trading más sencillos, y describe algunos detalles relevantes sobre la optimización de resultados. Los traders principiantes y los desarrolladores noveles de EA encontrarán especialmente útil este texto.