Alerta y comentario para indicadores externos (Parte dos)

Vladimir | 12 abril, 2016

Introducción

El primer artículo, "Alerta y comentario para indicadores externos" trató el método de obtención de datos de los indicadores que se utilizan como símbolos Wingdings mostrados en un gráfico como fuente de información.

Aquí, veremos cómo se pueden obtener los valores de los buffers del indicador y utilizarlos para informar al usuario de ciertos eventos del indicador.

Teniendo en cuenta que hay un grupo de operadores que se utiliza para obtener las características necesarias cuando se leen los parámetros de los trazados gráficos, sólo se pueden configurar los parámetros de los buffers del indicador. Aquí no se puede obtener, por ejemplo, un color. Todo lo que se puede obtener son precios y características de tiempo. Como ejemplo, tomaremos un indicador basado en el principio del cambio de color cuando muestra información en el indicador.
Una de las opciones del almacenamiento de información en buffers de estos indicadores, es prepararlos para mostrar una línea utilizando dos buffers. A cada buffer se le asigna un color. La información se saca de manera que sólo uno de los dos buffers es el que muestra la información en cualquier punto temporal. El buffer activo tiene parámetros con valores superiores a cero. El valor del parámetro en el buffer inactivo es cero.

Por lo que hay valores que se pueden analizar para sacar información de los cambios del indicador.



Salida de datos del buffer del indicador

Los recursos MQL permiten introducir/sacar datos de ocho buffers de indicador.
Por lo que se analizarán los ocho.

Las condiciones se aplican en el análisis así: Cuando el valor del indicador cambia de cero a uno importante, incluido el cambio inverso, es decir, de un valor importante a cero, hay que avisar al usuario. Se toma el valor del primer buffer del indicador cambiado y se comprueban los valores de todos los buffers uno por uno, empezando por la primera barra o cualquier otra barra que el usuario especifique en la variable externa.

extern int     StartBar=1;       // Start bar

Como ejemplo, cojamos el indicador Slope Trend_mtf que saca información de la siguiente manera:

Imagen 1.

Una vez que se ha detectado, el indicador registra el dato y el indicador deja de funcionar.

Hay varias características MQL4 que se pueden utilizar para sacar datos:

  • Ventanas de alerta;
  • comentarios en la ventana del indicador;
  • reproducir un archivo de audio.

Un programa que saca los datos es así:

//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator Subfunction                             |
//+------------------------------------------------------------------+

void AlertComment (string text)
   {
      if (SignalAlert   == true)    Alert    (text);
      if (SignalComment == true)    Comment  (text);
      if (SignalPlay    == true)    PlaySound(Signal);
   }

Se añaden las variables necesarias para controlar a discreción del usuario.

También se proporciona la posibilidad de sacar un comentario de usuario especificado por el usuario.

extern int     StartBar=1;                            // Start bar
extern string  indicator = "Insert Indicator Name";   // Custom indicator
extern bool    VLine = true;                          // Vertical line output switch
extern bool    SignalAlert=false;                     // Alert window output switch
extern bool    SignalComment=true;                    // Comment output switch
extern bool    SignalPlay= false;                     // Sound play switch
extern string  Signal = "alert.wav";                  // Custom sound file
extern string  UserText = "direction changed";        // User comment

en el que:

StartBar

La variable que indica el cálculo empieza:

indicator 

Aquí se introduce el nombre del indicador del que se quiere obtener los datos.

Esto va seguido por una serie de parámetros lógicos que el usuario puede utilizar para controlar la salida de los parámetros relevantes para el programa.

VLine 

Indica si mostrar (true) o no (false) una línea vertical en el punto de cambio de los parámetros de los indicadores.

SignalAlert

Indica si mostrar (true) o no (false) la ventana de información cuando hay un cambio en los parámetros del indicador.

SignalComment

Indica si sacar (true) o no (false) los datos en el gráfico cuando hay un cambio en los parámetros del indicador.

SignalPlay

Indica si reproducir (true) o no (false) un archivo de sonido cuando hay un cambio en los parámetros del indicador.

Signal 

Aquí se introduce el nombre del archivo de sonido a reproducir cuando hay un cambio en los parámetros del indicador.

UserText 

Aquí se introduce el texto que se quiere ver en el gráfico cuando hay un cambio en los parámetros del indicador si no se quiere dejar el texto por defecto.

De igual forma, puede añadir parámetros para enviar información relevante a su correo electrónico.

Ahora sólo hay que leer los datos del indicador y controlarlo utilizando la configuración de cada uno.

El código del bloque de control es así:

   for(int ii=StartBar;ii<ExtBars;ii++)
      for(int i=0;i<8;i++)
        {
         First =iCustom(NULL,0,indicator,i,ii);
         Second=iCustom(NULL,0,indicator,i,ii+1);
         if((Second==0 && First>0) || (Second>0 && First==0))
           {
            text=StringConcatenate(Str+" -  On ",ii+1," bar ",Symbol()," -  ",indicator," ");
            AlertComment(text+UserText);
            if(VLine==true)
               ObjectCreate(STRING_ID+"VL_"+i,0,0,Time[ii],Bid);
            return;
           }
        }

Después de implementar el método especificado y establecer los parámetros relevantes para mostrar la línea vertical, el gráfico tendrá el siguiente aspecto:

Imagen 2.



Conclusión

A pesar de los numerosos comentarios en las imperfecciones de MQL4, este lenguaje ofrece amplias características que se pueden utilizar en la programación de varios trading y aplicaciones de información. Además, apoya el aprendizaje intuitivo y le da acceso a una gran librería de aplicaciones ya listas.

El código completo del indicador de información se ofrece a continuación:

//+------------------------------------------------------------------+
//|                                               AlertSignal_v1.mq4 |
//|                                  Copyright © 2009, WWW.FIBOOK.RU |
//|                                                 http://fibook.ru |
//+------------------------------------------------------------------+
#property copyright  "Copyright © 2009, FIBOOK.RU"
#property link       "http://fibook.ru"
#define Str           "http://fibook.ru"
#define STRING_ID    "AlertSignal_"
#property indicator_chart_window
extern int     StartBar=1;                       // Start bar
extern string indicator="Insert Indicator Name"; // Custom indicator
extern bool    VLine=true;                       // Vertical line output switch
extern bool    SignalAlert=false;                // Alert window output switch
extern bool    SignalComment=true;               // Comment output switch
extern bool    SignalPlay=false;                 // Sound play switch
extern string  Signal="alert.wav";               // Custom sound file
extern string  UserText="direction changed";   // User comment
IndicatorShortName("AlertSignal_v1 ");
//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator deinitialization function               |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   for(int i=0;i<8;i++)
      ObjectDelete(STRING_ID+"VL_"+i);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator iteration function                      |
//+------------------------------------------------------------------+
int start()
  {
   string     text;
   int        ExtBars=150;  // Number of the last bars for calculation
   double     First;        // Internal variable
   double     Second;       // Internal variable
   int        per;          // Internal variable
   if(indicator=="Insert Indicator Name")
     {
      Alert(indicator);
      return;
     }
   if(per==Time[0]) return; // Adjust once in a period
   per=Time[0];
//----
   for(int ii=StartBar;ii<ExtBars;ii++)
      for(int i=0;i<8;i++)
        {
         First =iCustom(NULL,0,indicator,i,ii);
         Second=iCustom(NULL,0,indicator,i,ii+1);
         if((Second==0 && First>0) || (Second>0 && First==0))
           {
            text=StringConcatenate(Str+" - On ",ii+1," bar ",Symbol()," -  ",indicator," ");
            AlertComment(text+UserText);
            if(VLine==true)
               ObjectCreate(STRING_ID+"VL_"+i,0,0,Time[ii],Bid);
            return;
           }
        }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| AlertSignal_v1 indicator Subfunction                             |
//+------------------------------------------------------------------+
void AlertComment(string text)
  {
   if(SignalAlert==true) Alert(text);
   if(SignalComment==true) Comment(text);
   if(SignalPlay==true) PlaySound(Signal);
  }
//+------------------------------------------------------------------+