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

 
Vitalie Postolache:


Si vous le comparez à l'équilibre, c'est comme ça :

Merci.

 
trader781:

OK, alors si je comprends bien, vous obtenez trois fonctions personnalisées différentes avec le retour de la bonne (si vous cherchez trois paramètres différents)

ArraySort

puis

Recherche dans les tableaux par le bon numéro

et ensuite comment y faire face ?

Exactement la transition d'un tableau à un élément de structure

Vous ne comprenez pas.

Vous devez créer une seule fonction qui remplira et triera le tableau déclaré globalement. Le tableau devra être transmis à la fonction par référence.

Et vous avez besoin de fonctions supplémentaires qui extrairont de ce tableau les données dont vous avez besoin.

 
Artyom Trishkin:

Vous ne comprenez pas.

Vous devez créer une seule fonction qui remplit et trie le tableau déclaré globalement. Le tableau devra être transmis à la fonction par référence.

Et vous avez besoin de fonctions supplémentaires qui prendront les données dont vous avez besoin dans ce tableau.

ok, pouvez-vous nous montrer comment extraire quelque chose d'un tableau de structures ? disons rempli et trié.

comment transférer par référence et par écrit.

 

Veuillez m'indiquer à quoi devrait ressembler la condition. Si un stop loss est déclenché, le lot est alors multiplié par 2, et si l'ordre suivant déclenche un take profit, le lot revient au lot initial, qui était avant le stop loss.

Je le comprends comme ça, mais je ne sais pas comment continuer...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

 

Une autre question, qu'est-ce que j'ai écrit de faux dans le bloc de suppression des ordres ? Il ne supprime pas toujours les ordres, dans le journal, il est écrit

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }
 
wishmast:

Une autre question, qu'ai-je écrit de faux dans le bloc pour supprimer les ordres ? Il ne supprime pas toujours les ordres, le journal indique que

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }


Vous essayez de supprimer un ordre au marché, ils ne sont pas supprimés, ils sont fermés à l'aide de la fonction OrderClose(). Pour que la boucle se supprime ou se ferme correctement, nous devons distinguer l'ordre par son type.

if(OrderType()<=OP_SELL) - pour les ordres au marché, if(OrderType()>OP_SELL) - pour les ordres en attente.

 

Il existe un élément appeléCHARTEVENT_MOUSE_MOVE.

Question : cela fonctionne-t-il sur les appareils mobiles où il n'y a pas de souris ?

 
wishmast:

Veuillez m'indiquer à quoi devrait ressembler la condition. Si un stop loss est déclenché, le lot est alors multiplié par 2, et si l'ordre suivant déclenche un take profit, le lot revient au lot initial, qui était avant le stop loss.

Je le comprends comme ça, mais je ne sais pas comment continuer...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

Si vous l'avez fait rapidement, le dernier ordre perdant apparaîtra, ce qu'il faut en faire et les paramètres à corriger, je pense que vous comprendrez.
Dossiers :
last1.mq4  4 kb
 
wishmast:

Veuillez m'indiquer à quoi devrait ressembler la condition. Si un stop loss est déclenché, le lot est alors multiplié par 2, et si l'ordre suivant déclenche un take profit, le lot revient au lot initial, qui était avant le stop loss.

Je le comprends comme ça, mais je ne sais pas comment continuer...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

La solution à ce problème dépend de la logique complète de l'Expert Advisor, vous pouvez retracer le déclenchement du stoploss ou du takeprofit par son commentaire.

  if(StringFind(OrderComment(),"sl")>=0)// сработал стоплосс
  if(StringFind(OrderComment(),"tp")>=0)// сработал тейкпрофит

...

 
Artyom Trishkin:

Vous ne comprenez pas.

Vous devez créer une seule fonction qui remplit et trie le tableau déclaré au niveau global. Le tableau devra être transmis à la fonction par référence.

Et vous avez besoin de fonctions supplémentaires qui extrairont de ce tableau les données dont vous avez besoin.

Artem, tu as tort. Le tableau, déclaré à un niveau global, est visible dans toutes les parties du programme, et vous n'avez pas besoin de le passer de quelque part en quelque sorte. Il est simplement rempli à un endroit du programme, trié à un autre, et lu au troisième, peu importe.
Raison: