
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
Aviso: Todos os direitos sobre esses materiais pertencem à MetaQuotes Ltd. É proibida a reimpressão total ou parcial.
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.





- 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