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

 
Artyom Trishkin:

Quels calculs ?

Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
Last_Arrow_Buy_index  = n;

Compris, question supprimée, j'ai entendu votre message et réalisé que déclarer une variable dans la zone OnTick() est mauvais, et que les calculs peuvent être effectués à l'intérieur de la boucle également.

Fait, tout fonctionne merci, maintenant je dois juste obtenir les prix. Merci beaucoup.

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = Buf_Arrow_Buy[n];
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = Buf_Arrow_Sell[n];
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 
Sergey Voytsekhovsky:

Compris, question supprimée, j'ai entendu votre message et réalisé que déclarer une variable dans la zone OnTick() est mauvais, et que les calculs peuvent être effectués à l'intérieur de la boucle également.

Fait, tout fonctionne merci, maintenant je dois juste obtenir les prix. Merci beaucoup.

Il ne s'agit pas de calculs à l'intérieur de la boucle, mais de l'obtention des données nécessaires, ce pour quoi cette boucle est conçue.

Mais les calculs à l'intérieur de la boucle doivent être évités.

En fait, vous devez reconsidérer votre approche dès maintenant. Vous obtenez des données dans la boucle. Vous interrompez la boucle après la première donnée rencontrée. Tout cela s'inscrit dans le cadre du concept de fonction, qui consiste à renvoyer le résultat demandé.

Faites de toute la boucle une fonction et renvoyez le numéro de la barre si elle est trouvée ou WRONG_VALUE - si elle n'est pas trouvée.

puis : n=Func();

et ensuite utiliser n pour son usage prévu s'il n'est pas égal à WRONG_VALUE. Nommez la fonction avec un nom "parlant". Et le code dans OnTick() sera plus court et la logique sera plus claire - il ne sera pas surchargé avec quelque chose d'inutile.

 
Artyom Trishkin:

Formez toute la boucle dans une fonction, et renvoyez le numéro de barre si vous le trouvez, ou WRONG_VALUE si vous ne le trouvez pas.

Ensuite : n=Func();

et ensuite utiliser n comme prévu, s'il n'est pas égal à WRONG_VALUE. Donnez à la fonction un nom "parlant". Et le code dans OnTick() sera plus court et la logique sera plus claire - il ne sera pas surchargé de choses inutiles.

On vit et on apprend. Très intéressant, je vais l'essayer dans la soirée. Entre-temps, à titre de rapport et avec une grande gratitude envers vous, j'ai obtenu les prix de...... C'était une bonne journée :-))

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }
 

Les gars qui peuvent aider avec cette question https://www.mql5.com/ru/forum/160683/page845#comment_11741857 - est-ce que le commentaire est déjà allé loin ? Il y a aussi une question : comment créer une boucle qui peut fonctionner dans les deux sens, si vous avez besoin d'une exécution incrémentale, si vous avez besoin d'une exécution décrémentale ? Voici un exemple de fonctionnement.

Si (quelque chose s'est produit) {assignation de valeurs aux variables} alors la boucle sera appelée et elle contiendra un corps, dont les calculs dépendront des valeurs de la boucle

for( selon les variables ci-dessus incrémenter ou décrémenter)

{ corps }

Il n'y a aucun moyen de dupliquer la condition, elle doit être spécifiée une fois dans la boucle. Est-il possible de le faire ?

 

Encore une fois, bonsoir. Je n'en ai pas encore fait une fonction, mais j'ai une nouvelle question. Dans l'image ci-jointe vous pouvez voir qu'il y a un nouveau signal (Flèche), mais dans les commentaires vous pouvez voir que l'EA ne l'accepte pas, il considère toujours celui d'il y a 11 bougies comme la Flèche Ultime à la hausse.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
График EURUSD, H1, 2019.05.20 18:00 UTC, Alpari International, MetaTrader 5, Real
  • www.mql5.com
Символ: EURUSD. Период графика: H1. Брокер: Alpari International. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2019.05.20 18:00 UTC.
 
Sergey Voytsekhovsky:

Il y a 11 bougies.

Il s'avère que l'indicateur a déjà donné un nouveau signal (il fonctionne parallèlement à l'EA sur le graphique), il n'y a pas d'événements dans l'EA autres que OnTick, et l'EA ne voit pas le signal.

 
Sergey Voytsekhovsky:

Encore une fois, bonsoir. Je n'en ai pas encore fait une fonction, mais j'ai une nouvelle question. Dans l'image ci-jointe vous pouvez voir qu'il y a un nouveau signal (Flèche), mais dans les commentaires vous pouvez voir que l'EA ne l'accepte pas, il considère toujours celui d'il y a 11 bougies comme la Flèche Ultime à la hausse.

https://www.mql5.com/ru/charts/10181812/eurusd-h1-alpari-international

Lorsque vous trouvez une valeur tampon non vide, imprimez dans le journal le temps correspondant à la barre n. Vous verrez quelle barre il trouve. Il se pourrait bien que vous lisiez le tampon à l'envers.

 

Veuillez indiquer pourquoi l'EA ne voit pas la flèche, elle est déjà dans le tampon de l'indicateur, à en juger par la fenêtre de données, l'EA interroge OnTick, de quoi d'autre a-t-il besoin ? Code complet ci-dessus.


 
Artyom Trishkin:

Lorsque vous trouvez une valeur tampon non vide, imprimez dans le journal le temps correspondant à la barre n. Il indiquera la barre qu'il a trouvée. Il se pourrait bien que vous lisiez le tampon à l'envers.

OK, c'est fait, l'heure indique l'heure correcte, l'heure d'ouverture de la bougie sur laquelle la flèche est placée. Code joint, image jointe.

void OnTick()
  {
   if (CopyBuffer(CrossAD, 1, 0, period_find, Buf_Arrow_Buy) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 1-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Buy[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Buy_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Buy_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Buy_index  = n;
                  Print("Last_Arrow_Buy_volume = ",Last_Arrow_Buy_volume,", Last_Arrow_Buy_index = ",Last_Arrow_Buy_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }   
            }
         
   if (CopyBuffer(CrossAD, 2, 0, period_find, Buf_Arrow_Sell) != period_find)
      {  
         Print("НЕ удалось правильно скопировать данные из 2-го буфера индикатора iCrossAD, error code %d",GetLastError());
         return;
      }
         for(int n=0; n<(int)period_find; n++)
            {
               if(Buf_Arrow_Sell[n]!=EMPTY_VALUE)
               {
                  Last_Arrow_Sell_volume = iOpen(_Symbol,_Period,n);
                  Last_Arrow_Sell_time   = iTime(_Symbol,0,n);
                  Last_Arrow_Sell_index  = n;
                  Print("Last_Arrow_Sell_volume = ",Last_Arrow_Sell_volume,", Last_Arrow_Sell_index = ",Last_Arrow_Sell_index,", Last_Arrow_Buy_time = ",Last_Arrow_Buy_time);
                  break;
               }
            }
      
Comment("-------------------------", 
         "\n Last_Arrow_Buy_volume     = ",Last_Arrow_Buy_volume,
         "\n Last_Arrow_Buy_index        = ",Last_Arrow_Buy_index,
         "\n ---------------------- ",
         "\n Last_Arrow_Sell_volume     = ",Last_Arrow_Sell_volume,
         "\n Last_Arrow_Sell_index        = ",Last_Arrow_Sell_index
         ); 
  }


 

si vous ne pouvez pas voir le journal dans l'image, voici quelques entrées extrêmes


2019.05.20 21:42:52.601 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:42:53.824 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:00.819 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.021 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.621 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:03.622 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Buy_volume = 1.11544, Last_Arrow_Buy_index = 11.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00

2019.05.20 21:43:10.696 Test_iCustom (EURUSD,H1) Last_Arrow_Sell_volume = 1.12112, Last_Arrow_Sell_index = 56.0, Last_Arrow_Buy_time = 2019.05.20 10:00:00