English Русский 中文 Deutsch 日本語 Português
Alerta y comentario para indicadores externos. Análisis multidivisa a través de escáner externo

Alerta y comentario para indicadores externos. Análisis multidivisa a través de escáner externo

MetaTrader 4Ejemplos | 12 abril 2016, 15:21
796 0
Vladimir
Vladimir

Introducción

En el artículo anterior, vimos cómo se puede obtener la información de los indicadores que utilizan los símbolos Wingdings que se muestran en un gráfico como fuente de información ("Alerta y comentario para indicadores externos" y cómo crear alertas basadas en indicadores con respecto a los indicadores que usan buffers para almacenar información ("Alerta y comentario para indicadores externos. Parte dos", mientras se implementa a través del cambio de color.

Los cruces de las líneas de indicadores que se almacenan en buffers representan otra manera de informar al usuario del comportamiento del indicador.

Como ya se ha visto, obtener los valores de los buffers de los indicadores no es algo complicado que pueda afectar a la carga del procesador. Por lo tanto, en este indicador implementaremos la posibilidad de mostrar una información multidivisa.

Si el número de instrumentos disponibles es grande, el trader puede sufrir cansancio ocular por el control constante de los gráficos. Por lo que los traders a menudo eligen sólo unos cuantos símbolos y operan sólo con ellos.

Puede resultar que hubiera una oportunidad para ejecutar un trato, o un número de tratos en otra divisa que el gráfico no hubiera abierto en la pantalla en el momento adecuado. Por eso se necesita el análisis multidivisa de los instrumentos disponibles.

Basándome en eso, se me ha ocurrido la idea de utilizar una función de Alerta basada en el indicador como manera de mostrar información de forma rápida sobre los cambios en la lista de los instrumentos disponibles.



Alerta basada en indicador multidivisa

Echemos un vistazo primero al código del bloque de procesador de datos que obtiene la información de los buffers del indicador externo.

double buffer1, buffer2, buffer12, buffer22;
// Analyze the first and second bars in the charts
            buffer1  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 1);
            buffer12 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 2);
            buffer2  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 1);
            buffer22 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 2);
            if(buffer12<=buffer22&&buffer1>buffer2)
               {
                  Alert (text+"UP"); // There is a crossover
                  send_email (text+"UP");
                  return (1);
               }
            if(buffer12>=buffer22&&buffer1<buffer2)
               {
                  Alert (text+"DN"); // There is a crossover
                  send_email (text+"DN");
                  return (1);
               } 
            return (0);

Como se puede ver, todo es muy sencillo. Nos hemos encontrado con una lógica similar en el artículo anterior. La última vez se utilizó el cambio del color de los buffers que se mostraban, mientras que ahora se utilizan los valores de posición de esos buffers relativos unos a los otros.

El proceso necesario se implementará en un bloque separado. Los análisis multidivisa y de periodos múltiples de tiempo necesitarán un uso repetido de este procedimiento.

La lista de instrumentos disponibles se almacenará en un documento externo, que permitirá simplificar el proceso de cambios en caso de que se necesite hacer alguna modificación en el futuro. Utilizando ese método, para modificar la lista de instrumentos disponibles, el usuario puede recrear o hacer cambios al documento de los instrumentos disponibles de forma independiente, sin tener que modificar el código del programa del indicador.

Al final del artículo, verá cómo puede crear un documento personalizado de instrumentos disponibles.

Al final del artículo se proporciona un subprograma para la lectura de documentos de datos.

//+------------------------------------------------------------------+
//|                                           SymbolList_fromSet.mq4 |
//|                                      Copyright © 2006, komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+
void LoadFileToSymbol()
   {
      {
              int file_handle = FileOpen(SetFile_name + ".set", FILE_READ);
              //---- If an error occurred
              if(file_handle < 0)
                {
                         Print("Error No.", GetLastError(), " when opening the file!!!");
                         return(-1);
                }
              int SymbolsCount = 0;
              while(true)
                {
                         Symbols[SymbolsCount] = FileReadString(file_handle);
                         //---- If you have reached the end of the file, stop
                         if(GetLastError() == 4099) 
                             break;
                         if(FileIsEnding(file_handle)) 
                             break;
                         SymbolsCount ++;
                         ArrayResize(Symbols, SymbolsCount + 1);
                }
              FileClose(file_handle);
      }
   
   }  
//--------------------------------------------------------------+

Ahora, tras preparar la gama de instrumentos, sólo hay que implementar el procesamiento de periodos múltiples de tiempo para cada instrumento.

Empezaremos con los cálculos del periodo de tiempo actual.

// Analyze the array of symbols (Calculations on the current and all lower time frames)
         for (int i=0; i<ArraySize(Symbols); i++)
            {  Total = 0;
               switch (Period())
                  {
                     case 43200: Total = Total +  process ( Symbols[i], 43200);
                     case 10080: Total = Total +  process ( Symbols[i], 10080);
                     case  1440: Total = Total +  process ( Symbols[i],  1440);
                     case   240: Total = Total +  process ( Symbols[i],   240);
                     case    60: Total = Total +  process ( Symbols[i],    60);
                     case    30: Total = Total +  process ( Symbols[i],    30);
                     case    15: Total = Total +  process ( Symbols[i],    15);
                     case     5: Total = Total +  process ( Symbols[i],     5);
//                     case     1: Total = Total +  process ( Symbols[i],     1);
                  }

Los cálculos se hacen desde la hora actual hasta la hora más baja. Por lo que si necesita calcular la alerta que empieza desde un periodo diario, el gráfico con el indicador adjunto se debería abrir en un periodo diario. Si necesita una señal para empezar desde un periodo de tiempo por horas, el periodo de tiempo del gráfico debe ser por horas, y así todos. El indicador se recalcula sólo en cada barra nueva.

Un método como este ha permitido al usuario controlar los recálculos del indicador de manera más cómoda: sólo hay que cambiar el periodo de tiempo de trabajo, sin tener que añadir parámetros adicionales y funciones de cálculo al código.

La fila para trabajar en un periodo de tiempo por minutos no va a comentarse. Hay que comentarla en caso de que necesite utilizar el indicador en un periodo de tiempo por minutos.

//                     case     1: Total = Total +  AlertComment ( Symbols[i],     1);

El indicador 2MA_forAlert.mq4 que se adjunta en este artículo se utiliza como fuente de datos para nuestro indicador. 2MA_forAlert es un indicador simple que muestra dos líneas MA. También puede utilizar otro indicador que tenga dos buffers (dos líneas), por ejemplo Stchastic, MACD, etc.

Este es el aspecto de la terminal cuando se utilizan diferentes indicadores:

Los buffers en los que se almacenan los valores de las líneas pueden tener diferente orden. Por ejemplo:

0: línea principal

1: línea principal

o

0: línea señal

1: línea principal

Cuando se utiliza el indicador externo, debería determinar pos sí mismo el orden en el que se utilizarán las líneas. En caso de una notificación de alerta incorrecta, se deben cambiar los parámetro de entrada.

extern int       ExtBuff1      = 0;
extern int       ExtBuff2      = 1;

Los 8 buffers disponibles (número s de 0 a 7) se pueden utilizar como parámetros.

Como el indicador utiliza el archivo externo con una lista de instrumentos, le mostraré cómo se puede generar en la terminal.

Primero, se crean los instrumentos necesarios en la ventana de datos. Para ello:

1. Se abren todos los instrumentos disponibles.

2. Se dejan sólo aquellos para los que se obtuvieron señales.

Debería haber tantos instrumentos como los que se necesitan para el trading.

3. Luego haga clic en el botón derecho en la ventana Observar Mercado para guardar el archivo.

4. El archivo debe guardarse en la carpeta que tenga los archivos del Asesor Experto de MetaTrader.

El archivo se puede nombrar de cualquier manera, pero la extensión .set no se puede modificar. El ejemplo que se ofrece en el artículo utiliza el archivo forexall.set.

extern string    SetFile_name  = "forexall"; // File that contains symbols of user instruments

Tras crear el archivo, deberá abrir gráficos para cada símbolo, uno por uno, para que la terminal cargue el historial. De lo contrario, cualquier instrumento puede fallar en el proceso.

Si guardó el archivo en la carpeta por defecto \experts\symbolsets, asegúrese de copiarlo a la carpeta de MetaTrader \experts\files, ya que es la única carpeta desde la que el indicador puede abrir el archivo (limitaciones de MetaTrader). En el indicador, debería introducir más adelante el nombre del archivo que se procesará para leer los datos en el instrumento disponible que contiene.

También tiene la oportunidad de obtener información del funcionamiento del escáner multidivisa en su correo electrónico. Sólo configure el valor del parámetro correspondiente en true y obtenga las señales por correo electrónico.

extern bool      Signal_email  = false;

Hay usuarios que continúan con el desarrollo del código implementando la redirección para obtener señales a través de SMS. El método de cada persona es diferente.

Todos los indicadores deberían estar en la carpeta \experts\indicadores de MetaTrader.



Conclusión

Este método le permite utilizar las funciones de Alerta para construir su espacio de información de varios módulos, sin tener que aprender a programar ni buscar a un especialista que pueda implementar su idea en el programa. Lo principal para nosotros es obtener información.

Para terminar, proporcionaré un código completo para la alerta del indicador.

//+------------------------------------------------------------------+
//|                                                    Alert_MT4.mq4 |
//|                                      Copyright © 2009, Fibook.ru |
//|                                             http://www.fibook.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Fibook.ru"
#property link      "http://www.fibook.ru"

#property indicator_chart_window

extern string    SetFile_name="forexall"; // File that contains symbols of user instruments
extern string    nameIndicator = "input indicator name";
extern int       ExtBuff1      = 0;
extern int       ExtBuff2      = 1;
extern string    UserText      = "Cross";
extern bool      Signal_email  = false;

string Symbols[1],text;
int expBars=0;
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
// If there is no new bar, exit
   if(!isNewBar()) return;
   int Total;
//---- Check for input parameter errors
   if(ControlError()==false) return;
//---- Load symbols from the file to the Symbols array
   LoadFileToSymbol();
//----

// Analyze the array of symbols (Calculations on the current and all lower time frames)
   for(int i=0;i<ArraySize(Symbols);i++)
     {
      Total=0;
      switch(Period())
        {
         case 43200: Total = Total +  process ( Symbols[i], 43200);
         case 10080: Total = Total +  process ( Symbols[i], 10080);
         case  1440: Total = Total +  process ( Symbols[i],  1440);
         case   240: Total = Total +  process ( Symbols[i],   240);
         case    60: Total = Total +  process ( Symbols[i],    60);
         case    30: Total = Total +  process ( Symbols[i],    30);
         case    15: Total = Total +  process ( Symbols[i],    15);
         case     5: Total = Total +  process ( Symbols[i],     5);
         //                     case     1: Total = Total +  process ( Symbols[i],     1);
        }
      if(Total>1)
        {
         text=StringConcatenate(" Warning!!!      ",Symbols[i]," have ",UserText," for ",Total," TF");
         Alert(text);
         send_email(text);
        }
     }

//----
   return(0);
  }
//+------------------------------------------------------------------+

int process(string Sym_,int TF)
  {
   text=StringConcatenate(Sym_," ",TF," indicator ",nameIndicator," Crossing line ");
   double buffer1,buffer2,buffer12,buffer22;
// Analyze the first and second bars in the charts
   buffer1  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 1);
   buffer12 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff1, 2);
   buffer2  = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 1);
   buffer22 = iCustom(Sym_, TF, nameIndicator, 0, ExtBuff2, 2);
   if(buffer12<=buffer22 && buffer1>buffer2)
     {
      Alert(text+"UP"); // There is a crossover
      send_email(text+"UP");
      return(1);
     }
   if(buffer12>=buffer22 && buffer1<buffer2)
     {
      Alert(text+"DN"); // There is a crossover
      send_email(text+"DN");
      return(1);
     }
   return(0);

  }
//+------------------------------------------------------------------+
//|                                           SymbolList_fromSet.mq4 |
//|                                      Copyright © 2006, komposter |
//|                                      mailto:komposterius@mail.ru |
//+------------------------------------------------------------------+

void LoadFileToSymbol()
  {
     {
      int file_handle=FileOpen(SetFile_name+".set",FILE_READ);
      //---- If an error occurred
      if(file_handle<0)
        {
         Print("Error No.",GetLastError()," when opening the file!!!");
         return(-1);
        }
      int SymbolsCount=0;
      while(true)
        {
         Symbols[SymbolsCount]=FileReadString(file_handle);
         //---- If you have reached the end of the file, stop
         if(GetLastError()==4099)
            break;
         if(FileIsEnding(file_handle))
            break;
         SymbolsCount++;
         ArrayResize(Symbols,SymbolsCount+1);
        }
      FileClose(file_handle);
     }

  }
//--------------------------------------------------------------+
void send_email(string text)
  {
   if(Signal_email==true) SendMail("Alert ",text);
  }
//--------------------------------------------------------------+
bool ControlError()
  {
// Check whether the indicator name has been entered
   if(nameIndicator=="input indicator name")
     {
      Alert("Enter the indicator name ");
      return(false);
     }
// Check whether the file containing the symbols exists
   int handle;
   handle=FileOpen(SetFile_name+".set",FILE_CSV|FILE_READ,';');
   if(handle<1)
     {
      Alert("The ",SetFile_name,".set file could not be found, last error ",GetLastError());
      return(false);
     }
// Check if there is any error in the assignment of input variables of the analyzed indicator buffers
   if(ExtBuff1>7 || ExtBuff2>7)
     {
      Alert("Incorrect parameters of the ExtBuff1 or ExtBuff2 buffer");
      return(false);
     }
   if(ExtBuff1==ExtBuff2)
     {
      Alert("Error: ExtBuff1 and ExtBuff2 cannot be equal");
      return(false);
     }

   return(true);
  }
/*----------------------------------------------------------------------+
 |The function will return true if the new bar appears, otherwise false |
 +---------------------------------------------------------------------*/
bool isNewBar()
  {
   bool res=false;
   if(expBars!=Bars)
     {
      expBars=Bars;
      res=true;
     }
   return(res);
  }
//+------------------------------------------------------------------+

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

Archivos adjuntos |
2MA_forAlert.mq4 (2.72 KB)
Alert_MT4.mq4 (6.31 KB)
Alerta y comentario para indicadores externos (Parte dos) Alerta y comentario para indicadores externos (Parte dos)
Desde que publiqué el artículo "Alerta y comentario para indicadores externos", he recibido peticiones y preguntas sobre la posibilidad de desarrollar un informador externo que funcione en base a las líneas del indicador. Una vez analizadas todas las preguntas, decidí continuar con el tema. Almacenar los datos en un buffer de un indicador resultó ser otra área de interés para los usuarios.
Control gráfico de los parámetros externos de los indicadores Control gráfico de los parámetros externos de los indicadores
Las variables externas de los indicadores se controlan utilizando una ventana especial en la que los parámetros se puede cambiar y el indicador tiene que iniciarse de nuevo. El inconveniente obvio de estas manipulaciones han aumentado la necesidad de mostrar los parámetros necesarios en la pantalla y controlar el indicador gráficamente.
Asesores expertos basados en sistemas de trading populares y alquimia de la optimización de robots de trading (Parte IV) Asesores expertos basados en sistemas de trading populares y alquimia de la optimización de robots de trading (Parte IV)
En este artículo el autor continúa analizando los algoritmos de implementación de los sistemas de trading más simples e introduce la grabación de los resultados de la optimización en el backtesting (prueba en periodos pasados) en un archivo html en forma de tabla. El artículo será útil para los traders principiantes y para los escritores de asesores expertos.
Leer fuentes de noticias RSS a través de MQL4 Leer fuentes de noticias RSS a través de MQL4
Este artículo trata un ejemplo de lectura de márgenes RSS a través de MQL4 utilizando las funciones para el análisis de etiquetas HTML. Intentaremos hacer un trabajo que se pueda transformar en un indicador de noticias o en un lector RSS en lenguaje MQL4.