
Exibição de um novo calendário
Introdução
Este artigo contém a descrição para escrever um indicador simples e conveniente exibindo em uma área de trabalho os principais eventos econômicos a partir de recursos externos da Internet. O funcionamento do indicador se parece com isto:
- O indicador deve, de forma independente (sem a ajuda de um usuário), baixar um arquivo necessário do calendário de eventos para a semana em curso.
- O indicador deve exibir todos os eventos (tanto passados quanto futuros) a partir deste arquivo na forma de linhas verticais com novos títulos.
- O indicador deve rastrear a atualização dos eventos no recurso externo.
Depois de termos especificado a tarefa, podemos analisar alguns detalhes técnicos.
Parte técnica
Vamos utilizar o website http://www.dailyfx.com/calendar/ como uma fonte externa de pesquisa. A conveniência deste recurso é que ele permite o download de um calendário com extensão .csv, portanto, evitamos dificuldades de trabalhar com arquivos html. Aqui está um link de novidades para a semana em curso: http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv.
Agora trataremos sobre o processo de download do arquivo da Internet. Isso pode ser feito usando um programa bem conhecido, o GetRight. Ele pode ser baixado em: http://www.getright.com/get.html ou da lista de anexos deste artigo.

Escrever um indicador
Agora, tendo respondido algumas perguntas, podemos começar a escrever o 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);
Existem apenas duas variáveis externas: o endereço do recurso externo (na verdade, você não tem que mudar este parâmetro) e o endereço do programa GetRight (se você tiver baixado o programa em outro diretório, recomendo alterar o valor inicial no indicador de modo a não alterar o valor da variável constantemente no início do indicador). Para iniciar o arquivo GetRight.exe teremos de usar a função WinExec que pode ser importado da biblioteca Kernel32.dll. A biblioteca Time.mqh contém funções para trabalhar com GMT.
void DownloadCalendar() { Print("Downloading "+HtmlAdress+" to experts\files\html\Calendar.csv"); WinExec(GetrightAdress+" /URL:"+HtmlAdress+" /FILE:Calendar.csv /W /O",0); }
Como você pode ver, devido ao uso do programa GetRight a função de baixar o arquivo do recurso externo parece muito simples.O parâmetro /W indica que o processo não será devolvido para o programa a menos que o download do arquivo seja concluído. O parâmetro /O denota que, se houver um arquivo com o mesmo nome, ele será substituído. Lembre-se, se você tiver alterado as configurações do GetRight corretamente, o calendário será baixado para \arquivos\html\. E aqui estão duas funções adicionais:
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); }A função PerviousMonday() retorna a data de início da semana atual. O função ToDate() transfere a data e a hora do formato do calendário na data e hora.
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); }O principal procedimento GrabNews() abre o arquivo baixado \Html\Calendar.csv, lê todos os parâmetros de evento e cria dois objetos para cada novidade: uma linha vertical e um texto. O calendário de eventos é atualizado a 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); }
Conclusão
O artigo explica como exibir um calendário de eventos a partir de um recurso externo para uma área de trabalho na forma de linhas verticais. O indicador foi intencionalmente escrito sem quaisquer parâmetros excessivos como filtragem de novidades de acordo com sua relevância ou correspondência de um evento e do símbolo da janela atual.
Observação Eu gostaria de apontar para um erro na operação de calendário http://www.dailyfx.com/calendar/. Por favor, note que, por vezes eventos no arquivo .csv, do endereço http://www.dailyfx.com/calendar/Dailyfx_Global_Economic_Calendar.csv não são iguais aos da página http://www.dailyfx.com/calendar/. Isso pode acontecer com notícias divulgadas da 00:00 até 01:00 (GMT). No arquivo .csv tais notícias são indicadas 12 horas depois.
Também vale lembrar, que o indicador usa dll externo (kernel32.dll), por isso não se esqueça de habilitar o parâmetro correspondente nas configurações do indicador.
O arquivo CalendarArticle.mq4 deve ser armazenado na pasta \experts\indicadores. Time.mq4 deve ser armazenado em experts\biblioteca, Time.mqh - em experts\incluir.
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/1502





- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso