Arrays passados por referência apenas forex mt4


MetaTrader 4 - Exemplos Erros comuns em programas MQL4 e como evitá-los Introdução Alguns programas mais antigos podem retornar erros na nova versão do MQL4 do compilador. Para evitar a conclusão crítica dos programas, o compilador de versão anterior tratou muitos erros no ambiente de tempo de execução. Por exemplo, divisão por zero ou matriz fora do intervalo são erros críticos e geralmente levam a falha de aplicativo. Tais erros ocorrem somente em alguns estados para certos valores de variáveis. Leia este artigo para saber como lidar com esses casos. O novo compilador pode detectar origens reais ou potenciais de erros e melhorar a qualidade do código. Neste artigo, discutimos possíveis erros que podem ser detectados durante a compilação de programas antigos e maneiras de corrigi-los. 1 Erros de compilação Se um código de programa contiver erros. Ele não pode ser compilado. Para controlar completamente todos os erros, recomenda-se usar o modo de compilação rigoroso. Que é definido pela seguinte diretiva: Este modo simplifica muito a solução de problemas. 1.1. Identificador coincide com uma palavra reservada Se o nome de uma variável ou função coincide com uma das palavras reservadas o compilador retorna uma mensagem de erro: Figura 1. Erros token inesperado e nome esperado Para corrigir esse erro, você precisa usar o nome correto de A variável ou função. 1.2. Caracteres especiais nos nomes das variáveis ​​e funções Se os nomes de variáveis ​​ou funções contêm caracteres especiais (,, ponto): o compilador retorna uma mensagem de erro: Figura 2. Erros desconhecido símbolo e ponto e vírgula esperados Para corrigir esse erro, Função ou nomes de variáveis. 1.3. Erros usando o operador switch Na versão antiga do compilador você pode usar quaisquer valores em expressões e constantes do operador switch: No novo compilador, as constantes e expressões do operador switch devem ser inteiros, então os erros ocorrem quando você tenta usar Tais construções: Figura 3. Erros tipo de expressão de comutação ilegal e expressão constante não é integral Em tais casos, você pode usar comparação explícita de valores numéricos, por exemplo: 1.4. Valores de retorno de funções Todas as funções, exceto void, devem retornar o valor do tipo declarado. Por exemplo: No modo de compilação estrito, ocorre um erro: Figura 4. Erro Todos os caminhos de controle não retornam um valor No modo de compilação padrão, o compilador retorna um aviso: Figura 5. Aviso não todos os caminhos de controle retornam um valor Se o valor de retorno do Figura 6. Função de erro deve retornar um valor No modo de compilação padrão, o compilador retorna um aviso: Figura 7. Retorno de advertência - a função deve retornar um valor Para corrigir tal valor Erros, adicione o operador de retorno com o valor de retorno do tipo correspondente para o código de função. 1.5. Arrays em argumentos de função Em argumentos de função, os arrays passam agora apenas por referência. No modo de compilação estrita, esse código causará um erro: Figura 8. Matrizes de erro do compilador passadas somente por referência No modo de compilação padrão, o compilador retorna um aviso: Figura 9. Matrizes de aviso do compilador passadas somente por referência Para corrigir esse erro, Especifique explicitamente que a matriz é passada por referência adicionando o prefixo amp antes do nome da matriz: Deve-se notar que as matrizes agora constantes (Tempo, Abrir, Alto, Baixo, Fechar, Volume) não podem ser passadas por referência. Por exemplo, a seguinte chamada: independentemente do modo de compilação leva a um erro: Figura 10. Error Open - variável constante não pode ser passado como referência Para evitar esses erros, copie os dados necessários a partir da matriz constante: Ocorrer durante a execução do código do programa são chamados erros de tempo de execução. Esses erros normalmente dependem do estado de um programa e estão associados a valores incorretos das variáveis. Por exemplo, se uma variável for usada como um índice de elementos de matriz, seus valores negativos levarão inevitavelmente ao erro Array out of Range. 2.1. Array out of Range Esse erro geralmente ocorre nos indicadores ao acessar os buffers de indicadores. A função IndicatorCount () retorna o número de barras inalteradas desde a última chamada de indicador. Os valores de indicadores em barras previamente calculadas não precisam ser recalculados, portanto, para cálculos mais rápidos, você só precisa processar as últimas barras. A maioria dos indicadores que utilizam este método de otimização de cálculo tem esta aparência: Muitas vezes o caso de countedbars0 é tratado incorretamente (a posição limite inicial deve ser reduzida pelo valor igual a 1 índice máximo em relação à variável loop). Além disso, lembre-se que no momento da execução da função start () podemos acessar elementos de matrizes de buffers indicadores de 0 a Bars () -1. Se você precisar trabalhar com os arrays que não são buffers de indicador, aumente seu tamanho usando a função ArrayResize () de acordo com o tamanho atual de buffers de indicador. O índice máximo do elemento para endereço também pode ser obtido chamando ArraySize () com um dos buffers indicadores usados ​​como um argumento. O erro Zero Divide ocorre quando um divisor em uma operação de divisão é igual a zero: Quando você executa esse script, uma mensagem de erro aparece na guia Experts e o programa é desligado: Figura 11. Mensagem de erro zero divide Geralmente este erro ocorre quando o Valor do divisor é determinado pelos valores de quaisquer dados externos. Por exemplo, se os parâmetros comerciais forem analisados, o valor da margem utilizada é igual a 0 se não houver pedidos em aberto. Outro exemplo: se os dados analisados ​​são lidos de um arquivo, não podemos garantir o funcionamento correto se o arquivo não estiver disponível. Então você deve levar em conta esses casos e processá-los corretamente. A maneira mais fácil é verificar o divisor antes da operação de divisão e relatar um valor de parâmetro incorreto: Isso não causa um erro crítico, mas uma mensagem sobre um valor de parâmetro incorreto aparece eo programa é desligado: Figura 12. Mensagem de divisor incorreta 2.3. Uso de 0 em vez de NULL para o caractere atual Na versão antiga do compilador 0 (zero) poderia ser usado como um argumento em funções que exigem especificação de um instrumento financeiro. Por exemplo, o valor do indicador técnico da Média Móvel para o símbolo atual pode ser solicitado da seguinte maneira: No novo compilador você deve especificar explicitamente NULL para especificar o símbolo atual: Além disso, o símbolo atual eo período do gráfico podem ser especificados usando o Funções Symbol () e Period (). 2.4. Cadeias Unicode e seu uso em uma DLL Strings agora são representados como uma seqüência de caracteres Unicode. Lembre-se disso e use as funções apropriadas do Windows. Por exemplo, ao usar a biblioteca wininet. dll em vez InternetOpenA () e InternetOpenUrlA (), você deve chamar InternetOpenW () e InternetOpenUrlW (). A estrutura interna de seqüências de caracteres foi alterada em MQL4 (agora ele leva 12 bytes), ea estrutura MqlString deve ser usada ao passar strings para DLL: 2.5. Compartilhamento de arquivos No novo MQL4, flags FILESHAREWRITE e FILESHAREREAD devem ser explicitamente especificados para uso compartilhado ao abrir arquivos. Se os sinalizadores estiverem ausentes, o arquivo será aberto em modo exclusivo e não poderá ser aberto por ninguém até que ele seja fechado pelo usuário que o abriu. Por exemplo, ao trabalhar com gráficos offline, os flags de compartilhamento devem ser explicitamente especificados: 2.6. Conversão de data e hora A conversão de datetime em uma string agora depende do modo de compilação: Por exemplo, tentar trabalhar com arquivos cujo nome contém dois pontos causa um erro. 3. Avisos do compilador Os avisos do compilador são informativos e não são mensagens de erro. Mas indicam possíveis fontes de erro. Um código claro não deve conter avisos. 3.1. Nomes das variáveis ​​globais e locais coincidem Se as variáveis ​​nos níveis global e local tiverem nomes semelhantes: o compilador exibe um aviso mostrando o número da linha na qual a variável global é declarada: Figura 13. Declaração de aviso de esconde a declaração global na linha Os nomes corretos das variáveis ​​globais. 3.2. Não Corresponde aos Tipos O novo compilador tem uma nova operação de tipificação. No modo de compilação estrita o compilador mostra avisos se os tipos não correspondem: Figura 14. Avisos possível perda de dados devido à conversão de tipo e conversão implícita de número para string Neste exemplo, o compilador avisa sobre a possível perda de precisão para diferentes tipos de dados atribuídos e Conversão implícita de int para string. Para corrigir o aviso use o typecasting explícito: 3.3. Variáveis ​​não utilizadas A presença de variáveis ​​que não são usadas no código do programa (entidades supérfluas) não é um bom hábito. Relatórios de tais variáveis ​​são exibidos independentemente do modo de compilação: Figura 15. Variável de aviso não utilizada Para corrigi-la, remova as variáveis ​​não utilizadas do seu código. Conclusões O artigo descreve problemas comuns que podem ocorrer durante a compilação de programas antigos que contêm erros. Em todos os casos, é recomendável usar o modo de compilação estrito para a depuração do programa. Aviso: Todos os direitos sobre estes materiais são reservados pela MQL5 Ltd. Copiar ou reimprimir estes materiais em todo ou em parte é proibido. Preciso de ajuda para trabalhar com arrays - mt4 Estou trabalhando em uma cesta de negociação EA. Até agora eu escrevi a maior parte do código e cheguei à cesta COMPRAR e VENDER botões função. O que eu tenho até agora é vários arrays para construir os botões e alimentar as várias fórmulas com os valores necessários. Agora eu tenho o seguinte: e mais arrays com símbolos diferentes para criar a cesta correta para os pares restantes. Na seção OnChartEvent, eu quero o seguinte para ser possível: objsymiDoubleToString ((i4), 0) para coincidir com a denominação correta do botão - não de muita importância neste caso. Se (sparam) obj o botão foi pressionado Ordersend (EURUSDbr.) Aqui é onde eu tenho o problema Na primeira execução do loop quando i0, sym0EURUSD - Eu posso construir o nome da matriz a ser chamado na próxima função como tal: Sym0quotbquot. Como usar o resultado (sym0quotbquot) para chamar a matriz correta, neste caso: EURUSDbr. Eu tentei (symiquotbquot) r para obter o equivalente a EURUSDbr, mas não funcionou. ObjectSetString (. OBJPROPSTATE, false) Eu sei que pode ser feito com o loop if para atribuir manualmente a matriz a ser usada na função ordersend e ou adicionar uma matriz 2 dimentional para o resto da lista de matrizes. Eu não quero criar linhas adicionais ou arrays adicionais - o resto do código já está construído em torno dos arrays atuais e realmente não quer reescrever todo o código antes que ele é confirmado theres nenhuma outra maneira de conseguir o que estou depois. Se alguma função existir para fazer o que eu expliquei acima (esperando que eu tenha explicado bem o suficiente), por favor me mostre o caminho ou qualquer outra solução simpleeasy para este caso. Eu realmente aprecio sua ajuda.

Comments

Popular Posts