Logique d'apprentissage - page 12

 

Victor, je pense que l'interrupteur est mieux ici - c'est plus rapide et plus visuel.

bool IsOrderType(int type)
{
   switch (type)
   {
      case OP_BUY:
      case OP_SELL:
      case OP_BUYLIMIT:
      case OP_SELLLIMIT:
      case OP_BUYSTOP:
      case OP_SELLSTOP:
         return (true);
   }
   return (false);
}


Oh, au fait -- optimisation raisonnable du travail dans le testeur -- je l'ai utilisé dernièrement.

int FindLastOpenTime(int tip, int imagic) 
{
   int Res=-1;
   int lOrderOpenTime=-1;
   
   for (int i = OrdersTotal() - 1; i >= 0; i--) 
   {
      if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))   continue;
      if (OrderSymbol() != Symbol())                     continue;
      if (OrderMagicNumber() != imagic)                  continue;
      if (!(tip==-1 || isOrderType(tip)))                continue;

      if (IsTesting()) return (OrderTicket());  // тут

      if (lOrderOpenTime==-1) { 
         lOrderOpenTime=OrderOpenTime(); 
         Res=OrderTicket();
      } else if (lOrderOpenTime<OrderOpenTime()) {
         lOrderOpenTime=OrderOpenTime(); 
         Res=OrderTicket();
      }
   }
   return (Res);
}

Au fait, la fonction s'appelle FindLastOpenTime et renvoie un ticket.

Ce serait mieux ainsi ?

datetime FindLastOpenTime(int tip, int imagic, int& ticket) 
{
   //...
}
 
TheXpert:

Victor, je pense que l'échange est mieux ici - c'est plus rapide et plus clair.


C'est vraiment plus clair.
 

TheXpert:

D'ailleurs, la fonction s'appelle FindLastOpenTime, ...

L'idée est que
if (lOrderOpenTime<OrderOpenTime()) {
         lOrderOpenTime=OrderOpenTime(); 
         Res=OrderTicket();
      }
il peut commencer à fonctionner à -1, je ne sais pas vraiment pourquoi il a besoin d'un if...else externe. Return, imho, est vraiment mieux lOrderOpenTime, puis return -1 permettra d'attraper l'erreur.
 
Oui, je ne l'ai pas fait.
 

est-il logique d'utiliser ce genre de choses ?

int Z[];

int Fn()
{
....
  int Z = 0;

  Z++;
....

return(Z);
}
start()
{
   .......
   Z[f]=3;
   ......
}
 
Non. Le z logique (petit) à l'intérieur. En général, il est préférable de ne pas s'embêter avec ce genre de choses.
 

a toujours tué la logique d'une telle construction en opérandes cycliques :

if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != imagic) continue;
if (!(tip==-1 || isOrderType(tip))) continue;

voir l'aide :

L'instruction continue transfère le contrôle au début de l'instruction externe while ou for la plus proche, provoquant le début de l'itération suivante. Cet opérateur est l'opposé de la pause.

Ce n'est pas clair du tout, et si un ordre ne passe pas les conditions, alors quoi ? sortir de la boucle ? si l'opérateur continue est directement opposé à l' opérateur break...

Pour moi, la logique standard est plus claire et plus compréhensible :

int FindLastOpenTime(int type, int imagic){int time = 0;
  for(int i = OrdersTotal() -1 ;i>=0;i--){
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
        if(OrderSymbol()==Symbol()){
           if(OrderType()==type){
              if(OrderMagicNumber()==magic){
                 if(OrderOpenTime()>time){
                    time=OrderOpenTime();
                 }
              }
           }
        }
     }
  }
  return(time);
}  
 
TheXpert:

Perforation n°2. La logique (la logique) et la brièveté ont peu de corrélation.

Un excellent exemple tiré de MQL, que beaucoup de gens n'hésitent d'ailleurs pas à utiliser.

Ce n'est pas de la logique. C'est un meurtre de la logique. En outre, c'est un terrain propice aux erreurs implicites.


Vous ne savez pas où se trouve la perforation ? Et pourquoi le deuxième ? Si c'est le second, où est le premier ?
 
Integer:
Pour ceux qui ne disposent pas d'un bureau ou d'un zip.

Dima ajoute quelque chose pour ceux qui n'ont pas metaeditor.exe :-)

 
Vinin:


Victor, encore toutes mes félicitations !

Raison: