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

 
for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к Метке 1
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }}
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

Le premier problèmeLots/Prikup - Dplus doit être normalisé. Lisez-le attentivement. Si les variables sont de type double, vous remarquerez avec surprise que 4/2 ne donne pas le 2 attendu, mais 1,999999999999 - vous n'avez probablement pas encore été confronté à ce problème.

Donc si((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) est faux, et je peux dire avec une forte probabilité que c'est faux, alors même si vous avez cnt_OO supérieur à 1 vous êtes assuré d'arriver à un bloc après l'étiquette 1. Donc tout fonctionne avec vous sans erreur Le problème est dans la logique de traitement des données.

Le deuxième problème est que vous avez la garantie de ne traiter que la dernière commande de la liste, alors pourquoi s'embêter avec une boucle for ?

Si vous faites cela uniquement pour le testeur, en choisissant la dernière commande de la liste, vous obtiendrez vraiment la commande nécessaire, et pas toujours. Sur le marché réel, surtout si plusieurs conseillers experts sont en cours d'exécution, vous êtes assuré d'obtenir quelque chose de différent de ce à quoi vous vous attendez et la boucle est assurée de s'interrompre après le premier passage à l'aide de la commande break.

 
Vitaly Gorbunov:

Le premier problèmeLots/Prikup - Dplus doit être normalisé. Lisez-le attentivement. Si les variables sont de type double, vous serez surpris si 4/2 ne donne pas le 2 attendu, mais 1,999999999999 - vous n'avez probablement pas encore été confronté à ce problème.

Donc si((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) est faux, et je peux dire avec une forte probabilité que c'est faux, alors même si vous avez cnt_OO supérieur à 1 vous êtes assuré d'arriver à un bloc après l'étiquette 1. Donc tout fonctionne avec vous sans erreur Le problème est dans la logique de traitement des données.

Le deuxième problème est que vous avez la garantie de ne traiter que la dernière commande de la liste, alors pourquoi s'embêter avec une boucle for ?

Si vous faites cela uniquement pour le testeur, en choisissant la dernière commande de la liste, vous obtiendrez vraiment la commande nécessaire, et pas toujours. Sur le marché réel, surtout si plusieurs conseillers-experts sont en cours d'exécution, vous êtes assuré d'obtenir exactement le mauvais ordre et la boucle s'interrompra après le premier passage.

Vitaly Gorbunov:

Le premier problèmeLots/Prikup - Dplus doit être normalisé. Si les variables sont de type double, vous serez surpris si 4/2 ne donne pas le 2 attendu mais 1.999999999999 ; peut-être n'avez-vous pas encore été confronté à ce problème ?

Donc si((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) est faux, et je peux dire avec une forte probabilité que c'est faux, alors même si vous avez cnt_OO supérieur à 1 vous êtes assuré d'arriver à un bloc après l'étiquette 1. Donc tout fonctionne avec vous sans erreur Le problème est dans la logique de traitement des données.

Le deuxième problème est que vous avez la garantie de ne traiter que la dernière commande de la liste, alors pourquoi s'embêter avec une boucle for ?

Si vous faites cela uniquement pour le testeur, en choisissant la dernière commande de la liste, vous obtiendrez vraiment la commande nécessaire, et pas toujours. Sur le marché réel, surtout si plusieurs Expert Advisors sont en cours d'exécution, vous êtes assuré d'obtenir exactement le mauvais ordre, et la boucle s'interrompra sur la commande break après le premier passage.

Quant à la normalisation - merci, je n'avais pas remarqué qu'elle manquait. Mon œil s'est juste perdu dans ma tête.

À propos de la boucle for : il y a différentes commandes dans l'archive avec différents mages et de différentes paires. Je les passe en revue depuis la fin jusqu'à ce que je trouve celui dont j'ai besoin. Cela se produit lorsque l'EA n'a pas commencé à fonctionner et qu'aucun nouvel ordre dont j'ai besoin n'apparaît dans la liste. La boucle est interrompue non pas au premier passage, mais lorsque l'ordre requis est trouvé.

Nous devons comprendre correctement les fonctions Onlinit et OnDeinit. Leur nécessité est évidente.

 

Dans cette implémentation, la boucle ne fonctionne pas. J'ai exécuté votre code dans différentes variantes, toujours en une seule passe.

Et maintenant je vois où tu t'es trompé !

for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к команде continue
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }

        continue; //Вернёмся в цикл за следующим ордером если предыдущий не прошёл проверку
       }
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

J'ai tout commenté autant que possible ! Essayez-le !

 
Vitaly Gorbunov:

Dans cette implémentation, la boucle ne fonctionne pas. J'ai exécuté votre code dans différentes variantes, toujours en une seule passe.

Et maintenant, il est clair que vous avez fait une erreur !

J'ai tout commenté autant que possible ! Essayez-le !

Merci, j'ai compris. Voici une solution de contournement pour l'erreur de manque de normalisation. Après un examen plus approfondi de l'algorithme de récupération, la condition&&(OrderLots() <= Lots/Prikup - Dplus) est apparue inutile.

Merci à tous pour vos bons conseils



Voici le résultat des tests. C'est à peu près pareil sur le vrai, même mieux. Soyez prévenu à l'avance - il ne s'agit pas d'une martingale. C'est encore pire que vous ne le pensez :=). Drawdown 1,3 % profit 507 $.

 
Bon résultat ! Il y a d'autres problèmes, mais il est difficile d'obtenir les bonnes informations de votre part pour savoir quel est le problème. Si tu veux, tu peux m'ajouter comme ami pour que je ne me perde pas.
 
Vitaly Muzichenko:

Si cela fonctionne, et que cela ne vous dérange pas de partager le résultat, écrivez une solution au problème.

Cela n'a pas fonctionné (j'ai utilisé la bibliothèque openssl de php). Résoudre le problème d'une manière différente.

 
Juer:

Cela n'a pas fonctionné (j'ai utilisé la bibliothèque openssl de php). Résoudre le problème d'une manière différente.

Donc vous avez fini par crypter dans MT et décrypter dans .php ? Quel moyen avez-vous utilisé ?

 
Vitaly Muzichenko:

Donc vous avez fini par crypter dans MT et décrypter dans .php ? Quelle méthode avez-vous utilisée ?

Non, je vous l'ai dit, ça n'a pas marché. J'ai laissé tomber. Pour ma tâche, un hachis était suffisant. J'ai envoyé et reçu un hash et renvoyé un autre hash comme confirmation.

Je n'ai donc pas pu le décrypter en PHP. Ce serait bien si quelqu'un pouvait se pencher sérieusement sur cette question. Peut-être un développeur ou autre.

 
Juer:

Non, j'ai écrit que ça ne marchait pas. J'ai laissé tomber. Un hachage était suffisant pour ma tâche. J'ai envoyé et reçu un hash et renvoyé un autre hash comme confirmation.

Je n'ai donc pas pu le décrypter en PHP. Ce serait bien si quelqu'un pouvait se pencher sérieusement sur cette question. Peut-être un développeur ou autre.

Écrivez votre propre fonction de cryptage dans puch, et déplacez-la vers mq. De cette façon, ils ne pourront pas le décrypter, et il fonctionnera à 100% dans les deux cas.

 
Vitaly Muzichenko:

Si cela fonctionne, et si cela ne vous dérange pas de partager le résultat, publiez la solution.

google "Format de rembourrage PKCS#7"