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

 
paladin80:
Regardez où le total est utilisé ensuite. Le plus probable est que la boucle passe par les commandes pour (i=0 ; i<=total ; i++).

Au fait, oui... J'ai déjà ajouté le code complet de cette fonction ci-dessus :

void FindOrders()
{
// - 1 - == Инициализация переменных перед поиском ======================================
   int total = OrdersTotal() - 1;
   g_type = -1;                                    // На текущий момент у нас нет позиций
// - 1 - == Окончание блока =============================================================
 
// - 2 - == Непосредственно поиск =======================================================
   for (int i = total; i >= 0; i--)                // Используется весь список ордеров
      if (OrderSelect(i, SELECT_BY_POS))           // Убедимся, что ордер выбран
         if (MathFloor(OrderMagicNumber()) == i_magicNumber &&// Ордер открыт
             OrderSymbol() == Symbol())            // ..экспертом, который прикреплен к..
         {                                         // ..текущей паре
            g_ticket = OrderTicket();              // Запишем данные ордера
            g_type = OrderType();
         } 
// - 2 - == Окончание блока =============================================================
}

Je me suis dit qu'il serait plus logique de ne pas l'écrire de cette façon :

int total = OrdersTotal() - 1;

et ensuite mettre la boucle comme ceci :

for(i=total; i>=1; i--)

N'est-ce pas ? D'une certaine manière, on ne perçoit pas très bien quand le compteur du nombre de positions part de zéro... ce n'est pas logique et, par conséquent, pourquoi s'embrouiller...

 
hoz:

Au fait, oui... J'ai déjà ajouté le code complet de cette fonction ci-dessus :

Je me suis dit qu'il serait plus logique de ne pas l'écrire de cette façon :

et ensuite mettre la boucle comme ceci :

N'est-ce pas ? C'est juste que le compteur du nombre de positions à partir de zéro n'est pas perçu comme tel... Ce n'est pas logique et, par conséquent, il n'y a aucune raison de se tromper...

Il faut aller à zéro, pas à un, pour chercher des ordres.

for(i=total; i>=0; i--)

Un pro m'a expliqué un jour que nous recherchons un tableau d'ordres, et qu'il est préférable de commencer la recherche par un nombre plus élevé. Dans le tableau, le premier élément a l'index 0 (zéro), donc nous ne devrions pas atteindre 1 et c'est aussi la raison pour laquelle nous devrions aller à OrdersTotal() - 1, au lieu de simples OrdersTotal().

J'ai fait la recherche de commandes de cette façon :

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

Il faut aller à zéro, pas à un, pour chercher des ordres.

Un pro m'a expliqué un jour qu'il s'agit d'un tableau d'ordres et que, oui, il vaut mieux commencer par un chiffre plus grand. Dans le tableau, le premier élément a un index de 0 (zéro), donc pas à 1 et c'est aussi pour cette raison que nous avons besoin de OrdersTotal() - 1, et pas seulement de OrdersTotal().

C'est très intéressant. La première chose que j'ai faite a été d'ouvrir le manuel et d'essayer d'y trouver la réponse. Et puishttps://book.mql4.com/ru/trading/ordermodify a vu comment le tutoriel a fait déborder les choses :

 for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер

C'est le facteur qui m'a induit en erreur...

 
hoz:

Très intéressant. La première chose que j'ai faite a été d'ouvrir le manuel et d'essayer d'y trouver la réponse. Et puishttps://book.mql4.com/ru/trading/ordermodify j'ai vu que le manuel était exagéré :

C'est le facteur qui m'a induit en erreur...


Tu n'as pas remarqué la ligne suivante ?

   for(int i=1; i<=OrdersTotal(); i++)          // Цикл перебора ордер     
   {      
     if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
//
//Тут компенсируется отсутствие нуля с i-1
 
borilunad:


Tu n'as pas remarqué la ligne suivante ?

Non. Mais d'une certaine manière, c'est tordu de l'écrire. Je ne veux pas critiquer le manuel, mais... il est beaucoup plus adéquat de compter à partir de 0 plutôt que de -1. Sinon, vous auriez déjà pu commencer à partir de -30...

Commepaladin80 l'a souligné plus haut, à partir de 0 la valeur des tableaux serait plus adéquate qu'à partir de -N.

 
hoz:

Non. Mais d'une certaine manière, c'est tordu de l'écrire. Je ne veux pas critiquer le manuel, mais... il est beaucoup plus adéquat de compter à partir de 0 plutôt que de -1. Sinon, vous auriez déjà pu commencer à partir de -30...

Commepaladin80 l'a souligné plus haut, à partir de 0 la valeur des tableaux serait la plus adéquate, si à partir de -N.


Maintenant, pensez logiquement !

Ces variantes sont identiques, car si i = 0, nous devons chercher de 1 à OrderTotal(), c'est-à-dire de 0+1 à OrderTotal() - 1+1 (+1, car i++ est à la fin de l'instruction for) Et la même chose dans le tutoriel, seulement écrit de 1 à OrderTotal() et, pour ne pas compter de 2 à OrderTotal()+1, dans lafonction OrderSelect a ajouté -1 à i. Compris ?

D'ailleurs, il y a autant de programmeurs que de variantes. Chacun a sa propre vision, sa propre écriture !

 
hoz:

Non. Mais d'une certaine manière, c'est tordu de l'écrire. Je ne veux pas critiquer le manuel, mais... il est beaucoup plus adéquat de compter à partir de 0 plutôt que de -1. Sinon, vous auriez déjà pu commencer à partir de -30...

Commepaladin80 l'a souligné ci-dessus, 0 serait plus approprié pour les tableaux que -N.

Si vous êtes intéressé par la recherche de commandes, je peux vous suggérer le schéma suivant :

if (OrdersTotal()>0)
{  for (int i=OrdersTotal()-1; i>=0; i--)
   {  if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) // ордер выбирается среди открытых
                                                    // и отложенных ордеров
      {  if (OrderSymbol()!=Symbol()) continue;     // если не наш символ, то уходим
         if (OrderMagicNumber()!=555) continue;     // если не наш магик номер, то уходим
                                                    // можно поставить любые другие фильтры
         // ... ваши вычисления
      }
   }
}
 
hoz:

Non. Mais d'une certaine manière, c'est tordu de l'écrire. Je ne veux pas critiquer le manuel, mais... il est beaucoup plus adéquat de compter à partir de 0 plutôt que de -1. Sinon, vous auriez déjà pu commencer à partir de -30...

Commepaladin80 l'a souligné ci-dessus, 0 serait la manière la plus appropriée de lire les tableaux, par opposition à -N.

J'ai le même point de vue, le tutoriel a été écrit par une personne spécifique, c'est sa vision des choses (organisation de la boucle d'ordre), et il y a TOUJOURS beaucoup de décisions correctes. Il y a des vues justes, et il y a des vues justes et élégantes en même temps... :)
 
borilunad:


Et maintenant, pensez, y compris la logique !

Ces variantes sont identiques, car si i = 0, on essaie d'aller de 1 à OrderTotal(), c'est-à-dire de 0+1 à OrderTotal() - 1+1 (+1, car i++ est à la fin de l'instruction for) Et de même dans le tutoriel, seul de 1 à OrderTotal() est écrit et, pour ne pas compter de 2 à OrderTotal()+1, l'auteur du manuel a ajouté -1 à i dans la fonction OrderSelect. Compris ?

Bien sûr, je comprends. Mais je n'ai jamais vu de commandes analysées de cette façon auparavant :

if (OrderSelect(i-1,SELECT_BY_POS)==true)

habituellement juste sans ==true... J'ai même aimé ce point. Bien que ce soit intéressant, je n'avais jamais rencontré une telle méthode dans d'autres EA. Je comprends la logique, mais quand même.

 
Comment utiliser pour le calcul une valeur de muving datant de quelques barres, c'est-à-dire provenant de l'historique ? Si c'est juste une moyenne mobile
AlligatorJawsBuffer[i]=iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,i);
Et si c'est il y a -5 barres ?