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
- 2014.04.23
- www.mql5.com
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
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...
;)
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
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.
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.
É ó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
- 2014.04.23
- www.mql5.com
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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!