Discussão do artigo "Trabalhando com o tempo (Parte 2): funções" - página 4

 

A versão do DealingWithTime.mqh v. 1.01 do artigo Lidando com o Tempo (Parte 2): As Funções ( https://www.mql5.com/en/articles/9929 ) pararam de funcionar porque o MQ mudou o comportamento do CopyTime( ) funcionam algum tempo após a publicação deste artigo. Agora esta função não retorna mais valores de tempo futuro se forem maiores que TimeCurrent() especificado para os parâmetros start_time e/ou stop_time. Em vez disso, o tempo de abertura da última barra atual é retornado como o maior valor possível.

Uma vez que o final da sessão FX foi determinado desta forma para determinar o deslocamento de tempo do corretor, isso agora leva a valores incorretos!

Este cálculo foi alterado na versão 2.03. Esta versão já está disponível no CodeBase aqui: https://www.mql5.com/en/code/45287 .

Mas também o cálculo da mudança de horário foi completamente alterado, de modo que agora os tempos complicados da mudança de horário de Sydney (Austrália) de volta aos anos 70 são cobertos.

Anexa-se também a tabela DST 1975 - 2030.xlsx em arquivo zip com todas as mudanças de horário desde a década de 70 para que todos possam verificar o correto funcionamento das fórmulas, aqui está um exemplo de série da tabela:

1º de janeiro de 1982 é o horário padrão nos EUA (DST==0) e a próxima mudança será em 25 de abril de 1982, o último (25º do mês) domingo de abril (4). A tabela já está ordenada por fuso horário geográfico (coluna A), depois por fuso horário do ano (coluna L, spr=primavera, aut=outono,) e por fim por data de consulta (coluna C). A tabela pode ser criada automaticamente pelo EA incluído (um script não pode ser executado no modo de depuração). Test_DST 2.mq5 se você executá-lo no modo de depuração e copiar as linhas do log do diário no depurador e colá-las em uma planilha; O separador de células seria o espaço.

Além disso, agora existe uma nova e simples função SecTillClose() , que fornece o tempo restante em segundos (a moeda de tempo do MQ) até que o mercado forex seja fechado - sem CopyTime() . Isso é interessante para quem deseja fechar suas posições antes do final de semana ou não deseja abrir uma nova posição em um período definido antes do final de semana.

O indicador incluído DealingWithTime_TestIndi.mq5, como um comentário no gráfico, mostra não apenas o horário de verão na Europa, EUA e Austrália (Sydney), mas também o horário atual e a diferença de horário de várias cidades. Aqui você encontra uma tabela com diferentes horários locais das principais cidades para comparação: https://www.timeanddate.com/worldclock/ . Portanto, você pode verificar os valores a qualquer momento. Esse indicador também mostra como esses valores são determinados e usados (o que é subtraído ou adicionado do quê), facilitando o uso por conta própria - copie e cole, a forma mais rápida de programação.

As duas últimas linhas também mostram o último segundo da sessão FX atual e o tempo restante em horas (o que é mais fácil de julgar) e em segundos. Em Nova York, quando a sessão FX fecha às 17h00, horário local, em uma sexta-feira, não há nenhum bar válido aberto às 17h00, horário de Nova York. Portanto, nesta função, 1 segundo é subtraído para obter o último tempo de abertura válido da última barra no tempo do corretor. No entanto, alguns corretores encerram sua sessão FX alguns minutos antes, deixando de fornecer preços e não aceitando mais ordens de negociação.

Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

Tempo de processamento do artigo (Parte 2): A versão 1.01 da função DealingWithTime.mqh ( https://www.mql5.com/en/articles/9929 ) parou de funcionar porque o MQ alterou CopyTime() para funcionar algum tempo depois que este artigo foi publicado. Agora, a função não retorna mais o valor de tempo futuro se ele for maior que o TimeCurrent() especificado para os parâmetros start_time e/ou stop_time. Em vez disso, o tempo de abertura da última barra atual é retornado como o valor máximo possível.

Como o fim da sessão de FX é determinado dessa forma para determinar a compensação de tempo do corretor, isso agora resulta em um valor incorreto!

Esse cálculo foi alterado na versão 2.03. Essa versão já está disponível na base de código: https: //www.mql5.com/en/code/45287.

Além disso, o cálculo da mudança de horário foi completamente alterado, de modo que agora abrange o tempo complexo da mudança de horário de Sydney (Austrália) para a década de 1970.

Também está anexada como arquivo zip a tabela DST 1975 - 2030.xlsx com todas as mudanças de horário desde os anos 70, para que todos possam verificar se as fórmulas estão funcionando corretamente, e abaixo está uma série de amostra da tabela:

1º de janeiro de 1982 está no horário padrão dos EUA (DST==0) e a próxima mudança será em 25 de abril de 1982, o último (25º dia do mês) domingo (4) de abril. A tabela foi classificada por fuso horário geográfico (coluna A), depois por fuso horário anual (coluna L, spr=primavera, aut=outono) e, finalmente, por data de consulta (coluna C). A tabela pode ser criada automaticamente pelo EA incluído (o script não pode ser executado no modo de depuração). Test_DST 2.mq5 Se você executá-lo no modo de depuração, copie as linhas do registro do diário de bordo do depurador e cole-as na planilha; os separadores de célula são os espaços.

Além disso, agora há uma nova função simples SecTillClose() que fornece o tempo restante em segundos antes do fechamento do mercado forex (moeda de tempo do MQ) - não há necessidade de CopyTime(). Isso é interessante para quem deseja fechar uma posição antes do fim de semana ou não deseja abrir uma nova posição dentro do tempo especificado antes do fim de semana.

O indicador DealingWithTime_TestIndi.mq5 incluído como uma nota no gráfico mostra não apenas o horário de verão na Europa, nos EUA e na Austrália (Sydney), mas também a hora atual e a diferença de horário entre as cidades. Aqui você pode encontrar tabelas para comparação de diferentes horários locais nas principais cidades: https: //www.timeanddate.com/worldclock/. Assim, você pode verificar esses valores a qualquer momento. O indicador também mostra como determinar e usar esses valores (o que subtrair ou adicionar ao que), facilitando o uso por você mesmo - copiar e colar, que é a forma mais rápida de programação.

As duas últimas linhas também mostram o último segundo da sessão atual do Forex, bem como o tempo restante em horas (mais fácil de avaliar) e segundos. Em Nova York, quando a sessão de Forex é encerrada às 17h, horário local, na sexta-feira, não há barras válidas abertas às 17h, horário de Nova York. Portanto, nessa função, subtraia 1 segundo para obter o último horário de abertura válido da última barra no horário da corretora. Entretanto, algumas corretoras fecham a negociação forex alguns minutos antes e não oferecem mais preços nem aceitam ordens de negociação.

Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

A versão do DealingWithTime.mqh v. 1.01 do artigo Dealing with Time (Parte 2): Functions ( https://www.mql5.com/pt/articles/9929 ) parou de funcionar porque o MQ alterou o comportamento de CopyTime( ) algum tempo depois que esse artigo foi publicado. Agora, essa função não retorna mais valores de tempo futuros se eles forem maiores do que o TimeCurrent( ) especificado para os parâmetros start_time e/ou stop_time. Em vez disso, ela retorna o valor máximo possível de tempo de abertura da última barra atual.

Como o fim da sessão de moeda foi definido de forma a determinar o deslocamento de tempo do corretor, isso agora resulta em valores incorretos!

Esse cálculo foi alterado na versão 2.03. Essa versão agora está disponível no CodeBase aqui: https://www.mql5.com/pt/code/45287.

Além disso, o cálculo de conversão de horário foi completamente alterado, de modo que os horários complexos de conversão de horário de Sydney, Austrália, até os anos 70, agora estão cobertos.

Também está anexada a tabela DST 1975 - 2030.xlsx como um arquivo zip com todas as alterações de horário desde os anos 70, para que todos possam verificar se as fórmulas estão funcionando corretamente:

1º de janeiro de 1982. - Horário padrão dos EUA (DST == 0), e a próxima alteração será em 25 de abril de 1982, o último domingo (25 do mês) de abril (4). A tabela já está classificada por fuso horário geográfico (coluna A), depois por fuso horário do ano (coluna L, spr=primavera, aut=outono) e, finalmente, pela data da consulta (coluna C). A planilha pode ser criada automaticamente pelo EA ativado (o script não pode ser executado no modo de depuração). Test_DST 2.mq5 se você executá-lo no modo de depuração e copiar as linhas de registro no depurador e colá-las na planilha; o separador de células será um espaço.

Além disso, agora há uma nova função simples SecTillClose(), que fornece o tempo restante em segundos (moeda de tempo MQ) até o fechamento do mercado forex - sem CopyTime(). Isso é interessante para aqueles que querem fechar suas posições antes do fim de semana ou não querem abrir uma nova posição em um determinado período antes do fim de semana.

O indicador incluído DealingWithTime_TestIndi.mq5, como um comentário no gráfico, mostra não apenas o horário de verão na Europa, nos EUA e na Austrália (Sydney), mas também a hora atual e a diferença de horário de diferentes cidades. Aqui você pode encontrar uma tabela com diferentes horários locais das principais cidades para comparação: https://www.timeanddate.com/worldclock/. Dessa forma, você pode verificar os valores a qualquer momento. Esse indicador também mostra como esses valores são definidos e usados (o que é subtraído ou adicionado de quê), o que facilita o uso por conta própria - copiar e colar, a forma mais rápida de programação.

As duas últimas linhas também mostram o último segundo da sessão de câmbio atual e o tempo restante em horas (o que é mais fácil de avaliar) e segundos. Em Nova York, quando a sessão de câmbio é encerrada às 17h00, horário local, na sexta-feira, não há nenhuma barra válida aberta às 17h00, horário de Nova York. Portanto, essa função subtrai 1 segundo para obter o último horário de abertura válido da última barra no horário da corretora. No entanto, alguns corretores encerram sua sessão de moeda alguns minutos antes, deixando de fornecer preços ou aceitar ordens de negociação.

Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

Olá @Anil Varma

Li a última postagem do autor @Carl Schreiber sobre a função CopyTime(), mas como estou achando mais compreensível a primeira versão, ainda estou usando o DealingWithTime.mqh v . 1.01.

Em meu indicador, quero fazer isso:

Atribua o tempo bruto de NY (segundos), a hora de NY e o minuto de NY a cada barra usando os seguintes buffers para exibi-los na janela de dados:
double NyRawTimeBuffer[];
double NyHourBuffer[];
double NyMinuteBuffer[];
 void AssignNyTime (const datetime& time[],int rates_total)
   {
      
      MqlDateTime dT_struc;
      
      //--- Atribuir a cada vela: NY raw Time (em segundos), NY hour, NY min
      ArraySetAsSeries(time,true);
      for(int z=0;z<rates_total;z++)
         { 
            checkTimeOffset(time[z]);                   // verificar alterações no horário de verão
            datetime tC, tGMT, tNY;
            tC    = time[z];
            tGMT  = time[z] + OffsetBroker.actOffset;   // GMT
            tNY   = tGMT - (NYShift+DST_USD);           // tempo em Nova York
            int j = int (tNY);                          // conversão de datetime em int 
            NyRawTimeBuffer[z]=j;
            
            TimeToStruct(tNY,dT_struc);
            NyHourBuffer[z]=dT_struc.hour;
            NyMinuteBuffer[z]=dT_struc.min;
 
         }        
       
   return;
   }

A função funciona apenas quando o gráfico de timeframe em que o terminal começa está definido como H1.

Se eu fechar o terminal e o período de tempo estiver definido como, por exemplo, M5, e depois reiniciar o terminal, ocorrerá o seguinte erro:

2024.02.18 15:33:38.048 MyFractals_V4 (EURUSD,M5) 240: CopyTime() FAILED for EURUSD H1: precisa de horários a partir de 2024.02.12 02:00:00, mas há apenas a partir de 1970.01.01 00:00:00 erro: 4401

Você já me sugeriu, por meio de mensagem, usar a função CheckLoadHistory() deste artigo ( https://www.mql5.com/pt/code/1251 ) e colocá-la antes da função CopyXXXX() em sua biblioteca:

//--- encontrar o deslocamento do corretor
    OffsetBroker.set = false;
    
    CheckLoadHistory("EURUSD",PERIOD_H1,TERMINAL_MAXBARS,true);
      
    b = CopyTime("EURUSD",PERIOD_H1,BegWk+26*3600,5,arrTme);      // obtém o tempo da última barra de 1h antes da troca na UE

Mas o problema ainda persiste.

No checkhistory.mqh (linha 19), observei o seguinte comentário, mas não entendo se isso pode ser um problema. Tentei comentá-lo e testar o programa novamente, mas não funcionou.

//--- não solicite o carregamento de seus próprios dados se for um indicador
   if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol) return(true);

Existe alguma maneira de ajustar o erro sem mudar para a biblioteca atualizada DealingWithTimeV2.03.mqh sem reescrever todo o código?




CheckHistory - Check and load history function
CheckHistory - Check and load history function
  • www.mql5.com
Slightly modified history load function from MetaQuotes.
 
Nauris Zukas testador de estratégia, mas não funciona.


A alternativa "The Alternative using it via Input Variables" é a única maneira de obter os tempos corretos no testador de estratégias?

Hi

Tentei modificar o código conforme abaixo e, até o momento, está funcionando para mim. Observe que converti a classe com construtores e todos os métodos fazem parte da classe. A classe precisa ser chamada e inicializada em sua classe EA/Estratégia.

CDealWithTime.OnTick() deve ser colocado em EA/Strategy OnTick()

//+-----------------------------------------------------------------------------------------------------------------------------+
//| função para determinar o deslocamento do corretor para o tempo fornecido (tB)
//+-----------------------------------------------------------------------------------------------------------------------------+
void CDealWithTime::OnTick(void) {

                string vMethod = __FUNCTION__ + " Line[" + (string)__LINE__ + "] ";

                // Realizar atualização horária de TimeH01[]
                if(IsNewBarH01()) {
      // ... BegWk = BoW(tC), Código original
                        datetime weekBegin = BoW(TimeCurrent());
                        // O código original adicionou 5 barras ao WeakBegin Time.
                        // A adição de 5 dias * 3600 secondsInHour à hora de início fraca não é igual a cinco barras, pois pode não haver barras em
                        // fim de semana/feriado. Portanto, WeekBegin+5*3600 pode resultar em um horário sem que haja uma barra nele.
                        int                      barShift  = iBarShift(mSymbol,mTimeFrame,weekBegin+(5*3600));
                        // Retornará a primeira barra disponível em Time(weekBegin+(5*3600)
                        datetime timeStop        = iTime(mSymbol,mTimeFrame,barShift);          // Última barra de uma hora de sexta-feira, antes da troca na UE.
                        // Resultado quando os segundos são adicionados (weekBegin)+(5*3600): CDealWithTime::OnTick Line[229] : GetLastError[0] copiedTime EURUSD-PERIOD_H1 for [0] bars weekBegin[2024.01.01 02:00] to timeStop[2023.12.31 21:00] time5th[2023.12.29 23:00]
                        int bars = Bars(mSymbol,mTimeFrame,weekBegin,timeStop);

                        // Precisamos de while..loop, pois IsNewBarH01() será verificado apenas uma vez no Tick, se verdadeiro, até a próxima barra nova, nenhuma verificação adicional
                        ResetLastError();
                        int attempt = 0;
                        while(CopyTime(mSymbol,mTimeFrame,weekBegin,timeStop,TimeH01) != bars && attempt <= 10) {
                                Sleep(100);
                                attempt++;
                        }
                        if(attempt > 0) {
                                PrintFormat("%s: GetLastError[%i] copiedTime %s-%s for [%i] bars weekBegin[%s] to timeStop[%i][%s]",vMethod,GetLastError(),mSymbol,EnumToString(mTimeFrame),bars,TimeToString(weekBegin),barShift,TimeToString(timeStop));
                        }
                }

                // Realizar uma verificação semanal, se houver alteração no horário de verão (DST)
                if(IsNewBarW01()) {
                        checkTimeOffset(TimeCurrent());
                        int  attempt  = 0;
                        bool isOffset = false;
                        do{
                                isOffset = setBokerOffset();
                                attempt++;
                        } while(!isOffset && attempt <= 10);
                }

} // Fim do OnTick()
 
amrali #:

Esse código calcula o horário de verão automaticamente para corretores europeus e norte-americanos:

https://www.mql5.com/pt/code/27860

O código acima foi usado no Forex Market Hours https://www.mql5.com/pt/code/27771 para calcular as alterações no horário de verão.

Funções semelhantes podem ser criadas para diferentes áreas do mundo.

Olá, Amrali

Código simples e agradável como alternativa ao artigo DealingWithTime v2.03. Vou dar uma olhada nele para um estudo mais detalhado.

 
Daniel K #:
DealingWithTime.mqh v . 1.01.

Oi Daniel

DealingWithTime.mqh v . 1.01. Esse artigo e seu código não funcionam mais devido a alterações nos métodos de cálculo MQL, conforme explicado por Carl no artigo DealingWithTime.mqh v 2.03 https://www.mql5.com/pt/code/45287

Você não deveria usá-lo de forma alguma.

Dealing with time (2) functions
  • www.mql5.com
Calculate DST for USA, EUR, AUD and RUB and the offset time of the broker automatically from the 70's until 2030 - even in the Strategy Tester of MQ.