MQL é uma linguagem de script muito simples. Depuração MQL, infelizmente, não é nada fácil. O compilador MetaEditor que MetaQuotes fornece simplesmente não contém as ferramentas sofisticadas que a maioria dos programadores estão acostumados a utilizar.
Depurar problemas MQL
Visual Studio e outros IDEs sofisticados (ambientes de desenvolvimento integrado) contêm uma série de características que o tornam fácil de depurar o código enquanto o programador escreve-. O maior exemplo disso são pontos de quebra. Um ponto de quebra é um ponto no código onde o compilador diz ao computador para cessar a execução do programa, quando se chega a uma certa linha de código.
Considere o exemplo onde um trailing stop define a nova parada incorretamente. O instinto natural para a maioria dos programadores seria executar o consultor especialista em visual testes de volta, em seguida, inserir pontos de quebra nas linhas de código logo após os cálculos trailing stop. Break points travar o código, permitindo ao programador para olhar dentro dos cérebros de o software para ver o que pensou no momento em que tomou a decisão. A principal vantagem em Visual Studio é que os valores de todas as variáveis são claramente visíveis. É possível caminhar através do passo a passo do programa. Sempre que um dos passos não segue as regras desejadas, a mudança necessária é geralmente óbvio. MetaQuotes felizmente incluído break points no MQL5. Eles não se encontram disponíveis em MQL4.
A falta de apoio intellisense completo afeta a minha velocidade de programação mais do que qualquer coisa. Intellisense detecta o uso de palavras reservadas como OrderSelect() ou ObjectGet(). O MetaEditor inclui um intellisense rudimentar, mas falta-lhe os detalhes que o tornam tão conveniente no Visual Studio.
Estou habituado a programação em C #, onde posso digitar as primeiras letras de uma variável ou classe, em seguida, o IDE preenche o resto. Quando eu digito “O Meu” em C # e empurrar a barra de espaço, Eu sei que a opção MessageBox aparece (supondo que eu declarou o namespace apropriado). O MetaEditor fornece uma lista de candidatos para palavras reservadas. O programador deve, em seguida, selecionar a opção com o mouse ou pressione Enter.
Eu sei que parece trivial para exigir pressionar Enter em vez da barra de espaço, mas pensar em quantas vezes código resuses as mesmas palavras reservadas ou variáveis. As prensas de teclas extras realmente se somam a uma série de movimentos de digitação desnecessários. Isso é duplamente verdadeiro para um velho 30 anos que já usa uma cinta de pulso para a dor do túnel do carpo.
A maior fraqueza do MetaEditor é que ele não detecta os nomes das variáveis. Costumamos escrever consultores especializados que contêm vários milhares de linhas de código. Acompanhando os nomes de dezenas de variáveis apresenta seus próprios desafios. Quando os tipos de codificador no mesmo conjunto de nomes de variáveis repetidamente, seria bom para simplesmente digitar as três primeiras letras e seguir em frente. Copie e cole pode fornecer uma alternativa decente. O problema é que as variáveis geralmente agrupar. Você não pode continuar 5 diferentes de copiar e colar itens disponíveis.
O MetaEditor permite que as funções para retornar tipos inválidos. Funções declaradas como dupla pode retornar strings, inteiros ou nada. O compilador MQL4 não acompanha ou não são válidos. Ele deixa-lo até o programador para descobrir o tipo inválido durante testes em tempo real. Esta omissão é um pesadelo para o programador involuntário que erroneamente retorna o tipo errado.
Isto é duplamente verdadeiro quando uma dupla função é erroneamente devolvido a uma variável inteira. Não MQL4 não evitar a dupla ilegal para int casts. Pior ainda, o consultor especialista continua a correr com um 0 valor para o interger invés de lançar uma mensagem de exceção ou erro. Eu não posso contar quantas horas que eu desperdicei rastrear variáveis que olhar perfeito, apenas para perceber que eu declarou o tipo de dados errado. Isso geralmente acontece quando estou no piloto automático, batendo fora código. O que parece eficiente na hora normalmente custa de várias horas de puxar cabelo frustração.
Técnicas de depuração MQL
O Programadores MQL o pessoal aqui geralmente recorrer a qualquer uma das seguintes técnicas. Você pode achar que usá-los em combinações ajuda a melhorar o processo de depuração ainda mais.
Erro do compilador Debug
Este pode ser o mais frustrante. O MetaEditor tenta insinuar que linha de código faz com que o erro de compilação. Digo tentativas porque erra mais vezes do que ele recebe-lo direito. Não há nada mais irritante do que olhar para uma linha perfeitamente legítimo do código que as bandeiras do compilador como problemático.
Eu quase sempre recorrer ao comentar cada vez mais grandes seções de código até que o erro desaparece. Eu começo com comentando uma única linha de código. Se isso não funcionar, então eu comentar dez linhas. Se isso não funcionar, Eu poderia comentar de funções públicas ou seções de código inteiros. Quando o compilador finalmente executado corretamente, você sabe que a última seção do código comentado contém o bug.
Próxima, você recuar. Comece a fazer seção comentada-out infrator menor e menor até que o erro reaparece. Agora, você finalmente zerado com a fonte real do problema.
Depuração em tempo real ou no backtester
Meu método preferido de depuração é comentar a maioria das informações decisão relevante sobre a tela, que é feito usando a Comment() função. Eu, então, executar o backtester visuais, observando como os dados se comporta em relação à informação visual.
Na tela comentários são essencialmente break points improvisado. Controlando como e quando eles aparecem permite que o programador percorrer o código para descobrir o problema. A única diferença é que os comentários não vigorosamente impedir que o código seja executado. O texto que aparece é muito pequena. Afora isso, Eu realmente gosto o fato de que ele é tão robusto. A função de comentário sempre funciona sem problemas, tornando-se o melhor amigo de um programador que está a depuração do código.
Levando screenshots leva isso para o próximo nível. Sempre que os clientes fazem perguntas sobre o porquê de um consultor especialista comportou de determinada maneira, as respostas mais fáceis vêm com screenshots. Comentando os pontos de quebra imitação costumam fornecer respostas à prova de bala – o programador eo cliente pode, literalmente, ver o que a EA pensou no momento em que tomou a decisão. MQL4 oferece a WindowScreenShot() função para fazer isso.
Os EAs que programam sempre tirar screenshots durante ações críticas, como entrar em um comércio ou ajustar uma condição de saída. O objetivo é fornecer um registro visual de todas as decisões com um olho para responder a perguntas sobre o comportamento futuro.
Nosso modelo padrão inclui um verdadeiro variável / false chamados WriteScreenshots. Traders controlar se eles querem se preocupar com este recurso de depuração ou não. A única desvantagem é que cada ação registrada consome cerca de 50kb de espaço no disco rígido.
Os arquivos de log representar a opção de depuração definitiva. A principal desvantagem é que eles são tão feio e difícil de ler. Eu quase sempre preferem screenshots por esta razão.
Não obstante, arquivos de log têm o seu lugar. A principal maneira de usá-los é como coletores de erro. Sempre que um processo dá errado devido a um problema com o próprio MetaTrader ou com uma transação corretor, o arquivo de log é o lugar mais fácil para pegá-lo.
Depurar arquivos MQL é uma habilidade que leva algum tempo para aprender. Os instrumentos à disposição do programador são muito diferentes dos que estão disponíveis para linguagens de alto nível. Uma vez que você se acostuma a trabalhar com as ferramentas mais simples no MetaEditor e MetaTrader, o processo de bug compensação geralmente fica muito mais fácil.
battlmonstr diz
Há uma biblioteca que traz Suporte C# para MT4.
Ele oferece suporte a depuração de seu código de script em Visual Studio, bem.