Bug MQL5 quando se trabalha com acesso iClose/iOpen timeseries, etc.

 
Hi!
 

#property tester_everytick_calculate pode resolver problemas?

MQL5: Adicionada nova propriedade para indicadores personalizados #property tester_everytick_calculate. Ele é usado no testador de estratégia e permite forçar o cálculo de indicadores em cada tick.

25.Tester: Agora, durante os testes/optimização não-visuais, todos os indicadores utilizados (padrão e personalizados) são calculados apenas através da solicitação de dados. Uma exceção são os indicadores que contêm as chamadas da funçãoEventChartCustome usam o manipuladorOnTimer. Anteriormente, no testador de estratégia, quando qualquer tique vinha (mesmo de outro símbolo), todos os indicadores eram calculados incondicionalmente. Esta inovação acelerou muito os testes e a otimização.

Para forçar o cálculo dos indicadores a cada tick, adicione o #property tester_everytick_calculate ao programa.

Os indicadores compilados pelas versões anteriores do compilador, serão calculados como antes - a cada tick.
 

Também é sempre recomendado, se você trabalha com outro cronograma - então uma vez por minuto você precisa obter OHLC deste cronograma (qualquer função CopyXXXXXXXX).

Por isso, ele aparece - quando se trabalha com o cronograma de outra pessoa, não é necessário usar os atavismos iXXXXXX, mas usar as funções CopyXXXXXXXX.

 
Vladimir Karputov:

Também é sempre recomendado, se você trabalha com outro cronograma - então uma vez por minuto você precisa obter OHLC deste cronograma (qualquer função CopyXXXXXXXX).

Portanto, ao trabalhar com outro prazo - você não precisa usar atavismos iXXXXXX, mas deve usar as funções CopyXXXXXXXX.

Não é sério!

Por que então:iHigh(Símbolo(),TF,i);

P.S. Tudo funciona em mt4 sem problemas desde os primeiros dias de sua existência, por que não fazer o mesmo em mt5, para que não haja pandeiro? Se funcionar em mt4 - então é possível fazê-lo funcionar também em mt5
 
Vitaly Muzichenko:

Não é sério!

Por que então:iHigh(Símbolo(),TF,i);

P.S. No mt4 tudo funciona sem problemas desde os primeiros dias de sua existência, por que não fazer o mesmo no mt5, para que não haja pandeiro? Se funcionar em mt4 - significa que é possível fazê-lo funcionar também em mt5

Além disso, sempre foi recomendado, se você trabalha com outro cronograma - você tem que obter OHLC deste cronograma uma vez por minuto (qualquer função CopyXXXX). Este tem sido sempre o caso.

 
double high_k = NormalizeDouble(iHigh(Symbol(),TimeFrames, k),DigitsM);
double low_k = NormalizeDouble(iLow(Symbol(),TimeFrames, k),DigitsM);
double open_k = NormalizeDouble(iOpen(Symbol(),TimeFrames, k),DigitsM);
double close_k = NormalizeDouble(iClose(Symbol(),TimeFrames, k),DigitsM);

Tente atualizar as citações antes de fazê-lo através de RefreshRates.

 
Dmitry Fedorchenko:

Tente fazer citações refrescantes através de RefreshRates com antecedência.

"RefreshRates" é uma função inexistente.

 
Vladimir Karputov:

"RefreshRates" é uma função inexistente.

Eu estou prestes a
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinforefreshrates

Havia um problema semelhante somente na EA, isso me ajudou.

 
Farkhat Guzairov:
A versão MQL4 deste indicador funciona há mais de 2 anos e não foram encontrados tais problemas/erros.

Nenhum CopyXXX o ajudará. Este é um bug MT5 que começou com o build 30 e não foi corrigido desde o build 44. Leia as últimas 5-6 páginas dehttps://www.mql5.com/ru/forum/285631/page29 e você não estará sozinho.

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
  • 2018.11.13
  • www.mql5.com
26 октября 2018 года будет выпущена обновленная версия платформы MetaTrader 5...
 
Farkhat Guzairov:

Bom dia!

Atualmente estou transferindo indicadores previamente escritos da MQL4 para a MQL5. Eu não tenho dançado muito e tudo parece estar bem, mas....

Em algum momento os dados indicadores param de atualizar, não consegui descobrir exatamente onde estava o erro e somente por acidente notei que o iClose/iOpen, etc. param de atualizar, ou seja, retornam o mesmo valor.

O engraçado é que mesmo que eu recompile o código fonte o indicador não será atualizado corretamente, mas eu vejo que ele executa funções:

Somente se você abrir as propriedades do indicador e fechá-lo via "Ok", os dados são atualizados e exibidos corretamente, mas até certo ponto que pode ocorrer a qualquer momento (mas 100% acontece). Neste caso o indicador parou de atualizar os dados em 2018.11.14 00:00, em geral isso acontece após algum tempo regularmente.

Anteriormente foi revelado outro bug, a função iBars(Symbol(),TimeFrames)/Bars(Symbol(),TimeFrames) retorna valor zero. Felizmente, o bug não é uma constante, mas ainda ocorre e temos que controlá-lo.

Acontece que a MQ deixa de suportar a MQL4, o que é ótimo, mas a MQL5 terá esses bugs.

Então, como resolver o problema acima?

1) Meça o tempo de execução de um cálculo OnTick/OnCalculate em microssegundos e imprima-o em log.

Desta forma, você pode ver quanto tempo você gasta no cálculo do tick. Em seguida, estime quantos carrapatos a esta velocidade você pode calcular por segundo. Você provavelmente não encontrará mais do que uma dúzia de carrapatos, e receberá mais carrapatos por segundo.


2) Meça o tempo de cada OnCalculate em indicadores que estão anexados a gráficos / prazos, dos quais você extrai dados.

Provavelmente existe uma situação semelhante. Devido aos cálculos lentos, o terminal espera até que o símbolo calculado: timeframe seja desbloqueado. São os indicadores lentos, especialmente em uma história profunda, que levam ao congelamento dos payoffs dos gráficos de outras pessoas.


Ao desenvolver indicadores você deve colocar em primeiro lugar as questões de desempenho e os recálculos econômicos. Caso contrário, você vai matar tudo ao seu redor.

 
Renat Fatkhullin:

São os indicadores de frenagem, especialmente na história profunda, que provocam o congelamento dos gráficos de outras pessoas.

Então me diga por que o congelamento acontece comigo? Tenho um congelamento das saídas no OnTick antes da função de consulta dos indicadores. Isto é, a atualização do CopyTime por M1 atua como um gatilho que inicia o outro processamento no OnTick, mas antes do CopyTime não há funções ou interrogação do indicador.

E por que não havia tais problemas antes de construir 30 e tudo estava funcionando bem desde outubro de 2017?