Expert Advisors: Diff_TF_MA_EA - Seite 3

 
Rashid Umarov:
Die Codes sind aktualisiert worden.

Offenbar ist es eine Art Denkschule, wenn sie es so schreiben

   int total=PositionsTotal();
   for(int i=total-1; i>=0; i--)
     {
      ulong ticket=PositionGetTicket(i);
      if(ticket==0) continue;
      if(PositionGetInteger(POSITION_MAGIC)!=InpMagic)   continue;
      if(PositionGetString(POSITION_SYMBOL)!=symb)       continue;
      ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      double volume=PositionGetDouble(POSITION_VOLUME);
      if(type==POSITION_TYPE_BUY)
        {
         list_tickets_buy.Add(ticket);
         total_volume_buy+=volume;
        }
      else if(type==POSITION_TYPE_SELL)
        {
         list_tickets_sell.Add(ticket);
         total_volume_sell+=volume;
        }
     }
Warum nicht so?
  for(int i=PositionsTotal()-1; i>=0; i--)
    if (PositionGetTicket(i) &&
        (PositionGetInteger(POSITION_MAGIC)==InpMagic) &&
        (PositionGetString(POSITION_SYMBOL)==symb))  
    {
      double volume=PositionGetDouble(POSITION_VOLUME);
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         list_tickets_buy.Add(ticket);
         total_volume_buy+=volume;
        }
      else
        {
         list_tickets_sell.Add(ticket);
         total_volume_sell+=volume;
        }
    }


ZY

CorrectStopLoss(POSITION_TYPE_BUY,InpStopLoss)
 
fxsaber:

Offenbar ist es eine Art Denkschule, es so zu schreiben

Warum nicht so?
Vielleicht, weil Codes in der Basis nicht für logische Ableitungen und hundertfache Verschachtelung benötigt werden, sondern für Anfänger zum Verständnis?
 
fxsaber:
...

ZY

CorrectStopLoss(POSITION_TYPE_BUY,InpStopLoss)

Was ist denn der Unterschied? Habe mir den Code nicht angeschaut - ist das so ein Tippfehler da, oder ist das deine Frage?

 
Artyom Trishkin:
Vielleicht, weil Codes in der Basis nicht für logische Ableitungen und hundertfache Verschachtelungen benötigt werden, sondern für Anfänger zu verstehen sind?

Wo ist die Inversion? Wenn eine Position die Bedingungen erfüllt, arbeiten wir mit ihr. weiter - Ausgabe.

 
Artyom Trishkin:

Ist da ein Unterschied? Habe mir den Code nicht angeschaut - ist das so ein Tippfehler, oder ist das Ihre Frage?

//+------------------------------------------------------------------+
//| Gibt den korrekten StopLoss relativ zum StopLevel zurück |
//+------------------------------------------------------------------+
double CorrectStopLoss(const ENUM_POSITION_TYPE position_type,const int stop_loss)
  {
   if(stop_loss==0) return 0;
   double pt = _Point;
   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(_Symbol,SYMBOL_ASK) : SymbolInfoDouble(_Symbol,SYMBOL_BID));
   int lv=StopLevel();
   return(NormalizeDouble((position_type==POSITION_TYPE_BUY) ? fmin(price-lv*pt,price-stop_loss*pt)
                                                             : fmax(price+lv*pt,price+stop_loss*pt),_Digits));
  }     
 
fxsaber:

Wo ist der Knackpunkt? Wenn eine Position die Bedingungen erfüllt, arbeiten wir mit ihr. Das ist ein Ablenkungsmanöver.

Ach so... Es sind also nur die Vorlieben von jemandem.

Die Codes von Igor Kim haben zum Beispiel eine solche Verschachtelung. Ein solcher Code kann kompakter geschrieben werden (es ist seltsam, dass Sie mit Ihrem Hang zur Kürze eine mehrfache Verschachtelung von Codeblöcken vorschlagen, die leicht vermieden werden kann, wenn man den Code aufräumt und ihn anschaulicher gestaltet):

Sie schlagen diese Logik vor:

  • Prüfe Bedingung 1, es passt
    • Prüfe Bedingung 2, es passt
      • Prüfe Bedingung 3, es passt
        • Prüfe Bedingung 4, es passt
          • Arbeitet
        • Ende des Prüfblocks für Bedingung 4
      • Ende des Bedingungsprüfungsblocks 3
    • Ende der Bedingung Prüfblock 2
  • Ende der Bedingung 1 Prüfblock

Oder Sie können es so machen:

  • Bedingung 1 passt nicht - kein Bedarf
  • Bedingung 2 passt nicht - kein Bedarf
  • Bedingung 3 ist nicht geeignet - nicht erforderlich
  • Bedingung 4 passt nicht - nicht erforderlich
  • alle Bedingungen passen - wir funktionieren.

Der zweite Code ist klarer und kürzer

 

fxsaber:

//+------------------------------------------------------------------+
//| Gibt den korrekten StopLoss relativ zum StopLevel zurück |
//+------------------------------------------------------------------+
double CorrectStopLoss(const ENUM_POSITION_TYPE position_type,const int stop_loss)
  {
   if(stop_loss==0) return 0;
   double pt = _Point;
   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(_Symbol,SYMBOL_ASK) : SymbolInfoDouble(_Symbol,SYMBOL_BID));
   int lv=StopLevel();
   return(NormalizeDouble((position_type==POSITION_TYPE_BUY) ? fmin(price-lv*pt,price-stop_loss*pt)
                                                             : fmax(price+lv*pt,price+stop_loss*pt),_Digits));
  }     

Was ist los? Nun, ich denke, man hat beschlossen, das Problem zu beheben, damit es keine Fragen mehr gibt, wie Sie sie früher hatten.

Aber wenn jetzt jemand beschließt, den Expert Advisor so zu ändern, dass er mit schwebenden Aufträgen arbeitet, muss er hin und her wechseln, weil es einen Fehler in der Aufzählung der Eingaben geben wird.

Und ORDER_TYPE_BUY == POSITION_TYPE_BUY und ORDER_TYPE_SELL == POSITION_TYPE_SELL sind 0 und 1. Es gibt also keinen Unterschied. Aber die Eingabe ENUM_ORDER_TYPE macht es einfacher, sie für andere Auftragsarten zu ändern.

 
Artyom Trishkin:

Ahhhh. Das ist nur die Vorliebe von jemandem.

Die Codes von Igor Kim zum Beispiel haben solche Verschachtelungen. Ein solcher Code kann kompakter geschrieben werden (es ist seltsam, dass Sie mit Ihrem Hang zur Kürze eine mehrfache Verschachtelung von Codeblöcken vorschlagen, die leicht vermieden werden kann, wenn man den Code aufräumt und ihn anschaulicher gestaltet):

Sie schlagen diese Logik vor:

  • Prüfe Bedingung 1, es passt
    • Prüfe Bedingung 2, es passt
      • Prüfe Bedingung 3, es passt.
        • Prüfe Bedingung 4, es passt.
          • Arbeiten
        • Ende der Bedingung 4 Prüfblock
      • Ende der Bedingung 3 Prüfblock
    • Ende der Bedingungsprüfung Block 2
  • Ende der Bedingungsprüfung Block 1

So etwas wurde nicht gezeigt. Kim war dazu gezwungen, weil es zu diesem Zeitpunkt keine strenge Richtlinie gab.

Er schlug diese Möglichkeit vor:

Man kann es auch so machen:

  • Bedingung 1 passt nicht - nicht nötig
  • Bedingung 2 passt nicht - nicht nötig
  • Bedingung 3 passt nicht - nicht nötig
  • Bedingung 4 passt nicht - nicht nötig
  • alle Bedingungen passen - wir funktionieren.

Der zweite Code ist klarer und kürzer

 
fxsaber:

Er hat nichts dergleichen gezeigt. Kim war dazu gezwungen, weil es zu diesem Zeitpunkt keine Richtlinie gab.

Das ist es, was er vorgeschlagen hat:

Und das?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Expert Advisors: Diff_TF_MA_EA

fxsaber, 2018.02.02 09:36 Uhr.

Wo ist das Reversal? Wenn die Position die Bedingungen erfüllt, arbeiten Sie mit ihr. Wenn die Position die Bedingungen erfüllt, arbeiten wir mit ihr.


 
fxsaber:

Sie hat nichts dergleichen gezeigt. Kim war dazu gezwungen, weil es zu diesem Zeitpunkt keine Richtlinie gab.


Seltsam, wie habe ich es damals geschafft, mit continue ohne strict zu arbeiten? Und ich war nicht der Einzige - Vitya Nikolaev (Vinin) sagte mir damals, ich solle es tun.

Ich verstehe also Ihre Beschwerde über den Code und den Programmierer nicht, der ihn in einigen seiner Einstellungen geschrieben hat.