![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
É claro que sim.
Qualquer programador que respeite a si mesmo e seus programas não deixará que as coisas corram seu curso. Na MQL4, se você não usar #propriedade estrita, você pode se referir a uma matriz com tamanho 10 por índice 20. E nada vai acontecer - o programa continuará a funcionar, mas cabe ao programador decidir o que usar em seguida. Se ele for inteligente, certamente verificará e controlará tudo, de modo a não obter valores fora da matriz, mas se ele o fizer "grosso modo", ele não pensa em tal controle, e "o principal é que ele funciona, mas como funciona - de alguma forma...".
A maioria dos usuários, que não se preocuparam com isso, tem reclamado da "má, má e complicada MQL5", porque ela não lhes permite falsificar suas próprias criações como antes. Mas aqueles que originalmente pensavam e criavam código com verificações e controle dos dados recebidos, não notaram nenhuma diferença na complexidade dos idiomas, e agora se perguntam - "onde está a complexidade - é a mesma...".
Nikolai, não se preocupe com a MQL4, lá tudo está bem. O iniciante do tópico preenche as matrizes como ele gosta. Tudo.
É claro que sim.
Qualquer programador, que respeite a si mesmo e seus programas, não deixará as coisas escorregarem. Na MQL4, se você não usar #propriedade estrita, você pode se referir a uma matriz com tamanho 10 por índice 20. E nada vai acontecer - o programa continuará a funcionar, mas cabe ao programador decidir o que usar em seguida. Se ele for inteligente, certamente verificará e controlará tudo, de modo a não obter valores fora da matriz, mas se ele o fizer "grosso modo", ele não se importa com esse controle, e "o principal é que ele funciona, e como - de alguma forma...".
A maioria dos usuários, que não se preocuparam com isso, tem reclamado da "má, má e complicada MQL5", porque ela não lhes permite falsificar suas próprias criações como antes. Mas aqueles que originalmente pensavam e criavam código com verificação e controle dos dados recebidos, não notaram nenhuma diferença na complexidade dos idiomas, e agora se perguntam - "onde está a complexidade - é a mesma...".
Que chatice!
Bem, Petr, graças ao rigor da MQL5, você tem uma chance de colocar o código em ordem relativa e limpar a pilha de lixo.
Você pode até tentar compilar o código fixo com #property strict back para MQL4 e talvez funcione muito mais rápido no MT4
Que chatice!
Bem, Peter, graças ao rigor da MQL5, temos uma chance de colocar o código em ordem relativa e limpar as pilhas de lixo.
Você pode até tentar compilar o código fixo com #property strict back em MQL4 e, talvez, ele funcione muito mais rápido em MT4
Foi assim que, a priori, você decidiu que meu código está cheio de lixo.
Deixe-me explicar: o miolo é preenchido em etapas, em várias etapas. Se ao declarar array no MT5 há lixo nele (o que eu não sabia), então nos primeiros passos de construção do kernel em funções, o array está fora do escopo, porque ao invés de ponteiros para variáveis, eu me refiro a uma célula do kernel através de outra. Se contiver zero, está OK, e obtém o valor correto na segunda corrida, mas se contiver lixo, ocorre um erro crítico.
Isso está claro para você?
Peter, eu não sei o que você quer dizer.
Exatamente, você não entendeu. Você está comparando minhas tarefas com as suas...
Eu não tenho nenhum transbordo. Considere as especificidades da minha tecnologia (esqueça que você a está ignorando). Se você usar outra célula da matriz como ponteiro para uma célula, e houver lixo nela, então você está fora da matriz. O problema é que, para que a célula a que você se refere obtenha o valor correto, você tem que ir para a segunda rodada de construção do núcleo. E na segunda rodada, o valor será correto. Mas não se chega ao segundo round por causa de um erro crítico.
Tudo isso é devido ao lixo no conjunto que está sendo declarado.
Portanto, precisamos inventar mecanismos para limpar a matriz bidimensional (kernel) no estágio da primeira configuração de tamanho (construção da área regular) e no estágio do segundo redimensionamento do kernel, ao construir a área do usuário.
Exatamente, você não entendeu. Em comparação, minhas tarefas e suas próprias...
Vá em frente e crie um monólogo - mais 10 postos em uma fila.
Foi assim que, a priori, você decidiu que meu código está cheio de lixo.
Deixe-me explicar: o miolo é preenchido em etapas, em várias etapas. Se ao declarar array no MT5 há lixo nele (o que eu não sabia), então nos primeiros passos da construção do kernel em funções, o array está fora do escopo, porque ao invés de ponteiros para variáveis, eu me refiro a uma célula do kernel através de outra. Se contiver zero, está OK, e obtém o valor correto na segunda corrida, mas se contiver lixo, ocorre um erro crítico.
Isso está claro para você?
Não énada disso. Não é o lixo que tem a culpa, mas a ausência de #propriedade rigorosa em mql4. Sem este gimmick, você recebe 0 em vez de um array overrun, e em mql5 já é um erro crítico. Provavelmente, é melhor verificar o comprimento da matriz ao invés do conteúdo de um índice de matriz inexistente.
ARetag não é nada disso. Não é o lixo que tem a culpa, é a falta de #propriedade rigorosa em mql4. Sem este gimmick, você recebe 0 em vez de uma ultrapassagem de matriz, e em mql5 já com erro crítico. Provavelmente, é melhor verificar o comprimento da matriz ao invés do conteúdo de um índice de matriz inexistente.
Fora dos limites ocorre porque há lixo na célula indicadora.
Por exemplo:
Inicial:
G_CORE[Object][Kanvas] = -123423452345; (lixo)
G_CORE[Window][His_canvas]= -452345; (lixo)
//-----------------------------------------------------------------
O resultado está fora de série.
Para reiterar. Algumas células têm valores zero em MT4 e são preenchidas no segundo turno no primeiro estágio de enchimento do núcleo.
No MT5, devido ao lixo nas células, há um erro crítico na primeira rodada.
Se as células da matriz tivessem zeros, não haveria erro e o núcleo se encheria sequencialmente (como deveria).
Aqui está um exemplo mais preciso:
A primeira rodada de construção do núcleo. Em uma das funções:
Fora dos limites ocorre porque há lixo na célula indicadora.
Por exemplo:
Inicial:
G_CORE[Object][Kanvas] = -123423452345; (lixo)
G_CORE[Window][His_canvas]= -452345; (lixo)
//-----------------------------------------------------------------
O resultado está fora de série.
Para reiterar. Algumas células têm valores zero em MT4 e são preenchidas no segundo turno no primeiro estágio de enchimento do núcleo.
No MT5, devido ao lixo nas células, há um erro crítico na primeira rodada.
Se houvesse zeros nas células da matriz, não haveria erro e o núcleo seria preenchido sequencialmente (como deveria ser).
A não-inicialização da matriz é inteiramente culpa do kodopistael. Procure o erro em seu próprio ambiente. Reconstrua seu algoritmo.