Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1688

 
OK, hommes de science, expliquez alors pourquoi l'incrément magique s'arrête à 2 alors que l'unique ne le fait pas. Dans le code source, nous ouvrons 10 commandes et chacune d'entre elles doit se voir attribuer une magie unique par incrémentation inique et leur unicité doit être vérifiée par comparaison (!=) dans des boucles imbriquées : sur une magie d'incrémentation il y a une passe avec comparaison de toutes les mages de commandes, s'il n'y a pas de correspondance, alors unique sera égal au nombre de ces mélanges et s'il est égal ou supérieur au nombre de commandes alors la magie est unique et elle sera attribuée à la commande.

Je ne sais pas si cela est trop compliqué, mais je pense que c'est plus facile à comprendre si l'on regarde le code.
Dossiers :
 
pribludilsa #:
Le fait est que le formulaire est pratique dans la mesure où, en lui donnant un certain nombre d'éléments, il peut remplir un tableau. Tout se plantera si 0 est introduit, car le ArrayResize est lié au nombre de positions. Pour cette raison, j'ai ajouté une condition supplémentaire : si le nombre de positions est supérieur à 0, alors cette boucle est activée. Je me trompe tout le temps avec ça aussi, maintenant je l'ai vérifié à nouveau. Le conseil est correct, car sinon le formulaire ne remplira pas l'élément zéro du tableau, ce qui est le but du formulaire.

Oui, j'ai des problèmes constants à cause de cela. J'espère que cette clarté réduira le nombre d'heures passées à corriger des bogues.

 
Nerd Trader #:
Ok, hommes de science, expliquez alors pourquoi l'incrément magique s'arrête à 2 alors que l'unique ne le fait pas. Dans le code source, nous ouvrons 10 commandes et chacune d'entre elles doit se voir attribuer une magie unique par incrémentation inique, leur unicité est vérifiée par comparaison (!=) dans des boucles imbriquées : sur une magie d'incrémentation, il y a une passe avec comparaison de toutes les magies de commandes, si aucune correspondance, alors unique sera égal au nombre de celles qui ne correspondent pas et si elle est égale au nombre de commandes, alors la magie est unique et elle sera attribuée à une commande.

Je ne sais pas si c'est trop compliqué, mais je pense que c'est plus facile à comprendre si on regarde le code.

Si vous avez besoin de la boucle pour créer 10 commandes avec des mages différents, c'est ce que vous devez faire.

    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();
    }

Dans ce cas, j'ai le rôle non seulement de contrôler la boucle, mais aussi de magicien pour la commande.


Mais dans votre exemple, il y a beaucoup d'erreurs qui ont créé une sorte de puzzle. Peu de gens cherchent à en connaître la raison...

Eh bien, au moins, la boucle d'ordre est fausse... Et la variable magique est locale et se réinitialise tout le temps... (ne s'accumule pas)

 
Nikolay Ivanov #:

Si vous avez besoin de la boucle pour créer 10 commandes avec des mages différents, c'est ce que vous devez faire.

Dans ce cas, j'ai le rôle non seulement de contrôler la boucle, mais aussi de magicien pour la commande.


Mais dans votre exemple, il y a beaucoup d'erreurs qui ont créé une sorte de puzzle. Peu de gens cherchent à en connaître la raison...

Eh bien, au moins, la boucle d'ordre est fausse... Et la variable magique est locale et se réinitialise tout le temps... (ne s'accumule pas)

Ce code est pour le test et l'EA ne créera pas d'ordres dans une telle boucle ; il y a une certaine logique qui ne doit pas être incluse dans le test. Pourquoi le cycle de commande est-il erroné ? La magie devrait être effacée, il n'y a aucune raison qu'elle s'accumule. Et il n'y a rien à comprendre ici, il n'y a que deux boucles imbriquées avec quelques lignes de code à l'intérieur.

 
Nerd Trader #:

Oui, j'ai des problèmes constants à cause de cela. J'espère que cette clarté réduira le nombre d'heures passées à corriger des bogues.

J'ai mis du temps à comprendre aussi. L'ironie, c'est que j'ai commencé à le découvrir en même temps que d'autres utilisateurs postaient la même chose ici. J'avais juste le bon copier-coller, puis j'ai trié et je l'ai mal écrit, car je n'ai vérifié que l'entrée de la boucle et j'ai oublié la sortie. Vérifiez le code avec l'imprimante en forçant les valeurs de contrôle.
 
Nerd Trader #:

Il s'agit d'un code de test, l'EA ne créera pas d'ordres dans une telle boucle, il existe une logique pour cela que nous ne devons pas ajouter aux tests. Pourquoi la boucle d'ordre est-elle fausse ? La magie devrait être remise à zéro, il n'y a aucune raison qu'elle s'accumule.

Il n'y a pas de -1.

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

Si la magie est conçue de cette façon, alors il s'avère qu'il y a une erreur dans la logique (dans la conception globale) et nous devons résoudre un puzzle pour la trouver...

 
Nikolay Ivanov #:

non -1

Si la magie est conçue de cette façon, alors il y a une erreur de logique (dans la conception globale), vous devez résoudre le puzzle pour la trouver...

Sauf si c'est ça. Mais -1 ne résout rien là non plus. Pourquoi y a-t-il une erreur ? La magie sera donnée lorsque la magie est égale ou supérieure au nombre de commandes. Si la magie doit être mise à zéro, sinon si on ferme plusieurs ordres avec la magie 5 et 6, les nouveaux seront plus élevés que la magie du dernier ordre, c'est-à-dire 11-12 et ainsi de suite. Et de cette façon, lorsqu'un ordre est mis à zéro, il est comparé et itéré à partir de zéro, ce qui donne lieu à de nouveaux ordres avec les majuscules des ordres fermés, c'est-à-dire 5 et 6...

 
pribludilsa #:
Il m'a fallu beaucoup de temps pour comprendre, aussi. L'ironie, c'est que j'ai commencé à le découvrir en même temps que les messages d'autres utilisateurs sur la même chose ici. J'avais juste le bon copier-coller, puis j'ai trié et je l'ai mal écrit, car je n'ai vérifié que l'entrée de la boucle et j'ai oublié la sortie. Vérifiez le code avec une imprimante, en forçant les valeurs de contrôle.
C'est si ennuyeux que mql4 n'ait pas de débogueur décent. Même avec les données réelles de la source ci-dessus, le débogueur n'entre pas dans la boucle. Je dois me contenter de l'empreinte, mais ce n'est pas grave.
 

En gros, c'est simple, votre unique résume toutes les commandes mal assorties entre les différents magiciens...

Par exemple, il y a 3 commandes

La première itération de magic=1 unique=0, à la fin de l'itération unique sera=2.

La deuxième itération magik=2unique=2, à la fin de l'itérationunique sera=3

Puisque 3>=nombre de toutes les commandes, la boucle while va se casser... Et magic=3 n'a jamais été vérifié... Donc magie =2 à nouveau et ainsi de suite avec tous...

 
pribludilsa #:
Oh, c'est vrai, merci. Mais il s'avère que c'est une béquille. Tout comme l'ensemble de la chose mql .

Visezplus- TOUS les langages de programmation.

C'est simple : dans les langages de programmation, le comptage commence à zéro. La première cellule d'un tableau aura un indice de 0. Par conséquent, vous devez faire une boucle inverse AVANT le zéro INCLUANT. C'est-à-dire >=0

OrdersTotal() donne, par exemple, 10. Et vous démarrez une boucle à partir de 10, alors que le dernier indice du tableau est 9 (rappelez-vous, nous partons de zéro ?). Et que se passera-t-il si vous accédez à une cellule de tableau inexistante ? C'est exact - le programme se bloquera sur une erreur critique, parce que vous avez pénétré dans une zone de mémoire non allouée, au-delà des limites du tableau.

Ce sont des béquilles solides, c'est sûr. Lisez, apprenez, et tout viendra à vous.

Raison: