Ich brauche Hilfe, um einen kleinen Fehler zu finden. - Seite 4

 
Wenn das so ist, dann bin ich in meinem 1. Code auch dann richtig, ich rufe OrderSelect() gleich nach der 1. for-Schleife ..... Das Problem ist nun, dass der Trailing Stop Loss nicht richtig funktioniert und ich habe immer noch keine Ahnung, wo das Problem liegt.
 
juniorlcq: verwendet die Countdown-Schleife, aber mit x-- . Ich verstehe allerdings nicht, warum Sie --x vorschlagen.
  1. x++ liest den Wert, speichert eine Kopie, erhöht den Wert, speichert den neuen Wert in x undruft die Kopie zur späteren Verwendungab.
  2. ++x liest den Wert, inkrementiert den Wert, speichert den neuen Wert in x
  3. Bei Ganzzahlen macht das kaum einen Unterschied. Auf einigen Plattformen ist der letztere ein einziger Befehl, was ihn um ein Vielfaches schneller macht.
  4. Für Klassen (wie Iteratoren) gibt es einen zusätzlichen Konstruktor- und Destruktoraufruf, was die Sache um ein Vielfaches schneller macht.
    Präfix-Operator++
    Postfix-Operator++
    RaRev* RaRev::operator++(void){         // prefix
       ++mPos;
       return GetPointer(this); // Allow (++It).Get()
    }
    
    RaRev RaRev::operator++(int){               // postfix
       RaRev  orig(this); // Make a copy to return.
       ++this;            // Increment myself.
       return orig;       // Return the original position.
    }
    
    In den meisten STL-Implementierungen sieht man häufig "Iterator last=end; --end;" statt "Iterator last=end--".

 

Angenommen, der Preis steigt um 600 Punkte ab OrderOpenprice(), = StartTraillingStop (200) + 8(xai)*50

Der Code steht hier:

  if ( xai >= 8 ) 
    {
    if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )
        {
        if ( OrderStopLoss() == ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * ( xai - 1 ) ) ) * Figure ) ) )
           {
            Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
       }
    }

aber der Code wird alle xai von 0 bis 8 machen, sagen wir, der Code ist bei xai = 4; ist diese Bedingung wahr?

if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )

ja, dann wird der SL gesetzt auf : StartTraillinStop (200) + 4(xai)*50 ( absteigend vom vorherigen)

dann xai 5, der SL wird gesetzt auf : StartTraillinStop (200) + 5(xai)*50

und so weiter, so dass es nicht möglich ist, eine Pause zu setzen, sobald der SL gesetzt ist;

 

juniorlcq Ihr Code ist jetzt, da Sie ihn neu formatiert haben, viel leichter zu lesen. Ich habe ihn ein wenig umformatiert, um ihn für die Veröffentlichung kleiner zu machen, und ich habe mögliche Probleme hervorgehoben. Ich denke, Sie haben vielleicht ein "double == calculated double"-Problem, das Ihren Code daran hindert, einige der Trails auszuführen. Haben Sie jemals den Thread über can price != price gelesen ?

Am verdächtigsten finde ich die 2. und 4., da es sich um kompliziertere Berechnungen handelt.

Fügen Sie Print()-Anweisungen nach diesen Berechnungen ein, um zu sehen, ob sie wirklich == sind oder nicht.

Der Fehler, der als Fließkommafehler bekannt ist, könnte sie != machen, auch wenn es so aussieht, als sollten sie == sein.

== ist wirklich nur bei ganzen Zahlen zu 100% sicher, also könnten Sie das == testweise in <= oder >= ändern.

  void ProcessTrailingStop()
 {
  bool Result;
  for(int x=(OrdersTotal()-1); x>=0; x--)
  {if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==True)
   {PointsDetection();
    if(OrderType()==OP_BUY)
    {for(int xai=0; xai<NumberOfTrail; xai++)
     {if(xai==0)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=StartTrailingStop)
       {if(( OrderStopLoss()==0) || (OrderStopLoss()<(OrderOpenPrice()+(TrailingStop*Figure))))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+(TrailingStop*Figure)),OrderTakeProfit(),0,Color);
      }}}
      if(xai==1)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=(StartTrailingStop+CummulativeValue))
       {if(OrderStopLoss()==(OrderOpenPrice()+(TrailingStop*Figure)))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+((TrailingStop+CummulativeValue)*Figure)),OrderTakeProfit(),0,Color);
      }}}
      if(xai>=2)
      {if(((OrderClosePrice()-OrderOpenPrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xai)))
       {if(OrderStopLoss()==(OrderOpenPrice()+(( TrailingStop+(CummulativeValue *(xai-1)))*Figure)))
        {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice()+(( TrailingStop+(CummulativeValue*xai))*Figure)),OrderTakeProfit(),0,Color);
    }}}}}else
    {if(OrderType()==OP_SELL)
     {for(int xaii=0; xaii<NumberOfTrail; xaii++)
      {if(xaii==0)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=StartTrailingStop)
        {if(( OrderStopLoss()==0) || (OrderStopLoss()>(OrderOpenPrice() -(TrailingStop*Figure))))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(TrailingStop*Figure)),OrderTakeProfit(),0,Color);
       }}}
       if(xaii==1)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+CummulativeValue))
        {if(OrderStopLoss()==(OrderOpenPrice() -(TrailingStop*Figure)))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+CummulativeValue)*Figure)),OrderTakeProfit(),0,Color);
       }}}
       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {if(OrderStopLoss()==(OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)))
         {Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
 }}}}}}}}}


Nebenbei bemerkt: Ihr Code wäre wesentlich effizienter, wenn Sie OrderOpenPrice(), OrderStopLoss() und OrderClosePrice() einmal zu Beginn der OrderSelect()-Schleife aufrufen und ihre Werte lokalen Variablen zuweisen würden, die im restlichen Code verwendet werden. Auf lokale Variablen kann viel schneller zugegriffen werden als auf Funktionsaufrufe, so dass Sie wiederholte Funktionsaufrufe für das gleiche Ergebnis vermeiden sollten... Als Faustregel gilt: Je mehr rosa Schrift Sie in Ihrem Code haben, desto langsamer wird die Leistung des EAs sein.

 

Ich verstehe, ich kann es nicht zum Laufen bringen, das kann mit Order Buy funktionieren, SL gehen wie erklärt runter:

   extern double CummulativeValue = 50.0 ;
   extern int    NumberOfTrail = 100 ;



  void ProcessTrailingStop()
   {
       double Figure = Point;
    color Color = Yellow;
  
    bool Result ;
         for ( int x =  OrdersTotal(); x >= 0 ; x-- )
         {
         if ( OrderSelect ( x , SELECT_BY_POS , MODE_TRADES ) == false) continue;
        if ( OrderType() == OP_BUY )
           {
                 for ( int xai = 0 ; xai < NumberOfTrail ; xai++ )
                     {
                        if ( xai == 0 )
                        {
                           if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= StartTrailingStop )
                           {
                              if ( OrderStopLoss() == 0 ) 
                              {
                               Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( TrailingStop * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                          } } }                        
                  
                        if ( xai == 1 )
                           {
                           if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + CummulativeValue ) )
                           {
                           Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + CummulativeValue ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                          } }                         
                        
                        if ( xai >= 2 )
                           {
                          if ( ( ( OrderClosePrice() - OrderOpenPrice() ) / Figure ) >= ( StartTrailingStop + ( CummulativeValue * xai ) ) )
                           {
                           Result = OrderModify ( OrderTicket() , OrderOpenPrice() , ( OrderOpenPrice() + ( ( TrailingStop + ( CummulativeValue * xai ) ) * Figure ) ) , OrderTakeProfit() , 0 , Color ) ;
                        } }                         
                     }
                  }
                  
       }}           
 
WHRoeder:
  1. x++ liest den Wert, speichert eine Kopie, erhöht den Wert, speichert den neuen Wert in x undruft die Kopie zur späteren Verwendungab.
  2. ++x liest den Wert, inkrementiert den Wert, speichert den neuen Wert in x
  3. Bei Ganzzahlen macht das kaum einen Unterschied. Auf einigen Plattformen ist letzteres ein einziger Befehl, was es um ein Vielfaches schneller macht.
  4. Bei Klassen (wie Iteratoren) gibt es einen zusätzlichen Konstruktor- und Destruktoraufruf, wodurch die Implementierung um ein Vielfaches schneller ist.
    Präfix-Operator++
    Postfix-Operator++
    In den meisten STL-Implementierungen werden Sie häufig "Iterator last=end; --end;" statt "Iterator last=end--" sehen.


Ohhhhhh, das wusste ich gar nicht. Danke WHRoeder :) .

Heißt das also, dass ,

sagen wir mal OrdersTotal() == 3 , mit der Countdown-For-Schleife for ( int x = ( OrdersTotal() - 1 ) ; x >= 0 ; x-- ) , x speichert den ersten Wert als 2, dann wird die for-Schleife von 2 an fortgesetzt, ohne OrdersTotal() erneut zu durchlaufen?

 
SDC:

juniorlcq Ihr Code ist jetzt, da Sie ihn neu formatiert haben, viel leichter zu lesen. Ich habe ihn ein wenig umformatiert, um ihn für die Veröffentlichung kleiner zu machen, und ich habe mögliche Probleme hervorgehoben. Ich denke, Sie haben vielleicht ein "double == calculated double"-Problem, das Ihren Code daran hindert, einige der Trails auszuführen. Haben Sie jemals den Thread über can price != price gelesen ?

Ich bin am meisten misstrauisch gegenüber der 2. und 4. da sie kompliziertere Berechnungen sind.

Setzen Sie Print()-Anweisungen nach diesen Berechnungen, um zu sehen, ob sie wirklich == tun oder nicht.

Der Fehler, der als Fließkommafehler bekannt ist, könnte sie != machen, auch wenn es so aussieht, als sollten sie == sein.

== ist wirklich nur bei ganzen Zahlen zu 100% sicher, also könnten Sie das == testweise in <= oder >= ändern.



Nein, ich habe diesen Thread nicht gelesen . Habe es gerade erst getan .

Was Sie vorgeschlagen haben, klingt logisch. Ein zweiter Gedanke: Wenn man auf MT4 Linien auf den Preiseigenschaften zeichnet, zeigt es nicht wirklich einen 5-stelligen Preis, sondern manchmal etwas mehr als das an.

Aber hier ist einer meiner schwimmenden Handel auf der einen der vorherigen Konto, ich druckte es aus, um zu sehen, was war das Doppel wie mit einem einfachen Druck Codierung. Seltsam MQL4 ich denke @.@ ?

Ich bin immer noch am Überlegen, wie ich den Double == Double-Teil ändern sollte .....

SDC:


Nebenbei bemerkt: Ihr Code wäre viel effizienter, wenn Sie OrderOpenPrice(), OrderStopLoss(), OrderClosePrice() einmal zu Beginn Ihrer OrderSelect()-Schleife aufrufen und ihre Werte lokalen Variablen zuweisen würden, die Sie im restlichen Code verwenden. Auf lokale Variablen kann viel schneller zugegriffen werden als auf Funktionsaufrufe, so dass Sie wiederholte Funktionsaufrufe für das gleiche Ergebnis vermeiden sollten... Als Faustregel gilt: Je mehr rosa Schrift in Ihrem Code, desto langsamer ist die Leistung des EA.

Ohhh ich wusste nicht, dass es einen großen Unterschied in der Ausführungsgeschwindigkeit gibt, danke für die Anleitung SDC. Wird nach Ihrem Leitfaden geändert, nachdem die Spur zu stoppen begann zu arbeiten.

 

Versuchen Sie, den letzten Codeblock durch diese Debug-Version zu ersetzen. Überprüfen Sie meinen Code, ich habe ihn nicht kompiliert.

       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {Print("debug2.1: first condition true");
         if(OrderStopLoss()==(OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)))
         {Print("debug2.2: second condition true");
          Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
         }else
         {Print("debug2.2: second condition false");
          Print("debug2.2: val1=",OrderStopLoss()," val2=",OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure));
 }}}}}}}}}

Das könnte etwas aufdecken, Sie könnten etwas ähnliches mit den anderen == Bedingungen tun.

 
SDC:

Versuchen Sie, den letzten Codeblock durch diese Debug-Version zu ersetzen. Sie könnten etwas Ähnliches mit der xa machen

Vielleicht bringt das etwas, man könnte auch mit den anderen == Bedingungen etwas Ähnliches machen.


Ja, das Problem taucht auf, es ist das " double == calculated double Problem ". Danke für den Hinweis auf das Problem SDC .

Vielen Dank für den Hinweis auf das gleiche Problem vorhin, aber ich habe es nicht richtig bearbeitet und dachte, es sei nicht das Problem.

Ich habe eine Frage und brauche eine Anregung, für das 2. und 3. if in der 2. for-Schleife, ist es besser, eine "between"-Anweisung einzufügen? Wie OrderStopLoss() >= x + 1 && x - 1 ?? Oder sollte ich einfach >= oder <= verwenden?

 

Ich hoffe, WHR liest das nicht, er wird einen Anfall bekommen, aber ich werde Ihnen raten, NormalizeDouble() .... zu versuchen, das sollte diese Bedingungen gleich machen, wenn sie gleich sein sollen. Es sollte nicht notwendig sein, dies auch für die OrderStopLoss()-Seite zu tun, aber wenn es immer noch nicht gleich ist, wenn es sein sollte, könnten Sie versuchen, es für beide Seiten der Bedingung zu tun....

       if(xaii>=2)
       {if(((OrderOpenPrice()-OrderClosePrice())/Figure)>=(StartTrailingStop+(CummulativeValue*xaii)))
        {Print("debug2.0: condition true");
         if(OrderStopLoss()==NormalizeDouble((OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure)),Digits));
         {Print("debug2.1: condition true");
          Result=OrderModify(OrderTicket(),OrderOpenPrice(),(OrderOpenPrice() -(( TrailingStop+(CummulativeValue*xaii))*Figure)),OrderTakeProfit(),0,Color);
         }else
         {Print("debug2.1: condition false");
          Print("debug2.1: val1=",OrderStopLoss()," val2=",OrderOpenPrice() -(( TrailingStop+(CummulativeValue *(xaii-1)))*Figure));
 }}}}}}}}}