Assista a como baixar robôs de negociação gratuitos
Encontre-nos em Telegram!
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
Visualizações:
203
Avaliação:
(7)
Publicado:
Freelance MQL5 Precisa de um robô ou indicador baseado nesse código? Solicite-o no Freelance Ir para Freelance

Esse script apresenta a função TimeServerDaylightSavings() que está faltando entre as funções incorporadas, que fornecem apenas TimeDaylightSavings() para o computador local. Além disso, o arquivo mqh de cabeçalho anexado inclui algumas outras funções úteis relacionadas ao horário do servidor, permitindo, em particular, que você saiba se o seu corretor usa o horário de verão em geral.

Tudo isso é baseado na análise empírica do histórico de cotações de sua corretora. Toda a ideia é descrita no livro de algotrading na seção sobre horário de verão (DST). Em resumo, o método analisa as estatísticas dos horários de abertura da semana e deduz as compensações GMT da sua corretora. Dois máximos distintos nas estatísticas dos deslocamentos, se mapeados em horas adjacentes, provavelmente correspondem ao horário padrão ("inverno") e ao horário de verão ("verão").

Na verdade, esse script é uma versão refinada e ampliada do script apresentado no livro. Especificamente, as versões a partir de outubro de 2024 incluem uma importante correção de bug: os horários de abertura das negociações semanais são detectados pelo mercado dos EUA, que é afetado pelas mudanças de horário de verão de acordo com o fuso horário dos EUA (EST, UTC-5, horário padrão de inverno <--> EDT, UTC-4, horário de verão com horário de verão), por isso é importante eliminar o efeito do horário de verão dos EUA para obter um fluxo de horário natural contínuo durante todo o ano - foi isso que foi feito na correção. Todo o crédito vai para amrali.

Exemplo de mudanças de horário de abertura da semana nas cotações devido à mudança de horário de verão


Observe que, nos hemisférios norte e sul, os fusos horários são ajustados na direção oposta: no hemisfério norte, 1 hora é adicionada na "primavera" (março ou abril) e subtraída no "outono" (outubro ou novembro), enquanto no hemisfério sul é o contrário (porque todas as estações são trocadas).

Devido à especificidade da análise, é recomendável executar o código para o ticker Forex mais líquido, que geralmente é o EURUSD.

Aqui está a API:

// Fuso horário do servidor e informações atuais de DST
struct ServerTimeZone  // de acordo com a análise do histórico do horário de funcionamento semanal
{
   int offsetGMT;      // deslocamento de fuso horário em segundos em relação ao UTC/GMT para a semana atual
   int offsetDST;      // Correção de horário de verão em segundos (incluída em offsetGMT, conforme MQL5)
   bool supportDST;    // As alterações de horário de verão são detectadas nas cotações
};

// Estimativa do fuso horário do servidor e do modo DST a partir do histórico de cotações H1
ServerTimeZone TimeServerZone(
  const datetime srvtime = 0,     // por padrão, a hora atual, mas pode especificar um momento no passado
  const int threshold = THRESHOLD,
  const double lookupYears = 0.0, // por padrão, todas as barras disponíveis, caso contrário, 3 anos parecem suficientes
  const string symbol = NULL)     // por padrão, o símbolo do gráfico atual

// Estimativa da hora do servidor Correção do modo DST (em segundos)
int TimeServerDaylightSavings(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Estimativa do deslocamento do fuso horário do servidor (em segundos)
int TimeServerGMTOffsetHistory(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Estimativa se o servidor está habilitado para DST (verdadeiro/falso)
bool TimeServerDaylightSavingsSupported(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Análogo da função TimeGMTOffset() para o servidor de comércio, diferença em segundos
int TimeServerGMTOffset(); // TimeGMT() - TimeTradeServer()

As funções TimeServerDaylightSavings(), TimeServerGMTOffsetHistory(), TimeServerDaylightSavingsSupported() são apenas invólucros para TimeServerZone(), portanto, se você precisar de mais de uma característica, é preferível usar a última e ler os valores da estrutura ServerTimeZone.

Todas essas funções recebem um horário do servidor como primeiro argumento, no qual você deseja obter a característica correspondente (no presente ou no passado). Se a hora do servidor for deixada em 0 (por padrão), o resultado será retornado para o momento atual.

O limiar do segundo argumento permite que você ajuste a sensibilidade dos algoritmos. Por padrão, é 52/4, ou seja, um quarto do ano de estatísticas necessárias para a tomada de decisão (detecção de fuso horário sem a possível interferência de semanas curtas antes/depois de feriados). Por outro lado, essa configuração impede a detecção imediata de alterações ad hoc de fuso horário (caso seu corretor decida fazer isso em algum momento). Talvez você queira definir o limite como 0 para permitir que os algoritmos detectem quaisquer alterações o mais rápido possível.

A função TimeServerGMTOffset() não usa análise de histórico, mas calcula o deslocamento diretamente por meio de funções MQL5 (como TimeGMT() - TimeTradeServer()).

Observe que essa função usa a mesma notação de deslocamento que a função TimeGMTOffset() integrada do MQL5, ou seja, fusos horários positivos, como GMT+3, são indicados por deslocamentos negativos, como -10800, e vice-versa. Essa notação é usada por algumas outras linguagens de programação, como JaveScript, mas também há outras linguagens que indicam fusos horários positivos por deslocamentos positivos e fusos horários negativos por deslocamentos negativos. Verifique seus algoritmos cuidadosamente.

O script de teste gera todos os dados adquiridos no registro, por exemplo:

1 ~ Built-in functions ~
TimeLocal()=2024.10.05 00:39:01 / ok
TimeCurrent()=2024.10.05 00:38:59 / ok
TimeTradeServer()=2024.10.05 00:39:01 / ok
TimeGMT()=2024.10.04 21:39:01 / ok
TimeGMTOffset()=-10800 / ok
TimeDaylightSavings()=0 / ok
2 ~ Add-on over built-in functions ~
TimeServerGMTOffset()=-10800 / ok
3 ~ Estimation of server TZ with DST based on week opening hours in history ~
TimeServerDaylightSavings()=-3600 / ok
    [offsetGMT] [offsetDST] [supportDST]
[0]      -10800       -3600         true

Nesse caso, foi detectado que o servidor está atualmente no modo DST, enquanto o computador local não está.

Lembre-se de que os relógios do sistema do computador local e do servidor normalmente podem mostrar horários ligeiramente diferentes (segundos e até minutos), mesmo que estejam no mesmo fuso horário. Observe também que a função interna TimeTradeServer() retorna um datetime sintético: é a hora do servidor com precisão horária, mas herda frações intra-hora do relógio local. Isso é feito na MQL5 para simplificar as conversões entre fusos horários - TimeLocal(), TimeGMT() retornam no "formato local" também, e o horário do servidor de negociação.

Você pode ativar a impressão detalhada dos dados que estão sendo analisados por meio da diretiva de pré-processamento:

#define  PRINT_DST_DETAILS

que deve ser colocada em seu código antes da inclusão:

#include "TimeServerDST.mqh"

Aqui está um exemplo de detalhes no registro:

Got 20023 H1 bars, ~834 days
Week opening hours stats:
30  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 83 54  0
Time Zone changes (UTC±X before/after weekstart):
            [weekstart]    [before] [DSTb] [after] [DSTa]
[0] 2021.07.25 00:00:00 -2147483648  false      -1  false
[1] 2021.11.08 00:00:00           0   true       0  false
[2] 2022.03.14 00:00:00           0  false       0   true
[3] 2022.11.07 00:00:00           0   true       0  false
[4] 2023.03.13 00:00:00           0  false       0   true
[5] 2023.11.06 00:00:00           0   true       0  false
[6] 2024.03.11 00:00:00           0  false       2  false
3 different timezones detected in quotes, 1 DST candidates
Server time offset: UTC+2 STD
TimeServerDaylightSavings()=-3600 / ok

Fique à vontade para executar o script em seus ambientes e publicar os registros resultantes na discussão.


Atualizações

2024.10.10 - correção de bug: As mudanças de horário de verão dos EUA (que interferiam nas estatísticas de horário de funcionamento) são eliminadas da linha do tempo antes da análise principal.

2024.10.27 - O horário de interesse do servidor e o limite mínimo de estatísticas semanais foram adicionados como argumentos para todas as funções; TimeServerGMTOffsetEmpiric() foi renomeado para TimeServerGMTOffsetHistory().

2024.10.29 - Pequena correção de bug para incluir o tempo solicitado no período de pesquisa.

2024.10.30 - Corrigido o DST no array TimeZoneChange; a pesquisa agora é realizada a partir do parâmetro srvtime, se ele for especificado.

2024.11.01 - Adicionado um ajuste automático de cálculos quando aplicado a metais preciosos, o que pode fornecer resultados mais confiáveis nas semanas em que os horários de horário de verão dos EUA e da UE estão fora de sincronia.

2024.11.04 - Detecção on-line refinada da ativação/desativação do horário de verão.

2024.11.07 - Adicionado o armazenamento em cache das alterações de fuso horário/horário de verão para solicitações em massa no histórico de backtesting de indicadores ou eventos econômicos.

2024.11.08 - O desempenho do cache foi otimizado por meio de uma pequena refatoração de código.

2024.11.16 - Ajuste de 1 hora para registros de data e hora deduzidos de metais por amrali.

2024.11.17 - refatoração e correções feitas por amrali: eliminação de reconstruções de cache para solicitações online durante os fins de semana, 48h de antecedência adicionada para detecção de alterações de TZ durante os fins de semana (com possível transição de DST), domingo às 00:00 é usado como limite para fusos horários (em vez da primeira barra de uma semana).

2024.11.20 - Limite padrão alterado para 1 (um equilíbrio entre a detecção imediata de alterações de fuso horário e a eliminação de falsos positivos em semanas fora do padrão, como após feriados); novo conjunto de funções adicionado para formatação de horário, incluindo deslocamentos de fuso horário e DST (consulte TimeZoneFmt.mqh); outros pequenos refinamentos.




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

Simplest Logger class for MetaTrader 5 Simplest Logger class for MetaTrader 5

A classe mais simples para registro no MetaTrader 5 com suporte para níveis, formato de mensagem, filtros de inclusão e exclusão em substrings.

Ascending Sort A Struct Array By A Field Example Ascending Sort A Struct Array By A Field Example

Este é um exemplo de classificação ascendente de uma lista de estruturas por um campo. Você pode descobrir e personalizar o algoritmo acima, dependendo da finalidade de uso. Este é o exemplo mais básico e também uma direção para resolver o arranjo em uma matriz de estrutura. O algoritmo usado neste exemplo é o Quick Sort e o Merge Sort.

Custom crosshair cursor with synchronization Custom crosshair cursor with synchronization

Indicador de mira personalizado sincronizado que mostra o preço e a hora (servidor/local).

Perfect Seconds Chart Perfect Seconds Chart

O indicador gráfico Perfect Seconds permite que você converta velas de minutos de dados ao vivo em segundos. 1. Escolha qualquer número de segundos para fechar uma barra com tempo exato. 2. Trata-se de dados baseados em taxas OHLC ao vivo. Funciona mesmo que os ticks não estejam disponíveis. 3. Não requer DLL externa, funciona sem problemas em VPS. 4. Código rápido e otimizado 5. Suporta pares de criptomoedas, como BInance, Kucoin e todas as outras bolsas em que o gráfico ao vivo de futuros pode ser convertido em segundos facilmente. 6. Suporte a todos os tipos de símbolos, como pares de ouro e Forex. 7. Opções para excluir símbolos e taxas.