Logica di apprendimento - pagina 12

 

Victor, penso che l'interruttore sia meglio qui - è più veloce e più visivo.

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, a proposito -- una ragionevole ottimizzazione del lavoro nel tester -- l'ho usato ultimamente.

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);
}

A proposito, la funzione si chiama FindLastOpenTime e restituisce un biglietto.

Sarebbe meglio così?

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

Victor, penso che lo scambio sia migliore qui - è più veloce e più chiaro.


È davvero più chiaro.
 

TheXpert:

A proposito, la funzione si chiama FindLastOpenTime, ...

L'idea è che
if (lOrderOpenTime<OrderOpenTime()) {
         lOrderOpenTime=OrderOpenTime(); 
         Res=OrderTicket();
      }
potrebbe iniziare a funzionare proprio a -1, non sono del tutto sicuro del perché abbia bisogno di un if...else esterno. Ritorno, imho, è davvero meglio lOrderOpenTime, poi ritorno -1 permetterà di catturare l'errore.
 
Sì, non l'ho fatto.
 

è logico usare questo tipo di cose?

int Z[];

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

  Z++;
....

return(Z);
}
start()
{
   .......
   Z[f]=3;
   ......
}
 
No. La z logica (piccola) all'interno. In generale, è meglio non scherzare con queste cose.
 

ha sempre ucciso la logica di una tale costruzione in operandi ciclici:

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

vedere aiuto :

L'istruzione continue trasferisce il controllo all'inizio dell'istruzione esterna while o for più vicina, causando l'inizio della prossima iterazione. Questo operatore è l'opposto di break.

Non è per niente chiaro, e se un ordine non passa le condizioni allora cosa? Uscire dal ciclo? se l'operatore continue è direttamente opposto all' operatore break...

Per me, la logica standard è più chiara e comprensibile:

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:

Puntura #2. Logica (logica) e brevità hanno poca correlazione.

Un primo esempio direttamente da MQL, che, tra l'altro, molte persone non sono schizzinose nell'usare.

Questa non è logica, è un omicidio della logica. Inoltre, è un potenziale terreno fertile per gli errori impliciti.


Non sei sicuro di dove sia la foratura? E perché il secondo? Se è il secondo, dov'è il primo?
 
Integer:
Per coloro che non hanno un ufficio o una zip.

Dima aggiunge qualcosa per coloro che non hanno metaeditor.exe :-)

 
Vinin:


Victor, ancora complimenti!

Motivazione: