Boucles et fermeture ou suppression d'ordres - page 2

 

Que se passe-t-il si l'OrderSelect ne parvient pas à sélectionner la commande ?
La condition OrderMagicNumber==MagicNo ne sera jamais vraie. Il n'est donc pas nécessaire de vérifier le résultat de OrderSelect et de continuer s'il est faux.

Il est préférable de vérifier OrderSelect pour diminuer la variable de la boucle. Exemple :

for(PositionIndex = 0; PositionIndex < OrdersTotal() ; PositionIndex ++)  
   {
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) { PositionIndex--; continue; }
 
  1. Si le orderSelect échoue, vous pouvez obtenir le numéro magique de la dernière commande sélectionnée ou quelque chose laissé en mémoire et qui pourrait correspondre. Vérifiez toujours.
  2. Vous devez TOUJOURS compter à rebours. Supposons que pendant que vous travailliez sur la position 3, la position 0 a été fermée. Le prochain ordre sur lequel vous vouliez travailler était la position 4, mais il sera à la position 3 lorsque vous bouclerez et incrémenterez positionIndex à 4. Vous en avez maintenant manqué un. En décomptant, vous pouvez traiter le même ordre une seconde fois mais vous n'en manquerez aucun.
 
WHRoeder:
  1. Si le orderSelect échoue, vous pouvez obtenir le numéro magique de la dernière commande sélectionnée ou quelque chose laissé en mémoire et qui pourrait correspondre. Vérifiez toujours.
  2. Vous devez TOUJOURS compter à rebours. Supposons que pendant que vous travaillez sur la position 3, la position 0 a été fermée. Le prochain ordre sur lequel vous vouliez travailler était la position 4 mais sera à la position 3 lorsque vous bouclerez et incrémenterez positionIndex à 4. Vous en avez maintenant manqué un. En décomptant, vous pouvez traiter le même ordre une seconde fois mais vous n'en manquerez aucun.

1- Qui vous a dit ça ? Et de quelle mémoire parlez-vous ?


2- Je n'ai pas mentionné le comptage vers le bas ou vers le haut. Le code fourni lui-même ne compte pas vers le bas.

 
  1. OrderMagicNumber() et les autres renvoient TOUJOURS quelque chose. Si OrderSelect() a échoué, vous obtenez des déchets aléatoires, des restes, peut-être de la sélection précédente réussie, peut-être la valeur de la dernière commande fermée, peut-être ce qui se trouve dans un registre. Avez-vous déjà essayé de déréférencer un pointeur sur un objet supprimé ? La mémoire, c'est la petite puce noire sur le circuit imprimé. Essayez ceci
    int start(){    Print(Whatever()); }
    double Whatever(){
       for(i=0; i<10; i++) double tmp=Close[i];
       // no value returned
    }
    et postez des résultats.
  2. Je sais que "le code fourni lui-même ne compte pas". C'est ça le problème. Toujours compter vers le bas ! Votre décrémentation ne fonctionnera pas et c'est une boucle infinie potentielle.
    if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) { PositionIndex--; continue; }

 

Y a-t-il une raison spécifique pour laquelle vous avez codé :

if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;

au lieu de ( ?)

if( OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) )
{
  // statements if true
}

Je sais que c'est considéré comme un non-non par certaines normes de codage. Est-ce que cela donne une meilleure performance ou est-ce juste une préférence ?

 
burgie:

Y a-t-il une raison spécifique pour laquelle vous avez codé :

au lieu de ( ?)

Je sais que c'est considéré comme un non-non par certaines normes de codage. Est-ce que cela donne une meilleure performance ou est-ce juste une préférence ?

Je ne me souviens d'aucune raison spécifique... Je ne sais pas vraiment quelle est la chose logique à faire, pourquoi OrderSelect() devrait-il jamais échouer ? et s'il échoue, que doit-on faire ?
 
burgie:

Y a-t-il une raison spécifique pour laquelle vous avez codé :

au lieu de ( ?)

Je sais que c'est considéré comme un non-non par certaines normes de codage. Est-ce que cela donne une meilleure performance ou est-ce juste une préférence ?


Dans une boucle, c'est exactement la même chose, choisissez ce que vous préférez.
 
burgie:

Y a-t-il une raison spécifique pour laquelle vous avez codé :

au lieu de ( ?)

Je sais que c'est considéré comme un non-non par certaines normes de codage. Est-ce que cela donne une meilleure performance ou est-ce juste une préférence ?

 

if(orderselect(......)) exécutez ceci //---pas de retour en arrière

if(!orderselect(.......))continue //-revenir en arrière et vérifier

 
MirTD:

if(orderselect(......)) exécutez ceci //---pas de retour en arrière

if(!orderselect(.......))continue //-revenir en arrière et vérifier

J'ai déjà répondu à la question qui m'a été posée sur mon codage....