Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1688

 
OK, homens da ciência, então explique por que o incremento mágico pára em 2 enquanto que o único não pára. No código fonte abrimos 10 ordens e a cada uma delas deve ser atribuída uma magia única através de incremento inique e sua singularidade deve ser verificada através da comparação (!=) em loops aninhados: em um incremento de magia há um passe com comparação de todos os mages de ordens, se não houver correspondência, então única será igual ao número dessas misturas e se for igual ou maior que o número de ordens então magia é única e será atribuída à ordem.

Não sei se isto é muito complicado, mas acho que é mais fácil de entender se olharmos para o código.
Arquivos anexados:
 
pribludilsa #:
A questão é que a forma é conveniente na medida em que, dando-lhe uma série de itens, ela pode preencher algum conjunto. Tudo se chocará se o 0 for alimentado, porque o ArrayResize está vinculado ao número de posições. Por este motivo, tenho condição adicional se o número de posições for superior a 0, então este laço. Eu também estrago tudo o tempo todo, agora eu verifiquei novamente. O conselho é correto, pois caso contrário o formulário não preencherá o elemento zero da matriz, que é para o qual o formulário serve.

Sim, eu tenho problemas constantes por causa disso. Espero que esta clareza reduza o número de horas gastas na correção de bugs.

 
Nerd Trader #:
Ok, homens da ciência, expliquem então porque o incremento mágico pára em 2 enquanto que o único não pára. No código fonte abrimos 10 ordens e a cada uma delas deve ser atribuída uma magia única através de incremento inique, sua singularidade é verificada através da comparação (!=) em laços aninhados: em um incremento de magia há um passe com comparação de todas as ordens de magia, se não houver correspondência, então a magia única será igual ao número daquelas inigualáveis e se for igual ao número de ordens então a magia é única e será atribuída a uma ordem.

Eu não sei se é muito complicado, mas acho que é mais fácil de entender se olharmos para o código.

Se você precisa do laço para criar 10 pedidos com diferentes magos, é isso que você deve fazer.

    for(int i = 0; i < 10; i ++)
    { 
    int order_send = OrderSend(Symbol(), OP_BUY, 0.01, Bid, 10,
    0, 0, "", i, 0, CLR_NONE);
    if(order_send == -1) ResetLastError();
    }

Neste caso eu tenho o papel de não apenas controlar o laço, mas também o mágico para a ordem.


Mas em seu exemplo, há muitos erros que criaram uma espécie de quebra-cabeça. Poucas pessoas investigarão a fundo qual é a razão.

Bem, no mínimo, o laço do pedido não está correto... E a variável mágica é local e se reinicia o tempo todo. (não se acumula)

 
Nikolay Ivanov #:

Se você precisa do laço para criar 10 pedidos com diferentes magos, é isso que você deve fazer.

Neste caso eu tenho o papel de não apenas controlar o laço, mas também o mágico para a ordem.


Mas em seu exemplo, há muitos erros que criaram uma espécie de quebra-cabeça. Poucas pessoas investigarão a fundo qual é a razão.

Bem, no mínimo, o laço do pedido não está correto... E a variável mágica é local e se reinicia o tempo todo. (não se acumula)

Este código é para o teste e a EA não criará ordens em tal loop; há alguma lógica que não deve ser incluída no teste. Por que o loop da ordem está errado? a magia deve ser reiniciada, não há razão para que se acumule. E não há nada para entender aqui, existem apenas dois laços aninhados com um par de linhas de código dentro.

 
Nerd Trader #:

Sim, eu tenho problemas constantes por causa disso. Espero que esta clareza reduza o número de horas gastas na correção de bugs.

Demorei algum tempo para descobrir isso também. A ironia é que eu comecei a descobrir isso ao mesmo tempo que outros usuários postaram mais ou menos a mesma coisa aqui. Eu só tinha a cola de cópia certa, depois a classifiquei e escrevi errado, porque só verifiquei a entrada do laço e esqueci a saída. Verifique o código com a impressora, forçando os valores de verificação.
 
Nerd Trader #:

Este código é para testes, a EA não criará ordens em tal loop, há uma lógica para isto que não devemos acrescentar aos testes. Por que o loop da ordem está errado? a magia deve ser reiniciada, não há razão para que se acumule.

Não há -1.

for(int i = OrdersTotal()-1; i >= 0 ; i --)

Se a magia é projetada dessa forma, então acontece que há um erro na lógica (no projeto geral) e precisamos resolver um enigma para encontrá-la...

 
Nikolay Ivanov #:

não -1

Se a magia é projetada dessa forma, então há um erro de lógica (no projeto geral), você tem que resolver o quebra-cabeça para encontrá-la...

A menos que seja isto. Mas -1 também não resolve nada lá. Por que existe um erro? A magia será dada quando a magia for igual ou maior do que o número de ordens. Se a magia deve ser zerada, caso contrário, se fecharmos várias ordens com magia 5 e 6, as novas serão maiores que a magia da última ordem, ou seja, 11-12 e assim por diante. E assim, quando uma ordem é zerada, ela é comparada e iterada a partir do zero, o que resulta em novas ordens com grandes ordens fechadas, ou seja, 5 e 6...

 
pribludilsa #:
Demorei muito tempo para descobrir isso também. A ironia é que eu comecei a descobrir isso ao mesmo tempo que os posts de outros usuários sobre a mesma coisa aqui. Eu só tinha a cola de cópia certa, depois a classifiquei e escrevi errado, porque só verifiquei a entrada do laço e esqueci a saída. Verifique o código com uma impressora, forçando os valores do cheque.
É tão irritante que o mql4 não tenha um depurador decente. Mesmo com dados reais na fonte acima, o depurador não entra em loop. Tenho que me contentar com a impressão, mas isso não é sério.
 

Basicamente é simples, seu exclusivo resume todas as ordens desencontradas entre diferentes mágicos...

Por exemplo, existem 3 pedidos

A primeira iteração de magic=1 unique=0, no final da iteração unique será=2.

A segunda iteração magik=2unique=2, no final da iteraçãounique será=3

Desde 3>=número de todos os pedidos, o loop while irá quebrar... E magia =3 nunca foi verificada... Tão mágico =2 novamente e assim por diante com todos...

 
pribludilsa #:
Oh, certo, obrigado. Mas, afinal, é uma muleta. Assim como toda essa coisa do mql .

Aponte paramais- TODAS as linguagens de programação.

É simples - em linguagens de programação, a contagem começa em zero. A primeira célula de um array terá um índice de 0. Portanto, você tem que fazer um loop inverso ANTES de zero, INCLUINDO-o. Isto é, >=0

EncomendasTotal() sai, por exemplo, 10. E você inicia um loop a partir de 10, enquanto o último índice da matriz é 9 (lembre-se, estamos começando de zero?). E o que acontecerá quando você acessar uma célula de array inexistente? Isso mesmo - o programa se chocará com um erro crítico, porque você entrou em uma área de memória não alocada, além dos limites da matriz.

Estas são muletas sólidas, com certeza. Leia, aprenda e tudo virá até você.