Trailingstop EA funktioniert nicht

 

Hallo zusammen, ich kann meinen EA nicht richtig zum Laufen bringen. Ich lasse ihn auf 10 verschiedenen Paaren/Charts gleichzeitig laufen. Es scheint zwei Probleme zu geben:

1. der Trailingstop wird die meiste Zeit nicht ausgelöst, manchmal funktioniert er jedoch. Ich denke, das Problem liegt an meiner OrderSelect, kann es aber nicht lösen.

2. manchmal bekomme ich die Fehlermeldung 130, aber ich kann nicht sehen, wie mein SL/TP ungültig sein kann. Alle Werte, die ich ausdrucke, liegen über dem Stoplevel für alle Paare. Und obwohl ich die Fehlermeldung 130 bekomme, ändert er manchmal die Order, als ob nichts falsch wäre.

Hier ist der gesamte EA. Würden Sie ihn sich bitte ansehen und mir mitteilen, wo das Problem liegen könnte?

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=11;
extern string Label_TrailingStop="Pips trailing behind";
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop+1)+" Pips");
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+1;
   
   Print("stoplevel = ",stoplevel);
   Print("TrailingStart = ",TrailingStart);
   Print("TrailingStop = ",TrailingStop);
   Print("TS = ",TS);
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS)){
         if(OrderSymbol()!=Symbol()) continue;{
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if(Bid-OrderOpenPrice()>TrailingStart*Pip){
                     if(OrderStopLoss()<Bid-TrailingStop*Pip){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Pip,OrderTakeProfit(),Blue))
                        Print("Buy = ",GetLastError());
                        Print("Bid = ",Bid);
                        Print("Bid-TrailingStop*Pip = ",Bid-TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if(OrderOpenPrice()-Ask>TrailingStart*Pip){
                     if(OrderStopLoss()>Ask+TrailingStop*Pip){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Pip,OrderTakeProfit(),Red))
                        Print("Sell = ",GetLastError());
                        Print("Ask = ",Ask);
                        Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        }
                    }
                }  
            }
         }
      }   
  return(0);
}
//+------------------------------------------------------------------+
 
  1. Sie haben mehrere falsch ausgerichtete Codeblöcke, die durch fehlende Klammern entstehen. Obwohl sie ausgeglichen sind, fehlen sie, z. B. am Anfang der "for"- und einiger "if"-Blöcke
  2. Die Zeile"if(OrderSymbol()!=Symbol()) continue;{" ist sehr verdächtig und macht es schwierig zu erkennen, wie der Codefluss sein sollte. Machen Sie einfach"if(OrderSymbol()==_Symbol) {" daraus. Anstelle von"Symbol()" können Sie auch"_Symbol" verwenden.
  3. Verwenden Sie"OrderClosePrice()" und nicht"Ask" oder"Bid".
  4. Fügen Sie bei Vergleichen Klammern ein, um die Lesbarkeit zu erhöhen und die Reihenfolge der Dinge zu gewährleisten. Verwenden Sie zum Beispiel statt"if(Bid-OrderOpenPrice()>TrailingStart*Pip)""if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip ) )".
  5. Versuchen Sie, die Codeblöcke "Buy" und "Sell" in einem einzigen Codeblock zusammenzufassen, der beide behandelt. Dadurch wird der Code weniger fehleranfällig und kann in Zukunft leichter gelesen und geändert werden.

PS! ACHTUNG! Verwenden Sie auch eine Magic Number für die Orders!

PS! Denken Sie auch daran, den Schlupf zu berücksichtigen, der die 130 Fehler verursachen kann. Ein Minimum von StopLevel allein ist nicht genug. Legen Sie ihn etwas höher an, um mögliche Abweichungen zu berücksichtigen, z. B. durch Hinzufügen eines Faktors für den aktuellen Spread. Möglicherweise hat der Broker auch ein FreezeLevel eingerichtet!

 
FMIC:
  1. Sie haben mehrere falsch ausgerichtete Codeblöcke aufgrund fehlender Klammern. Obwohl sie ausgeglichen sind, fehlen sie, z. B. am Anfang der "for"- und einiger "if"-Blöcke
  2. Die Zeile"if(OrderSymbol()!=Symbol()) continue;{" ist sehr verdächtig und macht es schwierig zu erkennen, wie der Codefluss sein sollte.
    Sagen Sie einfach"if(OrderSymbol()==_Symbol) {". Anstelle von"Symbol()" können Sie auch"_Symbol" verwenden.
  3. Verwenden Sie"OrderClosePrice()" und nicht"Ask" oder"Bid".
  4. Fügen Sie bei Vergleichen Klammern ein, um die Lesbarkeit zu erhöhen und die Reihenfolge der Dinge zu gewährleisten:
    Verwenden Sie zum Beispiel statt"if(Bid-OrderOpenPrice()>TrailingStart*Pip)""if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip ) )"
  5. Versuchen Sie, die Codeblöcke "Buy" und "Sell" in einem einzigen Codeblock zusammenzufassen, der beide behandelt. Dadurch wird der Code weniger fehleranfällig und kann in Zukunft leichter gelesen und geändert werden.

PS! ACHTUNG! Verwenden Sie auch eine Magic Number für die Orders!

PS. Denken Sie auch daran, den Slippage zu berücksichtigen, der die 130 Fehler verursachen kann. Ein Minimum von StopLevel allein ist nicht ausreichend. Legen Sie ihn etwas höher an, um möglichen Slippage zu berücksichtigen, indem Sie beispielsweise einen Faktor des aktuellen Spreads hinzufügen. Möglicherweise hat der Broker auch ein FreezeLevel eingerichtet!

Vielen Dank für Ihre Antwort und Ihren Versuch, mir zu helfen. Ich habe ein paar Fragen/Anmerkungen:

1. in #1 schlugen Sie vor, dass ich Klammern () hinzufügen sollte, was ich gemäß Ihrem Vorschlag in #4 getan habe. Aber ich sehe nicht, wie ich Klammern () am Anfang des "for" hinzufügen kann. Können Sie das bitte erklären, oder meinten Sie geschweifte Klammern {}?

2. ich habe es in _Symbol geändert, aber um mein Wissen zu verbessern, frage ich mich, ob Sie mir bitte erklären können, worin der Vorteil/Vorteil der Verwendung von _Symbol gegenüber Symbol() besteht?

3. ich habe alle Asks und Bids in OrderClosePrice() geändert, aber könnten Sie mir bitte erklären, worin der Nutzen/Vorteil dieser Änderung besteht?

4. ich habe dies getan

5 Ich werde versuchen, dies weiter zu vereinfachen.

6 Da ich meine Trades manuell eingebe, kann ich meines Wissens nach keine MagicNumbers verwenden. Stimmt das nicht?

7. ich sehe nicht, wie oder wo ich Slippage berücksichtigen kann. Würden Sie mir bitte sagen, wo oder wie ich dies hinzufügen kann. Bei OrderModify sind nur die folgenden Parameter möglich:

bool  OrderModify(
   int        ticket,      // ticket
   double     price,       // price
   double     stoploss,    // stop loss
   double     takeprofit,  // take profit
   datetime   expiration,  // expiration
   color      arrow_color  // color
   );

8 In meinem Code habe ich bereits 1 Pip (10 Punkte) zum Minimum Stoplevel hinzugefügt, was in den meisten Fällen den Spread berücksichtigen sollte.

9. ich habe die Freezelevel für alle Paare ausgedruckt und sie sind alle 0.0, also scheint es kein Problem zu sein.

10. obwohl ich immer noch Fehler 130 und Fehler eins erhalte, wenn der EA funktioniert, modifiziert und schließt er immer noch die Bestellung. So wie diese Ergebnisse, erhalte ich den Fehler, da die Bestellung zur gleichen Zeit modifiziert wird. Als ob es ein Teilzeitproblem ist:

2016.04.15 13:11:06.183 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28598 tp: 0.00000 ok

2016.04.15 13:11:05.860 Trailing_v18 USDCAD,M15: Kaufen = 130

2016.04.15 13:10:58.939 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28597 tp: 0.00000 ok

2016.04.15 13:10:57.835 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28596 tp: 0.00000 ok

2016.04.15 13:10:56.974 Trailing_v18 USDCAD,M15: Kaufen = 130

2016.04.15 13:10:56.531 Trailing_v18 USDCAD,M15: Kaufen = 130

2016.04.15 13:10:56.263 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28590 tp: 0.00000 ok

2016.04.15 13:10:54.318 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28582 tp: 0.00000 ok

2016.04.15 13:10:53.175 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28581 tp: 0.00000 ok

2016.04.15 13:10:52.879 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28577 tp: 0.00000 ok

2016.04.15 13:10:51.810 Trailing_v18 USDCAD,M15: Kaufen = 130

2016.04.15 13:10:51.085 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28575 tp: 0.00000 ok

2016.04.15 13:10:50.744 Trailing_v18 USDCAD,M15: Kaufen = 130

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: Kaufen = 1

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: modify #50202284 buy 0.01 USDCAD at 1.28477 sl: 1.28571 tp: 0.00000 ok

Hier ist ein weiteres Beispiel, bei dem der Trailingstop deutlich über dem Stoplevel liegt (um 10 Pips/100 Punkte) und dennoch der Fehler 130 produziert wird:

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: Kauffehler = 130

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TS = 20

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStop = 5

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStart = 25

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: stoplevel = 10.0



 

Bitte liefern Sie den neuesten Code mit den von Ihnen vorgenommenen Änderungen. Andernfalls kann ich die von Ihnen vorgenommenen Änderungen nicht kommentieren, um zu sehen, ob sie korrekt sind.

  1. Entschuldigung, ich meinte geschweifte Klammern. Sie müssen das beheben, sonst wird es weiterhin scheitern. Dies ist der wichtigste Punkt von allen.
  2. a) Bei diesem Punkt geht es nicht primär um das "_Symbol", sondern um das "!=" und das "continue".
    b) "_Symbol" wird schneller ausgeführt, weil es sich um eine Variable handelt, während "Symbol()" als Funktionsaufruf ausgeführt würde, was langsamer ist.
  3. OrderClosePrice() ist der aktuelle Schlusskurs des Auftrags. Wenn die Order noch offen ist, wird automatisch der Geld- oder Briefkurs gemeldet, je nach Ordertyp. Bitte lesen Sie die Dokumentation zu dieser Funktion.
  4. OK! Lassen Sie uns die von Ihnen vorgenommenen Codeänderungen sehen.
  5. OK! Zeigen Sie uns die von Ihnen vorgenommenen Code-Änderungen.
  6. Ja, für manuelle Trades ist die magische Zahl 0. Definieren Sie jedoch in Ihrem Code die magische Zahl als "extern" oder "input", indem Sie ihr eine "0" als Standard zuweisen, und verwenden Sie diese Variable dann in Ihrem Code. Auf diese Weise können Sie den EA problemlos für andere Situationen verwenden oder Ihren Code für andere EAs wiederverwenden.
  7. Ich habe erklärt, wie Sie Slippage berücksichtigen können. Stellen Sie sicher, dass der "TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )", wobei Factor mindestens "1.0" ist (idealerweise "1.5" oder "2.0"; größer, wenn Sie sehen, dass Sie immer noch Fehler 130 aufgrund von übermäßigem Slippage erleben).
  8. Es gibt keine Garantie dafür, dass 10 Punkte den Spread ausgleichen, denn der Spread ist je nach Symbol unterschiedlich und ändert sich ständig, vor allem während Nachrichtenereignissen und bei geringer Liquidität, z. B. außerhalb der Geschäftszeiten.
  9. OK! Wenn "FreezeLevel" nicht verwendet wird, ist das in Ordnung, aber ich schlage vor, dass Sie es trotzdem in Ihrem Code berücksichtigen, so dass der EA auch dann noch funktioniert, wenn Sie ihn mit einem anderen Broker verwenden (der ihn vielleicht hat).
  10. Liefern Sie neuen Code mit Änderungen, damit er analysiert werden kann.
 
FMIC:

Bitte liefern Sie den neuesten Code mit den von Ihnen vorgenommenen Änderungen. Andernfalls kann ich die von Ihnen vorgenommenen Änderungen nicht kommentieren, um zu sehen, ob sie korrekt sind.

  1. Entschuldigung, ich meinte geschweifte Klammern. Sie müssen das korrigieren, sonst wird es weiterhin scheitern. Dies ist der wichtigste Punkt von allen.
  2. a) Bei diesem Punkt geht es nicht in erster Linie um das "_Symbol", sondern um das "!=" und das "continue".
    b) "_Symbol" wird schneller ausgeführt, weil es sich um eine Variable handelt, während "Symbol()" als Funktionsaufruf ausgeführt würde, was langsamer ist.
  3. OrderClosePrice() ist der aktuelle Schlusskurs des Auftrags. Wenn die Order noch offen ist, wird automatisch der Geld- oder Briefkurs gemeldet, je nach Ordertyp. Bitte lesen Sie die Dokumentation zu dieser Funktion.
  4. OK! Lassen Sie uns die von Ihnen vorgenommenen Codeänderungen sehen.
  5. OK! Zeigen Sie uns die von Ihnen vorgenommenen Code-Änderungen.
  6. Ja, für manuelle Trades ist die magische Zahl 0. Definieren Sie jedoch in Ihrem Code die magische Zahl als "extern" oder "input", indem Sie ihr eine "0" als Standard zuweisen, und verwenden Sie diese Variable dann in Ihrem Code. Auf diese Weise können Sie den EA problemlos für andere Situationen verwenden oder Ihren Code für andere EAs wiederverwenden.
  7. Ich habe erklärt, wie Sie Slippage berücksichtigen können. Stellen Sie sicher, dass der "TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )", wobei Factor mindestens "1.0" ist (idealerweise "1.5" oder "2.0"; größer, wenn Sie sehen, dass Sie immer noch Fehler 130 aufgrund von übermäßigem Slippage erleben).
  8. Es gibt keine Garantie dafür, dass 10 Punkte den Spread ausgleichen, denn der Spread ist je nach Symbol unterschiedlich und ändert sich ständig, vor allem während Nachrichtenereignissen und bei geringer Liquidität, z. B. außerhalb der Geschäftszeiten.
  9. OK! Wenn "FreezeLevel" nicht verwendet wird, ist das in Ordnung, aber ich schlage vor, dass Sie es trotzdem in Ihrem Code berücksichtigen, so dass der EA auch dann funktioniert, wenn Sie ihn mit einem anderen Broker verwenden (der ihn vielleicht hat).
  10. Liefern Sie neuen Code mit Änderungen, damit er analysiert werden kann.


Vielen Dank. Ich werde alle oben genannten Ratschläge und Vorschläge prüfen. In der Zwischenzeit ist hier der neueste Code. Ich glaube auch, dass ich einen Fehler in dieser Zeile gefunden habe:

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=12;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop+2)+" Pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   int ticket=0;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2;
   
   /*Print("stoplevel = ",stoplevel);
   Print("TrailingStart = ",TrailingStart);
   Print("TrailingStop = ",TrailingStop);
   Print("TS = ",TS);
   Print("Buy error = ",GetLastError());
                        Print("OrderOpenPrice = ",OrderOpenPrice());
                        Print("OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip = ",
                        OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip);
                        Print("OrderClosePrice-TrailingStop*Pip = ",OrderClosePrice()-TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        Print("TrailingStop*Pip = ",TrailingStop*Pip);
                        Print("OrderClosePrice = ",OrderClosePrice());
                        Print("OrderStopLoss = ",OrderStopLoss());
                        Print("OrderSymbol = ",OrderSymbol());
                        Print("OrdersTotal = ",OrdersTotal());
                        Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET));
                        Print("ticket = ",ticket);
                        Print("OrderTicket = ",OrderTicket());
                        Print("Selectbyticket = ",SELECT_BY_TICKET);
                        Print("Selectbypos = ",SELECT_BY_POS);
                        Print("Ask = ",Ask);
                        Print("OrderModify = ",OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),
                        OrderTakeProfit(),Blue));*/
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS)){
      ticket++;
         if(OrderSymbol()==_Symbol){
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderClosePrice()-OrderOpenPrice())>(TrailingStart*Pip)){
                     if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                        Print("Buy error = ",GetLastError());
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-OrderClosePrice())>(TrailingStart*Pip)){
                     if(TrailingStop>OrderClosePrice()+(TrailingStop*Pip)){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        Print("Sell error = ",GetLastError());
                        /*Print("Ask = ",Ask);
                        Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);*/
                        }
                    }
                }  
            }
         }
      }   
  return(0);
}
//+------------------------------------------------------------------+

Eine ziemlich große Änderung, die ich vorgenommen habe, war, dass ich die erste Zeile unten in die zweite geändert habe, weil ich denke, dass es einen Wert größer als Null für den Stoploss geben muss. Stimmt das?

 if(OrderStopLoss()<OrderClosePrice()-(TrailingStop*Pip)){
if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
 

Das folgende Codebeispiel dient als mögliche Lösung/Alternative zu Ihrem Code. Bitte beachten Sie jedoch, dass der Code nicht getestet oder debuggt wurde (nur kompiliert), verwenden Sie ihn also nur als "Pseudo"-Code:

#property strict

extern double
   dblTrailStartPips = 11.0,  // Trailing Start (Pips)
   dblTrailStopPips  = 5.0,   // Trailing Stop (Pips)
   dblPipMultiplier  = 10.0,  // Pips to Points Multiplier
   dblSpreadFactor   = 2.0;   // Spread Factor for Slippage Compensation
   
extern int
   intMagicNumber    = 0;     // Magic Number (0 for Manual Orders)
   
double
   dblTickSizeDelta,          // Size of a Tick (Delta)
   dblStopLevelDelta,         // Market Stop Level (Delta)
   dblTrailStartDelta,        // Trailing Start (Delta)
   dblTrailStopDelta;         // Trailing Stop (Delta)

// Initialisation
int OnInit()
{
   dblTickSizeDelta   = MarketInfo( _Symbol, MODE_TICKSIZE );
   dblStopLevelDelta  = MarketInfo( _Symbol, MODE_STOPLEVEL ) * _Point;
   dblTrailStartDelta = dblTrailStartPips * dblPipMultiplier  * _Point;
   dblTrailStopDelta  = dblTrailStopPips  * dblPipMultiplier  * _Point;
   
   return( INIT_SUCCEEDED );
}

// Process Tick Event
void OnTick()
{
   double
      dblSpreadDelta  = Ask - Bid,
      dblMinStopDelta = dblStopLevelDelta + ( dblSpreadDelta * dblSpreadFactor ),
      dblTrailDelta   = ( dblTrailStopDelta > dblMinStopDelta ) ? dblTrailStopDelta : dblMinStopDelta;
   
   for( int i = OrdersTotal() - 1; i >= 0; i-- )
   {
      if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         if( ( OrderSymbol() == _Symbol ) && ( OrderMagicNumber() == intMagicNumber ) )
         {
            int intDirection = 0;
            switch( OrderType() )
            {
               case OP_BUY:  intDirection = +1; break;
               case OP_SELL: intDirection = -1; break;
               default:                         continue;
            }
            
            double
               dblOpenPrice  = OrderOpenPrice(),
               dblCloseDelta = ( OrderClosePrice() - dblOpenPrice ) * intDirection;
               
            if( dblCloseDelta > dblTrailStartDelta )
            {
               double
                  dblStopLossPrice = OrderStopLoss(),
                  dblStopLossDelta = ( dblStopLossPrice  - dblOpenPrice ) * intDirection,
                  dblTrailingDelta = dblCloseDelta - dblTrailDelta;
               
               if( ( dblTrailingDelta > dblStopLossDelta ) || ( dblStopLossPrice == 0 ) )
               {
                  double dblStopLoss = round( ( dblOpenPrice + ( dblTrailingDelta * intDirection ) ) / dblTickSizeDelta ) * dblTickSizeDelta;
                  if( dblStopLoss != dblStopLossPrice )
                  {
                     if( !OrderModify( OrderTicket(), dblOpenPrice, dblStopLoss, OrderTakeProfit(), OrderExpiration() ) )
                     {
                        Print( "Order Modification Failed with Error: ", GetLastError() );
                     }
                  }
               }
            }
         }
      }
   }
}
 

Versuchen Sie dies Trader3000

Vergleichen Sie diesen Code mit dem, den Sie bereits haben... er ist sehr ähnlich und ich benutze ihn seit Jahren und er funktioniert wie eine Bombe...

//+------------------------------+
//| TRAILING STOP Function       |
//+------------------------------+
void Trailing_Stop_Function()
{
bool Ticket_TS_Long;
   for(int iTS_Long = OrdersTotal() - 1; iTS_Long >= 0 ; iTS_Long --)  
   {
      
      if(OrderSelect(iTS_Long,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol()
      && OrderType() == OP_BUY
      && OrderMagicNumber() == MagicNumberLong
      && Trailing_Stop_In_Pips > 0
      && Bid - OrderOpenPrice() > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() < Bid - (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Long = (OrderModify(OrderTicket(),OrderOpenPrice(),Bid - (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green));
         if (Ticket_TS_Long != true)
         {
         Print("TS-Order Modify Error ",GetLastError());
         }
      }
    } 
bool Ticket_TS_Short;
   for(int iTS_Short = OrdersTotal() - 1; iTS_Short >= 0 ; iTS_Short --)  
   {
      
   if(OrderSelect(iTS_Short,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol()
      && OrderType() == OP_SELL
      && OrderMagicNumber() == MagicNumberShort
      && Trailing_Stop_In_Pips > 0
      && OrderOpenPrice() - Ask > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() > Ask + (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Short = (OrderModify(OrderTicket(),OrderOpenPrice(),Ask + (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green));
         if (Ticket_TS_Short != true)
         {
         Print("TS-Order Modify Error ",GetLastError());
         }
      }
   }
}

Trail_After_Pips_Profit ist eine externe Double-Variable, die der Benutzer ausfüllt... und

PipMultiplier ist eine einfache Funktion, die den Dezimalpunktwert der Währung berechnet...

Wenn Sie MagicNumbers nicht verwenden, löschen Sie diese Kriterien....

Dies wird...oder besser gesagt "sollte" jeder Order auf jedem Chart folgen.....

Ich unterliege einer Korrektur, aber bei mir funktioniert es....

//+------------------------------------------+
//| Check for 5 Digits - Pipmultiplier       |
//+------------------------------------------+
   
   if(Digits==5||Digits==3) 
   {
   PipMultiplier = 10*Point;
   }
   else if(Digits==2) 
   {
   PipMultiplier = 100*Point;
   }
   
   else
   {
   PipMultiplier = Point;
   }
   

Ich bin beeindruckt von Ihrer Hilfe FMIC.... Gut gemacht

 

Mike.T:

Ich bin beeindruckt von Ihrer Hilfe FMIC.... Schönes Ding

Vielen Dank!

Ein Ratschlag: Verwenden Sie nicht "Ask" oder "Bid" - verwenden Sie stattdessen "OrderClosePrice()". Dies ist ein Echtzeitwert, unabhängig davon, ob es sich um einen Kauf- oder Verkaufsauftrag handelt.
 

@Mike.T: Etwas scheint mit Ihrem PipMulytiplier-Code nicht zu stimmen:

else if(Digits==2) 
{
   PipMultiplier = 100*Point;
}

Das scheint nicht korrekt zu sein! Warum wird er bei 2-stelligen Symbolen mit 100 multipliziert? Er sollte überhaupt nicht multipliziert werden! Es sollte die gleiche Bedingung sein wie bei 4-stelligen Symbolen.

Hier ist ein Beispiel. Wenn der Preis von USD/JPY von 108,65 auf 108,77 steigt, ist das ein Anstieg von 12 Pips, nicht von 1200 Pips!
 
FMIC:

Ich danke Ihnen!

Ein Ratschlag: Verwenden Sie nicht "Ask" oder "Bid" - verwenden Sie stattdessen "OrderClosePrice()". Dies ist ein Echtzeitwert, unabhängig davon, ob es sich um einen Kauf- oder Verkaufsauftrag handelt.

Danke... das wusste ich nicht....... (ohne diesen Thread zu kapern)... Ich sollte lieber OrderClosePrice() anstelle von Bid oder Ask verwenden...?
 
Mike.T:
Danke... ich wusste nicht, dass.... so... (ohne diesen Thread zu kapern)... Ich sollte lieber OrderClosePrice() anstelle von Bid oder Ask verwenden...?
Ja! Aus den genannten Gründen (siehe Dokumente) und weil Sie damit sowohl die Kauf- als auch die Verkaufslogik in einem Codeblock zusammenfassen können, wie ich in meinem Beispiel gezeigt habe.
Grund der Beschwerde: