Logik lernen - Seite 12

 

Victor, ich denke, der Schalter ist hier besser - er ist schneller und visueller.

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, übrigens - vernünftige Optimierung der Arbeit im Tester - ich habe es in letzter Zeit benutzt.

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

Übrigens heißt die Funktion FindLastOpenTime und gibt ein Ticket zurück.

Wäre es besser so?

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

Victor, ich denke, der Wechsel ist hier besser - er ist schneller und klarer.


Es ist wirklich klarer.
 

TheXpert:

Übrigens, die Funktion heißt FindLastOpenTime, ...

Die Idee ist, dass
if (lOrderOpenTime<OrderOpenTime()) {
         lOrderOpenTime=OrderOpenTime(); 
         Res=OrderTicket();
      }
kann es direkt bei -1 anfangen zu funktionieren, ich bin mir nicht ganz sicher, warum es ein externes if...else braucht. Return, imho, ist wirklich besser lOrderOpenTime, dann return -1 wird es erlauben, den Fehler zu fangen.
 
Ja, das habe ich nicht.
 

Ist es logisch, so etwas zu verwenden?

int Z[];

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

  Z++;
....

return(Z);
}
start()
{
   .......
   Z[f]=3;
   ......
}
 
Nein. Das logische z (klein) innen. Im Allgemeinen ist es am besten, nicht mit diesen Dingen herumzuspielen.
 

immer die Logik einer solchen Konstruktion in zyklischen Operanden getötet:

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

siehe Hilfe :

Die continue-Anweisung übergibt die Kontrolle an den Beginn der nächsten externen while- oder for-Anweisung, was den Beginn der nächsten Iteration bewirkt. Dieser Operator ist das Gegenteil von break.

Es ist überhaupt nicht klar, und wenn ein Auftrag die Bedingungen nicht erfüllt, was dann? Die Schleife verlassen? wenn der continue-Operator direkt gegenüber dem break-Operator steht ...

Für mich ist die Standardlogik klarer und verständlicher:

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:

Einstich #2. Logik (Logik) und Kürze haben wenig miteinander zu tun.

Ein Paradebeispiel dafür ist MQL, bei dessen Verwendung viele Menschen übrigens nicht zimperlich sind.

Das ist keine Logik - es ist ein Mord an der Logik. Darüber hinaus ist sie ein potenzieller Nährboden für implizite Fehler.


Sie sind sich nicht sicher, wo die Panne ist? Und warum die zweite? Wenn es die zweite ist, wo ist dann die erste?
 
Integer:
Für diejenigen, die kein Büro oder keinen Reißverschluss haben.

Dima fügen Sie etwas für diejenigen, die nicht haben metaeditor.exe :-)

 
Vinin:


Victor, nochmals herzlichen Glückwunsch!

Grund der Beschwerde: