English Русский 中文 Español Deutsch 日本語
Exibição de um novo calendário

Exibição de um novo calendário

MetaTrader 4Exemplos | 22 fevereiro 2016, 14:54
1 191 0
Slobodov Gleb
Slobodov Gleb

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:

Aqui está uma lista de requisitos para o indicador:
  • 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.

Depois de ter baixado o programa, configure o GetRight para baixar arquivos para um diretório necessário. Isto é o diretório arquivos\html na pasta de seu terminal de trading. Para fazer isso, pressione F8 e mude a escrita no campo conforme descrito abaixo:



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

Arquivos anexados |
getright_setup.zip (4763.33 KB)
Time.mq4 (2.03 KB)
Time.mqh (0.73 KB)
Linguagem MQL4 para Iniciantes. Indicadores personalizados (Parte 2) Linguagem MQL4 para Iniciantes. Indicadores personalizados (Parte 2)
Este é o quinto artigo da série "Linguagem MQL4 para Iniciantes". Hoje vamos aprender a usar objetos gráficos - uma ferramenta de desenvolvimento muito poderosa que permite aumentar substancialmente as possibilidades de utilização de indicadores. Além disso, eles podem ser usados em scripts e Expert Advisors. Vamos aprender a criar objetos, alterar seus parâmetros e verificar erros. Claro que eu não posso descrever em detalhes todos os objetos, há um monte deles. Mas você terá todo o conhecimento necessário para estudá-los. Este artigo também contém um guia de exemplo passo-a-passo de criação de um indicador de sinal complexo. Lá, muitos parâmetros serão ajustáveis, o que tornará possível alterar com facilidade a aparência do indicador.
Indicador Taichi - uma ideia simples de formalizar os valores do Ichimoku Kinko Hyo Indicador Taichi - uma ideia simples de formalizar os valores do Ichimoku Kinko Hyo
Dificuldades para interpretar os sinais Ichimoku? Este artigo apresenta alguns princípios de formalização de valores e sinais de Ichimoku Kinko Hyo. Para visualização de seu uso o autor escolheu o par de moedas EURUSD com base em suas próprias preferências. No entanto, o indicador pode ser usado em qualquer par de moedas.
Modelagem de Apostas como meio de desenvolver "Intuição de Mercado" Modelagem de Apostas como meio de desenvolver "Intuição de Mercado"
O artigo trata sobre a noção de “intuição de mercado” e as formas de desenvolvê-la. O método descrito no artigo baseia-se na modelagem de apostas financeira na forma de um simples jogo.
Linguagem MQL4 para Iniciantes. Indicadores personalizados (Parte 1) Linguagem MQL4 para Iniciantes. Indicadores personalizados (Parte 1)
Este é o quarto artigo da série "Linguagem MQL4 para Iniciantes". Hoje aprenderemos a escrever indicadores personalizados. Iremos nos familiarizar com a classificação das características indicadoras, veremos como essas características influenciam o indicador, aprenderemos sobre novas funções e otimização, e, finalmente, escreveremos nossos próprios indicadores. Além disso, no final do artigo você vai encontrará dicas sobre o estilo de programação. Se este é o primeiro artigo "para iniciantes" que você está lendo, talvez seja melhor você ler os anteriores. Além disso, certifique-se que você tenha entendido corretamente o material anterior pois este artigo não explica o básico.