Zero Divide em dois indicadores em TF menores

 

Tenho dois indicadores apresentando o mesmo erro quando uso TF menores que 30m :


A linha de referência é esta :

E esta(que não diz nada por si só):


Este é o primeiro indicador : https://www.mql5.com/pt/code/591

E este é o segundo : https://www.mql5.com/pt/articles/6834?utm_campaign=articles.list&utm_medium=special&utm_source=mt5editor


Existe algo que possa fazer para consertar ambos? Obrigado!

 
Lucas Tavares:

Tenho dois indicadores apresentando o mesmo erro quando uso TF menores que 30m :


A linha de referência é esta :

E esta(que não diz nada por si só):


Este é o primeiro indicador : https://www.mql5.com/pt/code/591

E este é o segundo : https://www.mql5.com/pt/articles/6834?utm_campaign=articles.list&utm_medium=special&utm_source=mt5editor


Existe algo que possa fazer para consertar ambos? Obrigado!

Olá  Lucas Tavares, sem dúvida existe, e certamente algum dos valores dos divisores nas equações apresentadas está assumindo o valor 0 (zero), gerando um erro de exceção, típico de qualquer linguagem de programação uma vez que a divisão por 0 leva a um valor infinito e incerto, o que também, no caso de um trading systems, pode levar a perdas infinitas, se esse erro de programação se propagar ou tiver impacto inesperado em sua conta.
Aliás esse é o primeiro erro de grande risco previsto na lista que apresento no tópico https://www.mql5.com/pt/forum/23409
Dessa forma, recomendo não apenas para seu caso, mas para todo e qualquer programa, você testar antes se o valor do divisor é 0, evitando essa situação, exibindo um alerta, para permitir evitar a exceção e tratar o erro de programação, verificando a situação que isso está ocorrendo.
A linha 1725 até faz um teste, mas booleano, e recomendo testar no mínimo com a seguinte lógica:

if (resalt!=0) 
   {
     ...
   }
else 
   {
     Print("#Erro de tentativa de divisão por zero na linha 1725");
   }

Obs: estou assumindo aqui que sua potência pode assumir o valor zero (resultando em 1) ou até negativo, mas provavelmente o melhor teste seria maior que zero, nesse caso específico.
E para a linha 95 e todas as demais com algum divisor que possa assumir um valor zero recomendo fazer no mínimo o mesmo procedimento profilático.
Sds.,
Rogério Figurelli

Um checklist dos riscos dos robôs antes de operar em conta real
Um checklist dos riscos dos robôs antes de operar em conta real
  • 2014.04.23
  • www.mql5.com
A maior parte dos traders que operam com robôs, tanto no mercado Forex, como no mercado BM&FBovespa, geralmente focam apenas no lado bom, que é o p...
 
Entendo sua colocação, irei avaliar meu EA segundo seu outro post.
Mas estes indicadores são da database e de um artigo, funcionam perfeitamente para tf maiores.

Um deles até funcionava no meu mt5 em tf menores, mas passou a não funcionar. O que pode fazer isto acontecer?
 
Lucas Tavares:
Entendo sua colocação, irei avaliar meu EA segundo seu outro post.
Mas estes indicadores são da database e de um artigo, funcionam perfeitamente para tf maiores.

Um deles até funcionava no meu mt5 em tf menores, mas passou a não funcionar. O que pode fazer isto acontecer?

Olá  Lucas Tavares, são duas coisas diferentes: causa e efeito. As chances de estar dividindo por zero são altas. A causa disso, só investigando, mas minha maior suspeita é que você está com contratos, com tempo limitado, e provavelmente o indicador posiciona em zero nos momentos que não encontra preço para o ativo. Nesse caso, experimente fazer o mesmo teste nas séries contínuas, para ver se o problema continua acontecendo. E, mesmo que funcione, não esqueça de alterar o código, para não ter surpresas no futuro, em conta real.
Sds.,
Rogério Figurelli

 
Lucas Tavares:
Entendo sua colocação, irei avaliar meu EA segundo seu outro post.
Mas estes indicadores são da database e de um artigo, funcionam perfeitamente para tf maiores.

Um deles até funcionava no meu mt5 em tf menores, mas passou a não funcionar. O que pode fazer isto acontecer?

o SmoothAlgorithms não é da MetaQuotes, portanto você fica à mercê do nível de programação do autor da Lib... O cara é bom, já li vários códigos dele no passado...

Agora, SE antes funcionava e agora não, algo mudou nesse meio de caminho, e que pode ser alguma parte interna do Metatrader na hora de interpretar valores, já que o SmoothAlgorithms não é atualizado a um bom tempo...

Já que não temos acesso - pelo menos eu procurei e não encontrei - de um changelog completo e descritivo do que mudou em cada Release do MT5, você também fica à mercê dos comportamentos bizarros que vêm goela abaixo nos updates da Metaquotes...

Junte isso à bizarrice do MT5 tratar um dado NULL como se fosse de valor 0 (zero), qualquer pedaço de código pode disparar exceções desnecessariamente bizarras... Isto sem contar que um EMPTY_VALUE é um "value"... vai entender...

Sugiro você tratar qualquer chance de valores ZERO antes de usar qualquer interface do MQL5, principalmente de terceiros...


;)

 
Esse é um erro comum no código. Simples, faça um bloco IF == 0 or NULL para proteger o código em caso de divisão por 0.
 
Flavio Jarabeck:

o SmoothAlgorithms não é da MetaQuotes, portanto você fica à mercê do nível de programação do autor da Lib... O cara é bom, já li vários códigos dele no passado...

Agora, SE antes funcionava e agora não, algo mudou nesse meio de caminho, e que pode ser alguma parte interna do Metatrader na hora de interpretar valores, já que o SmoothAlgorithms não é atualizado a um bom tempo...

Já que não temos acesso - pelo menos eu procurei e não encontrei - de um changelog completo e descritivo do que mudou em cada Release do MT5, você também fica à mercê dos comportamentos bizarros que vêm goela abaixo nos updates da Metaquotes...

Junte isso à bizarrice do MT5 tratar um dado NULL como se fosse de valor 0 (zero), qualquer pedaço de código pode disparar exceções desnecessariamente bizarras... Isto sem contar que um EMPTY_VALUE é um "value"... vai entender...

Sugiro você tratar qualquer chance de valores ZERO antes de usar qualquer interface do MQL5, principalmente de terceiros...


;)

Olá  Flavio Jarabeck, na verdade, em relação aos updates, existe um problema maior, em outro nível, que é o fato de o MQL não tratar exceções, o que aumenta o risco para códigos que não fazem essa prevenção, como comentei anteriormente.
Sds.,
Rogério Figurelli

 
Nelson Silva:
Esse é um erro comum no código. Simples, faça um bloco IF == 0 or NULL para proteger o código em caso de divisão por 0.

Olá  Nelson Silva, obrigado por compartilhar mas, apenas para não ficar redundante, acredito que você não leu todo conteúdo, pois essa solução já foi apresentada acima, inclusive com um exemplo didático.
Sds.,
Rogério Figurelli

 

Regra de ouro, não só para MQL5, mas para programação em geral:

- SEMPRE que houver uma divisão, a menos que vc de alguma forma tenha certeza absoluta de que o denominador nunca vai ser zero, vc deve verificar a possibilidade de o denominador ser zero (e fazer o tratamento adequado caso seja) ANTES de efetuar a divisão.

 
Rogerio Figurelli:

Olá  Flavio Jarabeck, na verdade, em relação aos updates, existe um problema maior, em outro nível, que é o fato de o MQL não tratar exceções, o que aumenta o risco para códigos que não fazem essa prevenção, como comentei anteriormente.
Sds.,
Rogério Figurelli

É óbvio que existe um problema maior.

Se os criadores do MQL não conseguem nem entender a diferença entre um NULL e um 0 (zero) o que dirá de criar estruturas mais complexas do tipo THROW...EXCEPTION...??

Só não citei mais coisas porque os problemas básicos e elementares com esta linguagem já são o suficiente...

E,  o problema dos UPDATES é GIGANTE! Pois são GOELA ABAIXO! os usuários não tem controle sobre isso. De uma hora pra outra os seus robôs param de funcionar porque um UPDATE desleixado foi tornado Público.

Eu prefiro ter um código-porco MEU com divisão com zero rodando em meus robôs do que ter a qualquer momento um update inconsequente da METAQUOTES em cima deles.

 
Flavio Jarabeck:

É óbvio que existe um problema maior.

Olá  Flavio Jarabeck, o problema maior que comentei é em relação ao assunto desse tópico e a arquitetura do sistema, e não nesse sentido que você está apresentando, e essa me parece uma discussão muito negativa, inclusive sujeita à remoção do fórum ( https://www.mql5.com/pt/about/rules). 

Entretanto, acredito que suas intenções sejam as melhores possíveis, buscando ajudar na melhoria do produto, e portanto, sugiro seguirmos nessa linha, com uma discussão positiva, que agregue valor para todos.

Nesse sentido, seguem meus contrapontos no que você comentou:

Se os criadores do MQL não conseguem nem entender a diferença entre um NULL e um 0 (zero) o que dirá de criar estruturas mais complexas do tipo THROW...EXCEPTION...??

Só não citei mais coisas porque os problemas básicos e elementares com esta linguagem já são o suficiente...


Na minha opinião você está subestimando o problema e a capacidade dos criadores dessa tecnologia. Note que apesar de o MQL ser uma linguagem de programação C-like, ela é 100% focada na criação de trading systems, e portanto me parece que as prioridades na criação dos parsers da linguagem são aumentar segurança, diminuir latência, etc., diferentes das prioridades de quem cria uma linguagem para aplicações genéricas, como C++, Java ou Python.

Dessa forma, me parece mais apropriado, se acreditamos e confiamos no produto, criar soluções de contorno, como as que proponho em https://www.mql5.com/pt/forum/23409 do que esperarmos por uma abertura maior. No caso do assunto desse tópico, como apresentei inicialmente e foi realçado por vários colegas experientes, a proteção contra divisão por zero, NULL, etc. é básico nesse ambiente, e na minha opinião em qualquer outro.

E,  o problema dos UPDATES é GIGANTE! Pois são GOELA ABAIXO! os usuários não tem controle sobre isso. De uma hora pra outra os seus robôs param de funcionar porque um UPDATE desleixado foi tornado Público.

Eu prefiro ter um código-porco MEU com divisão com zero rodando em meus robôs do que ter a qualquer momento um update inconsequente da METAQUOTES em cima deles.

Até onde eu saiba o update não é automático, ou seja, você tem que aprovar ele. Seja como for, me parece que você está misturando problemas independentes, pois não conheço nenhum produto competitivo, seguro e estável, ainda mais para criação de trading systems, onde as atualizações nas sejam recorrentes.

Sds.,
Rogério Figurelli

Um checklist dos riscos dos robôs antes de operar em conta real
Um checklist dos riscos dos robôs antes de operar em conta real
  • 2014.04.23
  • www.mql5.com
A maior parte dos traders que operam com robôs, tanto no mercado Forex, como no mercado BM&FBovespa, geralmente focam apenas no lado bom, que é o p...
Razão: