[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 421

 

... suite...

À la fin de la sous-section StringSubstr Function, entre parenthèses, se trouve la phrase suivante : "séparément, nous devons noter que dans la première boucle for (ma note : il doit s'agir de deinit() car il n'y a pas d'autre moyen de supprimer des objets) , nous ne pouvons pas supprimer d'objets car après chaque suppression, le nombre d'objets et leur numérotation changeront et certains noms d'objets seront ignorés". Mais dans l'EA citée, il n'y a pas du tout de deuxième boucle for . De plus, la variable Quant_Del définie dans la fonction deinit() avant la boucle for est initialisée avec zéro, alors que la variable i n'a été définie nulle part avant la boucle for.

   for(int k=0; k<=Quant_Del; i++)     // Удаляем объекты с именами,.. 
         ObjectDelete(Name_Del[i]);       // .. имеющимися в массиве

il s'avère que l'expert ci-dessus a juste trivialement omis plusieurs lignes de programme.

La 1ère question est donc la suivante : s'agissait-il vraiment d'une omission anodine de plusieurs lignes ou s'agit-il d'un programme si délicat qu'un novice ne peut en saisir le sens sans aide extérieure ?

De plus... Dans le même chapitre de la même section, il y a un lien vers le même conseiller expert (dans le fichier joint) avant le texte cité qui, lorsqu'on clique dessus, ouvre le même conseiller expert dans MetaElitor. Mais le texte de ce conseiller expert est différent: la fonction deinit()ressemble ici à ceci

//--------------------------------------------------------------- 9 --
int deinit()                           // Спец. функция deinit()
  {
   string Name_Del[1];                 // Объявление массива
   int Quant_Del=0;                    // Количество удаляемых объекто
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   ArrayResize(Name_Del,Quant_Objects);// Необходимый размер массива
   for(int k=0; k<Quant_Objects; k++)  // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Найден объект, ..
        {                              // .. начинающийся с Paint_
         Quant_Del=Quant_Del+1;        // Колич имён к удалению
         Name_Del[Quant_Del-1]=Obj_Name;//Запоминаем имя удаляемого
        }
     }
   for(int i=0; i<=Quant_Del; i++)     // Удаляем объекты с именами,.. 
      ObjectDelete(Name_Del[i]);       // .. имеющимися в массиве
   return;                             // Выход из deinit()
  }
//-------------------------------------------------------------- 10 --

Alors, si "combiner" la phrase "Par ailleurs, veuillez noter que vous ne pouvez pas supprimer des objets dans la première boucle for, car dans ce cas, le nombre total d'objets et leur numérotation changeront après chaque suppression, et certains noms d'objets seront ignorés en conséquence" ET texte fonction deinit() de la dernière variante, j'ai la 2ème question :

Question. Pourquoi ne puis-je pas supprimer des objets dans la première boucle for en plaçant la fonction ObjectDelete(Obj_Name) à l'intérieur de l'instruction if... ? Quelque chose comme :

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=0; k<Quant_Objects; k++)  // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --

Pourquoi après chaque suppression "... Le nombre total d'objets va changer"... ? Parce que dans ce cas, la variable Quant_Objects, qui détermine le nombre total d'objets, obtient sa valeur égale à ObjectsTotal(), FORWARD la boucle for?

P.S. Merci d'avance pour la réponse, afin de ne pas encombrer le forum.

Dossiers :
strings_1.mq4  7 kb
 

Bonjour, j'ai fait un bloc pour calculer les positions ouvertes d'achat magique, mais le problème est que si le bloc fonctionne sur différentes paires de devises, alors le bloc ne produit des résultats que pour une seule paire de devises (la dernière position ouverte). Comment puis-je corriger le code (sans changer la magie) pour que le bloc donne le résultat pour chaque paire de devises ?

int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
 
int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
так все " OP_BUY" les magiciens compteront
 
7777877:

... suite...

À la fin de la sous-section StringSubstr Function, entre parenthèses, se trouve la phrase suivante : "séparément, nous devons noter que dans la première boucle for (ma note : ce doit être deinit() car il n'y a pas d'autre moyen de supprimer des objets) , nous ne pouvons pas supprimer d'objets car après chaque suppression, le nombre total d'objets et leur numérotation changeront et certains noms d'objets seront ignorés". Mais dans l'EA citée, il n'y a pas du tout de deuxième boucle for . De plus, la variable Quant_Del définie dans la fonction deinit() avant la boucle for est initialisée avec zéro, alors que la variable i n'a été définie nulle part avant la boucle for.

il s'avère que le code ci-dessus omet trivialement plusieurs lignes de programme.

La 1ère question est donc la suivante : s'agissait-il vraiment d'une omission anodine de plusieurs lignes ou s'agit-il d'un programme si délicat qu'un novice ne peut en saisir le sens sans aide extérieure ?

De plus... Dans le même chapitre de la même section, il y a un lien vers le même conseiller expert (dans le fichier joint) avant le texte cité qui, lorsqu'on clique dessus, ouvre le même conseiller expert dans MetaElitor. Mais le texte de ce conseiller expert est différent: la fonction deinit() ressemble à ceci

Alors, si "combiner" la phrase "Par ailleurs, veuillez noter que vous ne pouvez pas supprimer des objets dans la première boucle for, car dans ce cas, le nombre total d'objets et leur numérotation changeront après chaque suppression, et certains noms d'objets seront ignorés en conséquence" ETtexte fonction deinit() de la dernière variante, j'ai la 2ème question :

Question. Pourquoi ne puis-je pas supprimer des objets dans la première boucle for en plaçant la fonction ObjectDelete(Obj_Name) dans l'instruction if?

Pourquoi après chaque suppression "... Le nombre total d'objets va changer"... ? Parce que dans ce cas, la variable Quant_Objects, qui détermine le nombre total d'objets, obtient sa valeur égale à ObjectsTotal(), FORWARD la boucle for?

P.S. Merci d'avance pour la réponse, afin de ne pas encombrer le forum.

Tournez le cycle à l'envers et supprimez autant que vous le souhaitez.
 
FAQ:
Développez la boucle vers l'arrière et supprimez tout ce que vous pouvez.

Est-ce que je vous ai bien compris ? Vous devez considérer la fonction deinit (et la boucle en particulier) de la manière suivante :

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=Quant_Objects; k>=0; k--) // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --
 
Elektronik:


Ces données sont nécessaires pour calculer la différence entre les ordres d'achat et de vente.

supposons qu'un ordre d'achat avec un volume de 0,09 lot et deux ordres de vente avec un volume total de 0,11 lot aient été ouverts, la différence entre eux sera de 0,09-0,11=-0,02, ou si possible la différence entre leurs valeurs.


Alors la fonction OrderLots.
 
abeiks:

Bonjour, j'ai fait un bloc pour calculer les positions ouvertes d'achat magique, mais le problème est que si le bloc fonctionne sur différentes paires de devises, alors le bloc ne produit des résultats que pour une seule paire de devises (la dernière position ouverte). Comment puis-je corriger le code (sans changer la magie) pour que le bloc calcule pour toutes les paires de devises ?

Changez :

if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )

A :

if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
 
Comment remplacer le stop loss en pips dans l'EA, par un stop loss au-dessus de la dernière bougie ?
 
Neo777:
Comment remplacer le stop loss en pips dans l'EA, par un stop loss au-dessus de la dernière bougie ?
double x = ... // Задаем на сколько пипсов выше
double sl = NormalizeDouble(High[1] + x * Point, Digits); // Задаем значение стоплосс на x пипсов выше предпоследней свечи
 

Reshetov:спасибо
извиняюсь за то что не в SRC

comment l'insérer ici

Raison: