Schleifen und Schließen oder Löschen von Aufträgen - Seite 2

 

Was passiert, wenn der OrderSelect die Bestellung nicht auswählt?
Die Bedingung OrderMagicNumber==MagicNo würde niemals wahr sein. Es besteht also keine Notwendigkeit, das Ergebnis von OrderSelect zu prüfen und bei einem Fehler fortzufahren.

Es ist besser, wenn Sie OrderSelect prüfen, um die Schleifenvariable zu verringern. Beispiel:

for(PositionIndex = 0; PositionIndex < OrdersTotal() ; PositionIndex ++)  
   {
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) { PositionIndex--; continue; }
 
  1. Wenn orderSelect fehlschlägt, kann es sein, dass Sie die magische Zahl der letzten ausgewählten Bestellung oder etwas anderes im Speicher haben, das übereinstimmen könnte. Immer prüfen.
  2. Sie müssen IMMER rückwärts zählen. Angenommen, während Sie an Position 3 gearbeitet haben, wurde Position 0 geschlossen. Der nächste Auftrag, an dem Sie arbeiten wollten, war Position 4, wird aber an Position 3 sein, wenn Sie die Schleife durchlaufen und positionIndex auf 4 erhöhen. Sie haben jetzt einen Auftrag verpasst. Durch das Abwärtszählen können Sie denselben Auftrag ein zweites Mal bearbeiten, aber Sie werden keinen verpassen.
 
WHRoeder:
  1. Wenn orderSelect fehlschlägt, kann es sein, dass Sie die magische Nummer der letzten ausgewählten Bestellung oder etwas anderes im Speicher haben, das übereinstimmen könnte. Überprüfen Sie das immer.
  2. Sie müssen IMMER rückwärts zählen. Angenommen, während Sie an Position 3 arbeiteten, wurde Position 0 geschlossen. Der nächste Auftrag, an dem Sie arbeiten wollten, war Position 4, wird aber an Position 3 sein, wenn Sie die Schleife durchlaufen und positionIndex auf 4 erhöhen. Sie haben jetzt einen verpasst. Durch das Abwärtszählen können Sie denselben Auftrag ein zweites Mal bearbeiten, aber Sie werden keinen verpassen.

1- Wer hat dir das gesagt? Und von welchem Speicher sprichst du?


2- Ich habe nicht erwähnt, dass ich ab- oder aufwärts zähle. Der Code selbst zählt nicht abwärts.

 
  1. OrderMagicNumber() und die anderen geben IMMER etwas zurück. Wenn OrderSelect() fehlgeschlagen ist, erhalten Sie zufälligen Müll, Überbleibsel, vielleicht von der vorherigen erfolgreichen Auswahl, vielleicht für den Wert der letzten abgeschlossenen Bestellung, vielleicht was auch immer in einem Register ist. Haben Sie jemals versucht, einen Zeiger auf ein gelöschtes Objekt zu derefenzieren? Speicher, das ist der kleine schwarze Chip auf der Platine. Versuchen Sie dies
    int start(){    Print(Whatever()); }
    double Whatever(){
       for(i=0; i<10; i++) double tmp=Close[i];
       // no value returned
    }
    und poste ein paar Ausgaben.
  2. Ich weiß, dass "der bereitgestellte Code selbst nicht herunterzählt". Genau das ist das Problem. Zählen Sie immer abwärts! Ihr Dekrement wird nicht funktionieren und ist eine potentielle Endlosschleife.
    if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) { PositionIndex--; continue; }

 

Gibt es einen bestimmten Grund, warum Sie den Code:

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

anstelle von (?)

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

Ich weiß, dass dies nach einigen Kodierungsstandards ein Tabu ist. Bietet es eine bessere Leistung oder ist es nur eine Vorliebe?

 
burgie:

Gibt es einen bestimmten Grund, warum Sie den Code:

anstelle von (?)

Ich weiß, dass dies nach einigen Kodierungsstandards ein Tabu ist. Bietet es eine bessere Leistung oder ist es nur eine Vorliebe?

Ich kann mich an keinen bestimmten Grund erinnern ... Ich weiß nicht wirklich, was logisch ist, warum sollte OrderSelect() jemals fehlschlagen? und wenn es fehlschlägt, was sollte getan werden?
 
burgie:

Gibt es einen bestimmten Grund, warum Sie den Code:

anstelle von (?)

Ich weiß, dass dies nach einigen Kodierungsstandards ein Tabu ist. Bietet es eine bessere Leistung oder ist es nur eine Vorliebe?


Innerhalb einer Schleife ist es genau dasselbe, wählen Sie, was Sie bevorzugen.
 
burgie:

Gibt es einen bestimmten Grund, warum Sie den Code:

anstelle von (?)

Ich weiß, dass dies nach einigen Kodierungsstandards ein Tabu ist. Bietet es eine bessere Leistung oder ist es nur eine Vorliebe?

 

if(orderselect(......)) dies ausführen //---kein Zurückgehen

if(!orderselect(.......))continue //zurückgehen und prüfen

 
MirTD:

if(orderselect(......)) dies ausführen //---kein Zurückgehen

if(!orderselect(.......))continue //zurückgehen und prüfen

Ich habe die Frage, die mir zu meiner Kodierung gestellt wurde, bereits beantwortet.