English Русский 中文 Deutsch 日本語 Português
Visualización de un calendario de noticias

Visualización de un calendario de noticias

MetaTrader 4Ejemplos | 30 marzo 2016, 15:56
1 124 0
Slobodov Gleb
Slobodov Gleb

Introducción


En este artículo se describe la implementación de un indicador sencillo y cómodo que muestra en el área de trabajo los principales eventos económicos a partir de fuentes externas en Internet. La siguiente figura muestra el funcionamiento del indicador:



Esta es una lista de los requisitos para el indicador:
  • El indicador debe descargar por sí mismo (sin la ayuda del usuario) el archivo del calendario de eventos de la semana actual.
  • El indicador debe mostrar todos los eventos (pasados y futuros) a partir de este archivo en forma de líneas verticales con titulares de noticias.
  • El indicador debe hacer un seguimiento de la actualización de los eventos en la fuente externa.
Después de haber definido la tarea, podemos analizar algunos detalles técnicos.


La parte técnica


Vamos a utilizar la página http://www.dailyfx.com/calendar/ como fuente externa. La conveniencia de esta fuente es el hecho de que permite descargar calendarios con la extensión .csv, evitándonos la molestia de trabajar con archivos html. Este es un enlace de noticias para la semana actual: http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv.

Veamos ahora el proceso de descarga del archivo de Internet. Se puede hacer esto con el famoso programa GetRight. Se puede descargar desde aquí: http://www.getright.com/get.html o a partir de los archivos adjuntos a este artículo.

Una vez descargado el programa GetRight hay que configurarlo para descargar los archivos en el directorio deseado. Es el directorio \files\html\ en la carpeta de nuestro terminal de trading. Para ello, basta con pulsar F8 y cambiar el valor del campo como se indica a continuación:




Implementación del indicador


Después de haber resuelto algunos aspectos, podemos proceder con la implementación del indicador.

extern string HtmlAdress = "http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv";
extern string GetrightAdress = "c:\progra~1\getright\getright.exe";
 
#include <Time.mqh>
#import "kernel32.dll"
int WinExec(string NameEx, int dwFlags);

Sólo hay dos variables externas: la dirección de la fuente externa (en realidad no hay que modificar este parámetro) y la dirección del programa GetRight (si ha descargado el programa en otro repertorio, le recomiendo cambiar el valor inicial en el indicador para no tener que cambiar el valor de la variable cada vez que se inicia el indicador). Para ejecutar el archivo GetRight.exe usaremos la función WinExec que podemos importar de la librería Kernel32.dll. La librería Time.mqh contiene las funciones para trabajar en GMT.

void DownloadCalendar()
{
 Print("Downloading "+HtmlAdress+" to experts\files\html\Calendar.csv");
 WinExec(GetrightAdress+" /URL:"+HtmlAdress+" /FILE:Calendar.csv /W /O",0);
}

Como puede observar, la función de descarga del archivo desde una fuente externa es muy sencilla gracias al uso del programa GetRight. El parámetro /W indica que el proceso no será devuelto al programa hasta la descarga completa del archivo. El parámetro /O indica que si existe un archivo con el mismo nombre, este será sobrescrito. Le quiero recordar que si ha ajustado GetRight correctamente se descargará el calendario en \files\html\. A continuación se muestran dos funciones adicionales:

datetime PerviousMonday(datetime d)
{
 datetime res = d - (TimeDayOfWeek(d)-1)*24*60*60;
 return(res);
}
datetime ToDate(string stDate,string stTime)  
{
 string WeekDay = StringSubstr(stDate,0,3);
 int WeekPlus = 0;
 if (WeekDay=="Mon") WeekPlus=0;
 if (WeekDay=="Tue") WeekPlus=1;
 if (WeekDay=="Wed") WeekPlus=2;
 if (WeekDay=="Thu") WeekPlus=3;
 if (WeekDay=="Fri") WeekPlus=4;
 if (WeekDay=="Sat") WeekPlus=5;
 if (WeekDay=="Sun") WeekPlus=-1;
 datetime Res = PerviousMonday(GetTimeGMT())+WeekPlus*24*60*60;
 datetime Tm = StrToTime(stTime);
 Res=Res+TimeHour(Tm )*60*60+TimeMinute(Tm )*60+TimeSeconds(Tm )
 -TimeHour(Res)*60*60-TimeMinute(Res)*60-TimeSeconds(Res);  
 if (StringFind(stTime,"PM")>=0)  
 Res+=12*60*60;
 Res=Res-GetShiftGMT();
 return (Res);
}

La función PerviousMonday() devuelve la fecha de inicio de la semana actual. La función ToDate() convierte la fecha y la hora del formato calendario al formato "datetime".

void GrabNews()  
{
 int file = FileOpen("\Html\Calendar.csv",FILE_READ|FILE_CSV,',');
 if (file==-1||FileSize(file)==0)
 return;
 int i=0;
 while (!FileIsEnding(file))
 {
 string stDate="";
 while (!FileIsEnding(file)&&stDate=="")
 stDate = FileReadString(file);
 string stTime = FileReadString(file);
 string stTimeZone = FileReadString(file);
 string stCurrency = FileReadString(file);
 string stDescription = FileReadString(file);
 string stImportance = FileReadString(file);
 string stActual = FileReadString(file);
 string stForecast = FileReadString(file);
 string stPrevious = FileReadString(file);
 datetime Date = ToDate(stDate,stTime);
 color c=Green;
 if (stImportance=="Low") c = Yellow;
 if (stImportance=="Medium") c = Orange;
 if (stImportance=="High") c = Red;
 ObjectCreate("CalendarText"+i, OBJ_TEXT, 0, Date, Close[0]);
 ObjectSet("CalendarText"+i, OBJPROP_COLOR, c);  
 ObjectSetText("CalendarText"+i, stDate + " : "+ stDescription, 8);  
 ObjectSet("CalendarText"+i, OBJPROP_ANGLE, 90);  
 ObjectCreate("CalendarLine"+i, OBJ_VLINE, 0, Date, Close[0]);
 ObjectSet("CalendarLine"+i, OBJPROP_COLOR, c);  
 ObjectSet("CalendarLine"+i, OBJPROP_STYLE, STYLE_DOT);  
 ObjectSet("CalendarLine"+i, OBJPROP_BACK, true);  
 ObjectSetText("CalendarLine"+i, stDescription, 8);  
 i++;
 }
 Max = i;
 if (file!=-1)
 FileClose(file);
}

El procedimiento principal GrabNews() abre al archivo descargado \Html\Calendar.csv, lee todos los parámetros del evento y crea dos objetos para cada noticia: una línea vertical y un texto. Se actualiza el calendario de eventos cada 15 minutos:

int start()
  {
   int    counted_bars=IndicatorCounted();
//----
   if (TimeCurrent()>LastTimeDownloading+15*60)
     {
       DeleteObjects();
       DownloadCalendar();
       LastTimeDownloading = TimeCurrent();
       
       int file=-1;
       while (file==-1)
         file = FileOpen("\Html\Calendar.csv",FILE_READ|FILE_CSV,',');
       FileClose(file);
 
       GrabNews();
     }
//----
   return(0);
  }


Conclusión


En este artículo hemos visto cómo se muestra un calendario de eventos en el área de trabajo en forma de líneas verticales a partir de una fuente externa. El indicador fue diseñado deliberadamente sin demasiados parámetros, como el filtrado de las noticias según su relevancia o la relación de un evento con el símbolo de la ventana actual.

P.D. Quiero mencionar un error que suele ocurrir en el calendario http://www.dailyfx.com/calendar/. Tenga en cuenta que a veces los eventos del archivo .csv de la página http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv no coinciden exactamente con los de la página http://www.dailyfx.com/calendar/. Esto puede ocurrir con las noticias que se producen de 00:00 a 01:00 (GMT). Se indica este tipo de noticias en el archivo .csv 12 horas más tarde.

Tenga en cuenta también que el indicador usa una librería dll externa (kernel32.dll), por lo que no hay que olvidarse de habilitar el correspondiente parámetro en los ajustes del indicador.

Hay que guardar el archivo CalendarArticle.mq4 en la carpeta \experts\indicators. El archivo Time.mq4 se debe guardar en experts\library y Time.mqh en experts\include.

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

Archivos adjuntos |
getright_setup.zip (4763.33 KB)
Time.mq4 (2.03 KB)
Time.mqh (0.73 KB)
Lenguaje MQL4 para principiantes. Indicadores personalizados (Segunda parte) Lenguaje MQL4 para principiantes. Indicadores personalizados (Segunda parte)
Este es el quinto artículo de la serie "El lenguaje MQL4 para principiantes". Hoy vamos a aprender a utilizar los objetos gráficos; una poderosa herramienta de desarrollo que nos permite ampliar significativamente las posibilidades de uso de los indicadores. Además, se pueden utilizar en los scripts y en los Asesores Expertos. Vamos a aprender a crear objetos, cambiar sus parámetros y comprobar los errores. Obviamente, no puedo describir detalladamente todos los objetos, hay demasiados. Pero le proporcionaré todos los conocimientos necesarios para que pueda entenderlos por sí mismo. Este artículo contiene también un guía paso a paso para crear un indicador de señales compuestas. A su vez, se podrán ajustar muchos parámetros de la configuración, lo que permitiría cambiar fácilmente el aspecto del indicador.
Indicador Taichi - un sencillo método para interpretar los valores de Ichimoku Kinko Hyo. Indicador Taichi - un sencillo método para interpretar los valores de Ichimoku Kinko Hyo.
¿Es difícil interpretar las señales Ichimoku? Este artículo presenta algunos principios para interpretar los valores y señales de Ichimoku Kinko Hyo. Para la visualización de su funcionamiento el autor escogió el par de divisas EURUSD en base a sus propias preferencias. Sin embargo, se puede usar el indicador con cualquier par de divisas.
Una nueva mirada al gráfico Equivolume Una nueva mirada al gráfico Equivolume
El artículo aborda el método de construcción de gráficos en el cual cada barra está compuesta por el mismo número de ticks.
Lenguaje MQL4 para principiantes. Indicadores personalizados (Primera parte) Lenguaje MQL4 para principiantes. Indicadores personalizados (Primera parte)
Este es el cuarto artículo de la serie "El lenguaje MQL4 para Principiantes". Hoy vamos a aprender a escribir indicadores personalizados. Vamos a familiarizarnos con la clasificación de las funciones del indicador, veremos cómo estas características influyen en el indicador, aprenderemos nuevas funciones y la optimización y finalmente, vamos a escribir nuestros propios indicadores. Además, al final del artículo podrá encontrar consejos sobre el estilo de programación. Si este es el primer artículo "para principiantes" que está leyendo, quizá sería mejor que leyera los anteriores. Además, asegúrese de que ha entendido correctamente el material anterior, porque en este artículo no se explican los conceptos básicos.