Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Twitter!
Participe de nossa página de fãs
Script interessante?
Coloque um link para ele, e permita que outras pessoas também o avaliem
Você gostou do script?
Avalie seu funcionamento no terminal MetaTrader 5
Bibliotecas

TimeGMT library for the strategy tester - biblioteca para MetaTrader 5

Visualizações:
59
Avaliação:
(16)
Publicado:
Freelance MQL5 Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Função TimeGMT()

Retorna o GMT, que é calculado levando em conta a mudança de horário de verão pela hora local no computador em que o terminal do cliente está sendo executado. Há duas variantes da função.

Chamada sem parâmetros

datetime  TimeGMT();

Chamada com parâmetro do tipo MqlDateTime

datetime  TimeGMT(
   MqlDateTime&  dt_struct      // Variável do tipo de estrutura
   );

No entanto, durante o teste no testador de estratégia,TimeGMT() é sempre igual ao horário do servidor simulado por TimeTradeServer().



Biblioteca TimeGMT

Essa biblioteca corrigirá a função TimeGMT() para fornecer o verdadeiro GMT durante os testes no testador de estratégias. A biblioteca instalará ganchos globais de API (por meio de substituição de macro) para as duas versões do TimeGMT.

class CTimeGMT
  {
public:
   static datetime   TimeGMT(void);
   static datetime   TimeGMT(MqlDateTime &dt_struct);
  }

Uso:

Antes de testar um consultor especialista que usa filtro de notícias ou qualquer restrição de tempo no testador de estratégias, basta incluir essa linha no início do código e, em seguida, recompilar o código-fonte no MetaEditor.

#include "TimeGMT.mqh"

- Opcionalmente, para ver as mensagens de depuração, adicione esta linha antes da diretiva #include:

#define  PRINT_GMT_DETAILS

Nenhuma outra modificação ou qualquer chamada de função é necessária para o consultor especialista ou indicador.

  • O TimeGMT é corrigido somente se o testador de estratégia for detectado.
  • A correção funciona no símbolo selecionado no testador de estratégia.
  • Nenhum erro de cálculo durante os finais de semana ou feriados de Natal.
  • Baixa sobrecarga e tempo de cálculo rápido no testador de estratégias

O recálculo do deslocamento do corretor ocorre somente no início do consultor especialista e todos os domingos e segundas-feiras à meia-noite. O deslocamento do corretor calculado será armazenado em cache na memória e será usado para chamadas subsequentes ao TimeGMT.

Seleção do símbolo para estimativa da TZ/DST do servidor

Por padrão, a biblioteca buscará e carregará o símbolo XAUUSD para estimar o deslocamento do fuso horário do servidor. O XAUUSD pode fornecer resultados mais confiáveis (especialmente para corretoras que seguem o horário de horário de verão da UE ) nas semanas em que os horários de horário de verão dos EUA e da UE estão fora de sincronia (março e final de outubro). Opcionalmente, se a sua corretora seguir o horário de verão dos EUA ou não seguir nenhum horário, o uso do símbolo do gráfico também é adequado. Chame CTimeGMT::SetUsingGoldSymbol() com 'false' para usar o símbolo do gráfico atual, em vez do XAUUSD.

Para determinar a programação de luz do dia (DST) de sua corretora, você pode usar este script https://www.mql5.com/pt/code/48650

//+------------------------------------------------------------------+
//| Define a opção de usar o símbolo XAUUSD (ouro) para estimar a taxa de câmbio.
//| TZ/DST do servidor por meio da análise do histórico de cotações H1.
//| TRUE : busca e carrega o símbolo Gold (comportamento padrão).
//| FALSE: usa o símbolo do gráfico atual.
//+------------------------------------------------------------------+
void CTimeGMT::SetUsingGoldSymbol(const bool enabled = true);

Observação:

Como efeito colateral, o XAUUSD começa uma hora depois do Forex, portanto, as trocas de horário de verão ocorrerão uma hora depois no testador de estratégia.



TimeGMT_TestEA

Para explorar a biblioteca no testador de estratégia, um consultor especialista de demonstração é testado no testador de estratégia


Estes são os resultados da execução do consultor especialista no testador de estratégia:

AUDUSD,M1 (ICMarketsSC-Demo): 1 minutes OHLC ticks generating
AUDUSD,M1: testing of Experts\TimeGMT_TestEA.ex5 from 2023.03.05 00:00 to 2023.05.01 00:00 started with inputs:
  timer_hours=24
2023.03.05 00:00:00   TimeCurrent() = Sun, 2023.03.05 00:00:00  | TimeTradeServer() = Sun, 2023.03.05 00:00:00  | TimeGMT() = Sat, 2023.03.04 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.06 00:00:00   TimeCurrent() = Mon, 2023.03.06 00:00:00  | TimeTradeServer() = Mon, 2023.03.06 00:00:00  | TimeGMT() = Sun, 2023.03.05 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.07 00:00:00   TimeCurrent() = Tue, 2023.03.07 00:00:00  | TimeTradeServer() = Tue, 2023.03.07 00:00:00  | TimeGMT() = Mon, 2023.03.06 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.08 00:00:00   TimeCurrent() = Wed, 2023.03.08 00:00:00  | TimeTradeServer() = Wed, 2023.03.08 00:00:00  | TimeGMT() = Tue, 2023.03.07 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.09 00:00:00   TimeCurrent() = Thu, 2023.03.09 00:00:00  | TimeTradeServer() = Thu, 2023.03.09 00:00:00  | TimeGMT() = Wed, 2023.03.08 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.10 00:00:00   TimeCurrent() = Fri, 2023.03.10 00:00:00  | TimeTradeServer() = Fri, 2023.03.10 00:00:00  | TimeGMT() = Thu, 2023.03.09 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.11 00:00:00   TimeCurrent() = Fri, 2023.03.10 23:56:59  | TimeTradeServer() = Sat, 2023.03.11 00:00:00  | TimeGMT() = Fri, 2023.03.10 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.12 00:00:00   TimeCurrent() = Fri, 2023.03.10 23:56:59  | TimeTradeServer() = Sun, 2023.03.12 00:00:00  | TimeGMT() = Sat, 2023.03.11 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.13 00:00:00   TimeCurrent() = Mon, 2023.03.13 00:00:00  | TimeTradeServer() = Mon, 2023.03.13 00:00:00  | TimeGMT() = Sun, 2023.03.12 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.14 00:00:00   TimeCurrent() = Tue, 2023.03.14 00:00:00  | TimeTradeServer() = Tue, 2023.03.14 00:00:00  | TimeGMT() = Mon, 2023.03.13 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.15 00:00:00   TimeCurrent() = Wed, 2023.03.15 00:00:00  | TimeTradeServer() = Wed, 2023.03.15 00:00:00  | TimeGMT() = Tue, 2023.03.14 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.16 00:00:00   TimeCurrent() = Thu, 2023.03.16 00:00:00  | TimeTradeServer() = Thu, 2023.03.16 00:00:00  | TimeGMT() = Wed, 2023.03.15 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.17 00:00:00   TimeCurrent() = Fri, 2023.03.17 00:00:00  | TimeTradeServer() = Fri, 2023.03.17 00:00:00  | TimeGMT() = Thu, 2023.03.16 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.18 00:00:00   TimeCurrent() = Fri, 2023.03.17 23:56:59  | TimeTradeServer() = Sat, 2023.03.18 00:00:00  | TimeGMT() = Fri, 2023.03.17 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.19 00:00:00   TimeCurrent() = Fri, 2023.03.17 23:56:59  | TimeTradeServer() = Sun, 2023.03.19 00:00:00  | TimeGMT() = Sat, 2023.03.18 21:00:00 | BrokerOffset = 10800 (GMT+3)


Atualizações:

2024.03.30 - v.1.25: Corrigido o deslocamento GMT do corretor. Atualmente, a biblioteca verifica as barras H1 apenas no gráfico GOLD, pois ele tem os horários de início mais precisos.

2024.04.09 - v.1.33: Corrigido possível problema no cálculo do deslocamento do GMT da corretora durante os feriados de Natal em corretoras GMT+0.

2024.04.12 - v.1.35 : Foi corrigido um problema no cálculo do deslocamento do GMT da corretora em algumas corretoras que não oferecem negociação de ouro.

2024.07.07 - v.1.36 : Foi corrigido um problema na detecção adequada do símbolo GOLD em algumas corretoras.

2024.10.21 - v.1.40: Melhoria na detecção do símbolo GOLD com um fallback para o símbolo EURUSD.

2024.10.22 - v.1.45 : Determinação mais rápida do deslocamento do GMT do servidor durante o fim de semana no testador de estratégias.

2024.10.26 - v.1.47 : Adicionado melhor tratamento de erros e código de depuração. Renomeado o método HistoryBrokerOffset() para TimeServerGMTOffset().

2024.10.28 - v.1.49 : Convertidas todas as macros para lidar com o tempo em funções para evitar a avaliação dupla de parâmetros dentro do corpo da macro. Mais limpeza de código em outras linhas.

2024.10.30 - v.1.50: Corrigido o problema de estimativa incorreta do deslocamento GMT das cotações XAUEUR em algumas corretoras.

2024.11.23 - v.1.55: Adicionada uma opção para desativar o carregamento padrão do símbolo Gold para estimativa da TZ/DST do servidor. Chame CTimeGMT::SetUsingGoldSymbol() com 'false' para usar o símbolo do gráfico atual.

2024.12.12 - v.1.60: Melhor desempenho da função HistoryServerGMTOffset() e outras pequenas alterações de código.

2024.12.14 - v.1.61: Melhor desempenho da função FindSymbol().

2024.12.17 - v.1.62: Otimização adicional da função HistoryServerGMTOffset().

2024.12.24 - v.1.63: Corrigido problema potencial na função HistoryServerGMTOffset().



Fuso horário do corretor e horário de verão

O Tempo Médio de Greenwich (GMT), também chamado de Tempo Universal Coordenado (UTC), é usado como referência mundial oficial para o tempo. Você verá com frequência fusos horários representados como UTC - 3h ou GMT - 3h. Nesse exemplo, o (-3h) refere-se ao fato de o fuso horário estar três horas atrás do UTC ou GMT. UTC+3h ou GMT +3h se refere a esse fuso horário estar três horas à frente do UTC ou GMT. A diferença de horário entre nosso horário local e o GMT (UTC) é chamada de deslocamento do GMT.

O mercado Forex abre no domingo às 17h00, horário de Nova York (GMT-5h00 no inverno e GMT-4h00 no verão) e fecha na sexta-feira no mesmo horário. O horário de início do mercado Forex em NY, domingo, 17:00, corresponde a domingo, 22:00 UTC no inverno (e domingo, 21:00 UTC no verão). O Forex fecha na sexta-feira, às 22h UTC no inverno (e às 21h UTC no verão). O mercado spot de ouro e prata geralmente começa uma hora depois. link

Cada corretor forex tem seu fuso horário e horário de servidor. Portanto, o início da semana de negociação (velas H1) é variável entre as corretoras, e pode variar dedomingo, às 14h, horário do servidorpara corretoras em São Francisco (GMT-8), atésegunda-feira, às 9h, horário do servidorpara corretoras em Sydney (GMT+11). O final da semana de negociação também varia desexta-feira, às 14h, horário do servidor, atésábado, às 9h, horário do servidor.

Cada corretora é livre para escolher seu horário de verão (DST). E o horário de verão não é necessariamente o mesmo para esse fuso horário. Às vezes, eles misturam o uso de um fuso horário da UE e um horário de verão dos EUA em vez do horário de verão da UE. Para corretores que não seguem o horário dos EUA, o horário do servidor para o início (e o fim) da semana varia em +/- uma hora para o mesmo corretor ao longo do ano. Para lidar com essas variações, o recálculo da compensação da corretora deve ser feito semanalmente, para que as alterações de horário de verão na corretora possam ser detectadas a tempo.

Usar um fuso horário de +2 (e +3 no verão no horário dos EUA) significa, portanto, que os candles de cada semana começam à meia-noite de segunda-feira, e há cinco candles D1 por semana e o início de um candle diário (e H4) é o início de um novo dia de FX. Cada semana termina pouco antes da meia-noite de sábado. Não há velas no sábado e no domingo.Simplesmente, o horário nesses servidores está sempre 7 horas à frente de Nova York e é representado como NY+7. De longe, essa é a configuração mais comum, mas há muitas variações menos comuns.


Detalhes do cálculo do GMT verdadeiro

Quando uma chamada para TimeGMT() é interceptada pela biblioteca, ela primeiro verifica se não está sendo executada no testador de estratégia e, em seguida, retorna a função original. Se o testador de estratégia for detectado, o código começa a calcular o deslocamento do corretor (veja mais adiante) e o valor de retorno é simplesmente o resultado da subtração desse deslocamento da hora atual do servidor de negociação no terminal do cliente.

true GMT  = TimeTradeServer() - ServerGMTOffset (of the current trading week)

O próprio'ServerGMTOffset' pode ser estimado, pela análise do histórico de cotações H1, como a diferença entre dois horários conhecidos:

1) o horário em que a primeira barra da semana de negociação aparece no gráfico GOLD (FstBarWk),

2) o horário UTC correspondente para o horário de início das negociações do GOLD em Nova York, domingo, 18:00 .

ServerGMTOffset = FstBarWk - UTC (NY Sun, 18:00)  

O cálculo do BrokerOffset utiliza uma modificação otimizada do algoritmo que foi publicado por Carl Schreiber aqui em Dealing with time (2) functions


De acordo com https://www.timeanddate.com/time/change/usa/new-york

  • Em Nova York, o horário de verão começa às 02:00 da manhã, horário local, no segundo domingo de março. O relógio avançará em uma hora para GMT-4, portanto, o horário UTC correspondente para NY Sun, 18:00 é (Sun, 22:00 UTC).

  • Como o horário de verão termina (horário de inverno) em Nova York às 02:00, horário local, no primeiro domingo de novembro, o relógio se atrasará em uma hora para GMT-5, portanto, o horário UTC correspondente para NY Sun, 18:00 é (Sun, 23:00 UTC).

Por exemplo, se a FstBarWk no gráfico GOLD começar em Seg, 01:00, e for inverno em Nova York nessa barra, o BrokerOffset poderá ser calculado como:

ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 23:00 UTC) = 2 hours (GMT+2)

e, se for verão em Nova York, então BrokerOffset:

ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 22:00 UTC) = 3 hours (GMT+3)



Conversão das horas de sessão para o horário do servidor da corretora

Os operadores podem usar TimeGMT() para converter os horários de sessão para o horário do servidor correspondente para determinar quando mercados específicos abrirão ou fecharão. Por exemplo, se um operador quiser negociar na sessão asiática (Tóquio), ele deverá ajustar seus horários de negociação de acordo

1] Determinar o deslocamento do servidor de negociação da corretora

int ServerGMTOffset = TimeTradeServer() - TimeGMT();

    2] Converter os horários locais de mercados específicos para o horário do servidor da corretora correspondente

    datetime Server_time = Tokyo_time – Tokyo_GMTOffset + ServerGMTOffset

    O segundo termo da equação (xxx_GMTOffset) deve ser aumentado em +1 hora, se o fuso horário de destino estiver atualmente no horário de verão.

    Durante o teste no testador de estratégias, TimeGMT() é sempre igual ao horário do servidor simulado por TimeTradeServer() e, portanto, a conversão dos horários das sessões torna-se incorreta . Essa biblioteca corrigirá a função TimeGMT() para fornecer o GMT verdadeiro e, assim, os horários das sessões convertidas tornam-se precisos durante o teste no testador de estratégias.


    Traduzido do inglês pela MetaQuotes Ltd.
    Publicação original: https://www.mql5.com/en/code/48291

    Simple Bar Timer Simple Bar Timer

    É um script para exibir o tempo restante até a chegada da próxima barra.

    Funções de X para tempo, Y para preço e vice-versa Funções de X para tempo, Y para preço e vice-versa

    Funções para uso no lugar de ChartXYToTimePrice e ChartTimePriceToXY, funcionando correta e rapidamente em toda a faixa de parâmetros de entrada

    Statistical Zigzag Statistical Zigzag

    É um ziguezague que cria novos pontos de inflexão em ziguezague com base na ultrapassagem de um limite de volatilidade

    Historex: export the history of rates and ticks to CSV-files Historex: export the history of rates and ticks to CSV-files

    Esse é um script para exportar taxas e ticks do símbolo do gráfico atual para arquivos CSV compatíveis com o formato de exportação/importação do MT5.