Erros, bugs, perguntas - página 2180

 
Nikolai Semko:

Claramente, zero.

Pode demorar 22 segundos a decidir que não existem barras zero num determinado período de tempo?

Claramente um bug algorítmico na implementação interna das Barras.

E não compreendo como se distingue entre zero barras num determinado período de tempo e este zero:

A partir da documentação: Se os dados para uma série de tempos com parâmetros especificados ao chamar a função Bars() ainda não forem gerados no terminal, ou se os dados da série de tempos não estiverem sincronizados com o servidor de comércio no momento da chamada da função, a função retornará o valor zero.

Por outras palavras, como posso distinguir entre um resultado nulo e um erro nulo?
 
A100:

E não compreendo como se distingue entre zero barras num determinado período de tempo e este zero:

Da documentação: Se os dados para uma série de tempos com parâmetros especificados quando a função Bars() é chamada ainda não tiver sido gerada no terminal, ou se os dados da série de tempos não estiverem sincronizados com o servidor de comércio no momento em que a função é chamada, a função retornará zero.

A origem do zero não é importante nesta questão, o que é importante é que este zero nasça para sempre pela função das Barras sob a forma de um par de dezenas de segundos.

 
A100:

O que não compreendo é como se distingue entre zero barras num determinado período de tempo e este zero:

A partir da documentação: Se os dados para uma série de tempos com parâmetros especificados ao chamar a função Bars() ainda não tiverem sido gerados no terminal, ou se os dados da série de tempos no momento da chamada da função não estiverem sincronizados com o servidor da troca, a função retornará zero.

Por outras palavras, como posso distinguir entre um resultado nulo e um erro nulo?

Pense sobre isso. Se tivesse a tarefa de criar um análogo da função Barras e lhe fosse atribuída uma data/hora de matriz, os valores de cujos elementos diminuem com o aumento do número, por outras palavras, a matriz é ordenada.

Acha que seria difícil implementar um algoritmo de procura do número de elementos de uma tal matriz ordenada num dado intervalo de tempo? E se não houver uma única barra no intervalo de tempo dado ou se a matriz ainda não tiver sido inicializada, devemos devolver zero.

Não - o algoritmo é suficientemente simples. O que pode funcionar durante 22 segundos?

 
Nikolai Semko:

Nesta questão, a origem do zero não é importante, o que é importante é que este zero nasça pela função das Barras durante idades, sob a forma de um par de dezenas de segundos.

Precisamente a origem é importante, porque se ::Bars() retornassem -1 em vez de 0 (como agora) em caso de erro histórico, não teríamos qualquer atraso. Mas agora 0 é interpretado como um erro e o atraso é devido a repetições internas https://www.mql5.com/ru/forum/1111/page2200#comment_6955559

Além disso, suponha-se que introduzimos uma verificação adicional e o atraso desaparece. Então o que aconteceu? Têm zero. Será isto um resultado ou um erro?

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.03.31
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
Vitaly Muzichenko:

Isto deve-se muito provavelmente ao carregamento histórico

Portanto, o engraçado é que a primeira impressão é processada sem demora, ou seja, a história por H4 já está carregada.

E se mudar CopyTime H4 para W1, não haverá qualquer atraso. Isto significa que a história para W1 também já está carregada.

É que as Barras ficam inibidas por intervalo de tempo entre o TempoCorrente() e o tempo de abertura da barra zero.

 
A100:

É a origem que importa, porque se ::Bars() retornasse -1 em vez de 0 (como agora) em caso de erro histórico, não haveria qualquer atraso. Mas agora 0 é interpretado como um erro e o atraso ocorre devido a repetições internas https://www.mql5.com/ru/forum/1111/page2200#comment_6955559.

Além disso, suponha-se que foi introduzida uma verificação adicional e que o atraso desapareceu. Então o que aconteceu? Têm zero. Será isto um resultado ou um erro?

Não importa em todos os meus algoritmos se o resultado de zero é uma barra que não bate no intervalo dado ou a ausência de matriz como tal.

Está a afastar-se do problema.

 
Nikolai Semko:

Está a afastar o problema.

Estou a afirmar a essência do problema, estás fixado no teu caso particular. A julgar pelo seu posto anterior, ainda não compreende quando ocorre um atraso (que é para além da causa), embora a página anterior explique tudo em pormenor.

Talvez este guião o possa ajudar a compreender

void OnStart()
{
        Print( "begin" );
        ::Bars( _Symbol, PERIOD_W1, D'2018.03.20', D'2018.03.23' );
        Print( "end" );
}
 
A100:
Estou a afirmar a essência do problema, enquanto o senhor se concentra no seu caso particular. A julgar pela sua mensagem anterior, ainda não compreende quando ocorre um atraso (isto é para além da razão), embora a página anterior a explique em pormenor.

Já formulei acima a minha opinião sobre quando é que o atraso ocorre.

Mais uma vez:
As barras desligam-se se a hora de início_de_início estiver no intervalo desde a hora de abertura da barra zero do TF solicitado até ao TimeCurrent(). (Apenas uma hipótese, mas verificada na prática)
Sim, o erro ocorre num caso especial. Mas os casos privados não devem estar em funções padrão de linguagem de programação integrada.

E o seu "ponto" não é o ponto, porque está simplesmente a citar a referência de comando das Barras, com a qual estou perfeitamente familiarizado. Não há código de erro na função Bars porque não é necessário.

Tanto mais que, neste caso, lidamos com matrizes de séries temporais totalmente formadas.

Isto pode ser claramente visto no código ligeiramente modificado do meu guião:

void OnStart()
  {
   datetime Arr[];
   if(CopyTime(_Symbol,PERIOD_W1,0,1,Arr)<0) Print("Ошибка");
   Print("Время открытия нулевого бара W1 = "+TimeToString(Arr[0]));
   ArraySetAsSeries(Arr,true);
   if(CopyTime(_Symbol,PERIOD_H4,0,100,Arr)<0) Print("Ошибка");
   Print("1 "+"CurrentTime = "+TimeToString(TimeCurrent()));
   int Res=Bars(_Symbol,PERIOD_W1,Arr[99],TimeCurrent());  // выполняется быстро   
   Print("2 Время открытия 99 бара H4 = "+TimeToString(Arr[99])+"  Номер бара W1= " +IntegerToString(Res)); 
   Res=Bars(_Symbol,PERIOD_W1,Arr[0],TimeCurrent());       // выполнение происходит более 10 секунд!!!   
   Print("3 Время нулевого бара H4 = "+TimeToString(Arr[0])+"  Номер бара W1= " +IntegerToString(Res));
  }

Resultado:

2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     Время открытия нулевого бара W1 = 2018.03.25 00:00
2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     1 CurrentTime = 2018.03.30 23:54
2018.03.30 23:39:31.079 BagBars (EURUSD,H4)     2 Время открытия 99 бара H4 = 2018.03.08 20:00  Номер бара W1= 3
2018.03.30 23:39:47.176 BagBars (EURUSD,H4)     3 Время нулевого бара H4 = 2018.03.30 20:00  Номер бара W1= 0
 
A100:

Talvez este guião ajude a compreender

O seu guião demonstra este problema - enforcamento.

porque o intervalo de tempo start_time - stop_time está dentro do bar semanal.

Se sair do bar semanal, então não há congelamento:

Bars( _Symbol, PERIOD_W1, D'2018.03.12', D'2018.03.23' );

Obrigado pelo exemplo mais claro

 

No MT4 CopyHigh, as funções CopyLow (não olhou para as outras) causaram um erro crítico quando não havia historial no testador. A EA foi testada em H1 e o pedido foi da M1

1 15:14:35.410 2017.01.04 19:54:24  Access violation read to 0x0A971FE8 in 'C:\Users\Halyna\AppData\Roaming\MetaQuotes\Terminal\287469DEA9630EA94D0715D755974F1B\MQL4\Experts\____________.ex4'

3 15:14:35.465 2017.01.04 19:54:24 Os testes foram interrompidos devido a um erro crítico na EA

Razão: