Alertas de sonido en los indicadores

Andrey Khatimlianskii | 11 mayo, 2016


Introducción

Aunque el trading automático es cada vez más popular, muchos traders siguen practicando el trading manual. Entonces, mientras que un Asesor experto necesita algunos milisegundos para evaluar la situación actual del mercado, una persona necesitará mucho más tiempo, energía y - lo que es más importante - atención.


Desde hace un par de años, muchos traders utilizan uno o varios Indicadores ténicos. Algunas estrategias consideran los valores del indicador en varios periodos de tiempo simultáneamente.


Entonces, ¿cómo se puede "coger" una señal importante? Hay varias opciones:

  • escribir un Asesor experto que analice el mercado y avise de los eventos importantes;
  • sentarse frente a la pantalla y, alternando entre montones de gráficos, intentar analizar la información de todos;
  • añadir un sistema de alerta en todos los indicadores que se utilicen.

La primera elección, en mi opinión, es la más adecuada. Pero requiere conocimientos de programación, o dinero para pagar para su realización. La segunda opción es mucho más dominante, cansado, e ineficiente. La tercera elección está entre las dos anteriores. Se necesitan muy pocas capacidades y menos tiempo para implementarla, pero puede mejorar mucho el lote del usuario del trading manual.

Este artículo está dedicado a esta tercera aplicación. Tras leerlo, cada trader podrá añadir las alertas necesarias a los indicadores.



Tipos de alertas

Hay muchas formas de interpretar los indicadores. Si la gente puede entender de formas diferentes el significado de los indicadores de cada Terminal de cliente de MetaTrader 4, imagínese de varios indicadores personalizados...


Alguien compra cuando la línea principal de MACD toca la línea de señal, otro trader espera hasta que se cruce con la línea cero, y otra persona abre una posición larga cuando MACD está por debajo de 0 y empieza a subir. No me siento capaz de contar todas las diferentes interpretaciones posibles, por lo que describiré los principios de cómo se puede añadir un bloque de alerta a un indicador. Luego podrá añadir cualquier tipo de alerta a prácticamente todos los indicadores, según su gusto.


Las alertas más posibles son las siguientes:

  • cruce de dos líneas de un indicador (vaya al ejemplo anterior - la línea principal y la de señal del MACD);
  • cruce de la línea del indicador y de un nivel determinado (por ejemplo, la línea principal del MACD y línea cero, estocástico y los niveles 70 y 30, CCI y los niveles -100 y 100);
  • movimiento invertido del indicador (por ejemplo, AC y AO, normal MA);
  • cambio de ubicación hacia el precio (Parabólica SAR);
  • aparición de una fecha sobre o bajo el valor del precio (Fractal).

Probablemente haya otras interpretaciones que se me han olvidado, o que ni siquiera conozca, así que voy a describir las cinco que he nombrado arriba.



Formas de alertar

MetaTrader 4 y MQL4 permiten la implementación de varias formas de alerta, tanto visuales como auditivas:

  • un mensaje en la pantalla (función Comment);
  • una grabación en el registro (función Print);
  • una ventana con un mensaje y un sonido (función Alert);
  • un sonido especial, un archivo que se seleccione para que se reproduzca (función PlaySound);

Además, hay funciones para enviar un archivo al servidor FTP (función SendFTP()), para mostrar una caja de mensaje/diálogo (MessageBox()), y enviar correos electrónicos (SendMail()). Es difícil que un usuario normal pida la función SendFTP(), la función MessageBox() no sirve para usarse en un indicador, ya que detiene su funcionamiento hasta que la caja del mensaje se cierre, la función SendMail(), aunque es buena para enviar SMS, es más bien "peligrosa" de usarse - tras dibujar varios indicadores en un gráfico, se auto proporcionará un flujo infinito y descontrolado de mensajes. La función puede usarse, pero sería mejor utilizarla desde un AE, enviando un mensaje cuando aparezca una alerta simultáneamente en varios indicadores, prestando mucha atención.


En este artículo, se considerarán sólo las formas auditivas y visuales de alerta en la Terminal de cliente de MetaTrader 4.

Una de las más cómodas y simples es la función Alert, ya que contiene tanto sonido como texto. Además, la terminar almacena el historial de Alerts, para que pueda verse qué señal apareció hace una hora.

Pero para gustos, colores. Así que voy a hacer algo parecido a la ejecución de todos los métodos mencionados arriba (excepto SendFTP, MessageBox, SendMail), y usted elegirá la que mejor le convenga.



Filtro de frecuencia de alerta

Si ha usado alguna vez las alertas en los indicadores, tuvo que lidiar con sus apariciones constantes, especialmente en los periodos de tiempo pequeños. Hay varias maneras de resolver este problema:

  • Definir alertas en las barras que ya se han formado. Esta solución sería la más adecuada.
  • Alternar alertas - vender tras comprar y vice versa (sería también una forma muy lógica, y se puede utilizar junto a las otras).
  • Hacer una pausa entre alertas (no es muy buena idea).
  • Dar sólo una alerta por barra (esta limitación es más bien una limitación afectada).
El utilizar o no las alertas desde una barra sin formar, en cero, es un tema personal. Yo, por ejemplo, creo que está mal. Pero hay indicadores que necesitan una respuesta instantánea - una barra es demasiado para ellos. Así que permitiremos a los usuarios que elijan. No tendría sentido tener varias alertas para comprar, así que alternaremos todas las alertas. Supongo que no se introducirá ninguna pausa artificial. Si es realmente necesario, este hecho se conocerá en los comentarios de este artículo.

Así que vamos a empezar.

Alerta uno - Cruce de dos líneas de un indicador

Vamos a empezar con una MACD que se ha dado en los ejemplos de arriba.


La tarea principal es detectar en qué gamas se han almacenado las líneas del indicador. Para esto, se mira el código:


//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property  indicator_color1  Silver
#property  indicator_color2  Red
#property  indicator_width1  2
//---- indicator parameters
extern int FastEMA = 12;
extern int SlowEMA = 26;
extern int SignalSMA = 9;
//---- indicator buffers
double MacdBuffer[];
double SignalBuffer[];

Por favor, tenga en cuenta que lo que se estaba buscando es el comentario de "buffer del indicador". Estas gamas tienen normalmente nombres intuitivos y completos (MacdBuffer es el valor del buffer de la línea principal de MACD, SignalBuffer - buffer en la línea de señal) y siempre están colocados fuera de las funciones init, deinit, y start.

Si hay varias gamas y es difícil ver cuál de ellas es necesaria, mire en la función init - todas las gamas que se muestran en el gráfico están ancladas a un número en concreto utilizando la función SetInndexBuffer.

int init()
  {
//---- drawing settings
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexStyle(1, DRAW_LINE);
   SetIndexDrawBegin(1, SignalSMA);
   IndicatorDigits(Digits + 1);
//---- indicator buffers mapping
   SetIndexBuffer(0, MacdBuffer);
   SetIndexBuffer(1, SignalBuffer);
//---- name for DataWindow and indicator subwindow label
   IndicatorShortName("sMACD(" + FastEMA + "," + SlowEMA + "," + SignalSMA + ")");
   SetIndexLabel(0, "sMACD");
   SetIndexLabel(1, "sSignal");
//---- initialization done
   return(0);
  }

Esta es la secuencia (de 0 a 7) en la que los valores de la línea del indicador se muestran en la DataWindow. Puede ver que los nombres los da la función SetIndexLabel - es el tercer método de identificación.


Cuando se sepa dónde están almacenados los datos necesarios, se puede empezar a hacer el bloc de alerta. Para ello, hay que ir hasta el final de la función start - justo encima del retorno del operador anterior.


   for(i = 0; i < limit; i++)
       SignalBuffer[i] = iMAOnArray(MacdBuffer, Bars,S ignalSMA, 0, MODE_SMA, i);
//---- done
 
// we will add our code here
 
   return(0);
  }
//+------------------------------------------------------------------+

En ningún caso debe añadirse el bloque de alerta en el bucle de cálculo del indicador - esto ralentizará la ejecución y no dará ningún efecto.

Vamos a empezar con la escritura de la "composición":

    //---- Static variables where the last bar time
    //---- and the last alert direction are stored
    static int PrevSignal = 0, PrevTime = 0;
 
    //---- If the bar selected to be analyzed is not a zero bar, 
    //     there is no sense to check the alert
    //---- several times. If no new bar starts to be formed, quit.
    if(SIGNAL_BAR > 0 && Time[0] <= PrevTime ) 
        return(0);
    //---- Mark that this bar was checked
    PrevTime = Time[0];

Cada vez que se ejecuta la función start, también se ejecutará el código. Las variables normales se ponen a cero después de cada ejecución de la función. Así que hemos declarado dos variables estáticas para almacenar la última alerta y calcular el número de la barra.
Luego hay que hacer una comprobación simple: comprobamos si se ha iniciado una nueva barra (sólo funciona si SIGNAL_BAR es superior a 0).

Por cierto, declaramos la variable SIGNAL_BAR un poco antes, antes de la función init:

double     SignalBuffer[];
 
//---- Bar number the alert to be searched by
#define SIGNAL_BAR 1
 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {

Por favor, tenga en cuenta la directiva #define - el compilador reemplazará la variable SIGNAL_BAR con el valor obtenido (1) a través del código.

Debajo está el código de la alerta:

    //---- If the preceding alert was SELL or this is the first launch (PrevSignal=0)
    if(PrevSignal <= 0)
      {
        //---- Check whether the lines have met in the preceding bar:
        if(MacdBuffer[SIGNAL_BAR] - SignalBuffer[SIGNAL_BAR] > 0 && 
           SignalBuffer[SIGNAL_BAR+1] - MacdBuffer[SIGNAL_BAR+1] >= 0)
          {
            //---- If yes, mark that the last alert was BUY
            PrevSignal = 1;
            //---- and display information:
            Alert("sMACD (", Symbol(), ", ", Period(), ")  -  BUY!!!");
//            Print("sMACD (", Symbol(), ", ", Period(), ")  -  BUY!!!");
//            Comment("sMACD (", Symbol(), ", ", Period(), ")  -  BUY!!!");
//            PlaySound("Alert.wav");
          }
      }

Esto también es muy simple. Si la alerta anterior era SELL, compruebe el cruce de las líneas:
Si el valor de la lína principal de MACD en la barra #1, es superior al de la línea de señal en la barra #1
y
el valor de la línea de señal en la barra #2 es superior al de la línea MACD en la barra #2
significa que
las líneas se han cruzado.


Luego señale que la última alerta fue BUY y muestre el mensaje de información. Tenga en cuenta las tres líneas que se han comentado - son tres variaciones más de alertas. Puede desmarcarlas o eliminarlas. Yo dejo la Alerta por defecto como las más adecuada.
En la función PlaySound se puede especificar qué archivo .wav se debe reproducir. El archivo debe estar ubicado en el directorio MetaTrader 4\sounds\ y tener la extensión .wav. Por ejemplo, se puede asignar un sonido especial a la alerta BUY, otro para la alerta SELL, o puede haber diferentes sonidos para diferentes indicadores, etc.

La alerta SELL es exactamente igual.


    //---- Completely the same for the SELL alert
    if(PrevSignal >= 0)
      {
        if(SignalBuffer[SIGNAL_BAR] - MacdBuffer[SIGNAL_BAR] > 0 && 
           MacdBuffer[SIGNAL_BAR+1] - SignalBuffer[SIGNAL_BAR+1] >= 0)
          {
            PrevSignal = -1;
            Alert("sMACD (", Symbol(), ", ", Period(), ")  -  SELL!!!");
//            Print("sMACD (", Symbol(), ", ", Period(), ")  -  SELL!!!");
//            Comment("sMACD (", Symbol(), ", ", Period(), ")  -  SELL!!!");
//            PlaySound("Alert.wav");
          }
      }


Otras alertas

Cuando se sepa el código del indicador, será mucho más fácil escribir otros bloques de alertas. Sólo se cambiará una "fórmula", el resto del código será copiado y pegado.

La alerta que indique que las señales están a punto de llegar a un cierto nivel es muy parecida a la del cruce de las líneas. Yo la añadí a Escotástico, pero puede hacer una similar para cualquier otro indicador.


    if(PrevSignal <= 0)
      {
        if(MainBuffer[SIGNAL_BAR] - 30.0 > 0 && 
           30.0 - MainBuffer[SIGNAL_BAR+1] >= 0)
          {
            PrevSignal = 1;
            Alert("sStochastic (", Symbol(), ", ", Period(), ")  -  BUY!!!");
          }
      }
    if(PrevSignal >= 0)
      {
        if(70.0 - MainBuffer[SIGNAL_BAR] > 0 && 
           MainBuffer[SIGNAL_BAR+1] - 70.0 >= 0)
          {
            PrevSignal = -1;
            Alert("sStochastic (", Symbol(), ", ", Period(), ")  -  SELL!!!");
          }
      }

Como puede ver, si la linea %K (MainBuffer) llega al nivel 30 de abajo a arriba, el indicador dirá "Compra", mientras que si llega al nivel 70 de abajo a arriba, dirá "Vende".

El tercer tipo de alerta es la que informa sobre un cambio de dirección. Se considerará en el ejemplo de AC. Tenga en cuenta que se usan cinco buffers en este indicador:


//---- indicator buffers
double     ExtBuffer0[];
double     ExtBuffer1[];
double     ExtBuffer2[];
double     ExtBuffer3[];
double     ExtBuffer4[];

ExtBuffer3 y ExtBuffer4 se usan para los calculos intermediarios; ExtBuffer0 siempre almacena el valor del indicador; ExtBuffer2 y ExtBuffer3 "coloeran" las columnas en 2 colores. Como sólo se necesita el valor del indicador, se utilizará ExtBuffer0.

    if(PrevSignal <= 0)
      {
        if(ExtBuffer0[SIGNAL_BAR] - ExtBuffer0[SIGNAL_BAR+1] > 0 &&
           ExtBuffer0[SIGNAL_BAR+2] - ExtBuffer0[SIGNAL_BAR+1] > 0)
          {
            PrevSignal = 1;
            Alert("sAC (", Symbol(), ", ", Period(), ")  -  BUY!!!");
          }
      }
    if(PrevSignal >= 0)
      {
        if(ExtBuffer0[SIGNAL_BAR+1] - ExtBuffer0[SIGNAL_BAR] > 0 &&
           ExtBuffer0[SIGNAL_BAR+1] - ExtBuffer0[SIGNAL_BAR+2] > 0)
          {
            PrevSignal = -1;
            Alert("sAC (", Symbol(), ", ", Period(), ")  -  SELL!!!");
          }
      }

Si el valor del indicador estaba disminuyendo y luego empieza a aumentar, le damos la alerya BUY. Si pasa lo contrario, la alerta SELL.

El cuarto tipo de alerta informa sobre un cambio de ubicación hacia el precio, aunque es más bien rara.
Pero aparece a veces, por ejemplo, en Parabólica. Se escribirá la "fórmula" utilizándola como ejemplo:

    if(PrevSignal <= 0)
      {
        if(Close[SIGNAL_BAR] - SarBuffer[SIGNAL_BAR] > 0)
          {
            PrevSignal = 1;
            Alert("sParabolic Sub (", Symbol(), ", ", Period(), ")  -  BUY!!!");
          }
      }
    if(PrevSignal >= 0)
      {
        if(SarBuffer[SIGNAL_BAR] - Close[SIGNAL_BAR] > 0)
          {
            PrevSignal = -1;
            Alert("sParabolic Sub(", Symbol(), ", ", Period(), ")  -  SELL!!!");
          }
      }

Es muy simple, se compara el valor del indicador al valor del precio de cierre de la barra. Tenga en cuenta que, si la SIGNAL_BAR se establece para 0, todos los precios que toque la Parabólica estará acompañado de una alerta.

La última alerta informa sobre la aparición de una flecha en el gráfico. Aparece muy poco en los indicadores estándar, pero es bastante popular en la personalización de "localizadores de eje". Consideraré este tipo de alertas utilizando el indicador Fractales (se puede encontrar su código fuente escrito en MQL4 en Código Base: Fractales).


Algo común de todos estos indicadores, es que en los gráficos en los que se escriben, no son iguales a 0 (o EMPTY_VALUE). Todas las otras barras vacían sus buffers. Para determinar el valor de la señal del buffer basta con compararlo a 0.


    if(PrevSignal <= 0 )
      {
        if(ExtDownFractalsBuffer[SIGNAL_BAR] > 0)
          {
            PrevSignal = 1;
            Alert("sFractals (", Symbol(), ", ", Period(), ")  -  BUY!!!");
          }
      }
    if(PrevSignal >= 0)
      {
        if(ExtUpFractalsBuffer[SIGNAL_BAR] > 0)
          {
            PrevSignal = -1;
            Alert("sFractals (", Symbol(), ", ", Period(), ")  -  SELL!!!");
          }
      }

Pero si adjunta un indicador con un código así al gráfico, nunca recibirá alertas. Los fractales tienen una característica especial - utilizan 2 barras futuras para los análisis, así las flechas sólo aparecen en la barra #2 (la tercera barra empieza con la cero). Así que, para que las alertas empiecen a funcionar, es necesario establecer la SIGNAL_BAR como 2:


//---- Bar number to search an alert by
#define SIGNAL_BAR 2

¡Y las alertas ya están listas para funcionar!



Conclusión

El artículo da una descripción de varios métodos utilizados para añadir alertas de sonido a los indicadores. Se definen términos como método de interpretación de alertas (tipo de alerta), forma de alerta, y filtro de frecuencia de alerta.

Se definen y realizan los siguientes tipos de alertas.

  • cruce de dos líneas de un indicador
  • cruce de la línea del indicador y un nivel concreto;
  • movimiento inverso del indicador;
  • cambio de ubicación hacia el precio;
  • aparición de una fecha sobre o bajo el valor del precio.
Se seleccionan como alertar las siguientes funciones:
  • Comment() - muestra un mensaje normal;
  • Print() - muestra un mensaje en el registro;
  • Alert() - muestra el mensaje en una ventana especial con una alerta de sonido.
  • PlaySound() - reproducción de un archivo .wav.
Para reducir la frecuencia de las alertas:
  • utilizar las barras ya formadas cuando se determina la alerta;
  • se alternan todas las alertas - sólo comprar después de vender y vice versa.

Utilicé cinco indicadores que se corresponden con cinco tipos de alertas para estudiar sus bloques de alerta. Puede descargar los indicadores resultantes - están adjuntos en este artículo.

Espero que haya comprobado que es muy fácil añadir un bloque de alerta a los indicadores - cualquiera puede hacerlo.