Trailingstop EA funktioniert nicht - Seite 3

 
FMIC: 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.
Nicht in Echtzeit.
  1. Bei Ask und Bid müssen Sie RefreshRates() nach Verzögerungen, d.h. zwischen mehreren Serveraufrufen, nach Sleep oder einer langen Berechnung aktualisieren.
  2. Bei OrderClosePrice wird der Preis nur bei einem OrderSelect aktualisiert. Daher müssen Sie nach einem Sleep oder einer langen Berechnung (oder wenn Sie eine Order zwischen OnTick-Aufrufen ausgewählt halten) eine neue Auswahl treffen.
    OrderSelect(OrderTicket(), SELECT_BY_TICKET); // Refresh OrderClosePrice
 
WHRoeder:
Nicht in Echtzeit.
  1. Bei Ask und Bid müssen Sie RefreshRates() nach Verzögerungen, d.h. zwischen mehreren Serveraufrufen, nach Sleep oder einer langen Berechnung einsetzen.
  2. Bei OrderClosePrice wird er nur bei einem OrderSelect aktualisiert. Daher müssen Sie nach einem Sleep oder einer langen Berechnung (oder wenn Sie eine Order zwischen OnTick-Aufrufen ausgewählt halten) erneut auswählen.

Vielen Dank für die Information. Ich war mir nicht bewusst, dass "OrderClosePrice()" gepuffert wird. Ich vermute also, dass weder "OrderClosePrice()" noch die "Ask"/"Bid" die ideale Echtzeitlösung sind.

Sind Sie jedoch auch der Meinung, dass "OrderClosePrice()" eine bessere Gesamtlösung ist als die Verwendung von "Ask"/"Bid", nachdem die "OrderSelect()" ausgeführt wurde?

Und für eine Echtzeitlösung, wenn sie tatsächlich benötigt wird, können wir auf die Alternativen zurückgreifen:

  • Neuauswahl der Order mit "OrderSelect()" (EDIT: ich habe vergessen, dies im ursprünglichen Beitrag aufzuführen, obwohl Sie darauf hingewiesen haben)
  • "RefreshRate()" mit "Ask"/"Bid"
  • "MarketInfo()" mit "MODE_ASK"/"MODE_BID" (alter MQL4-Stil)
  • "SymbolInfoDouble()" mit "SYMBOL_ASK"/"SYMBOL_BID" (neuer Stil MQL4+ und MQL5)
  • "SymbolInfoTick()" (was ich sowieso schon in den meisten meiner EA's verwende)
 
FMIC: Sind Sie jedoch der Meinung, dass "OrderClosePrice()" eine bessere Gesamtlösung ist als die Verwendung von "Ask"/"Bid" nach der "OrderSelect()"?
absolut.
 

Warum versuchen Sie, das Rad neu zu erfinden?

Schauen Sie hier - Sie finden alles, was Sie brauchen.

Wenn nicht, fangen Sie an, den Quellcode zu ändern.

 

Vielen Dank für die bisherige Hilfe. Ich glaube, ich habe jetzt das Problem mit dem Fehler 130 gelöst, aber irgendetwas stimmt mit meiner OrderSelect-Funktion nicht, was wahrscheinlich der Grund dafür ist, dass sie nur manchmal einige der Aufträge ändert. Im Folgenden finden Sie eine Liste der Dinge, die ich ausgedruckt habe. Das OrderTicket # ist völlig falsch. Diese Ticketnummer gehört zu einem Handel, den ich für den EURAUD geöffnet habe. Ich habe zwar nicht alle Ergebnisse einbezogen, aber es gibt tatsächlich mehrere Paare, bei denen die OrderTicket-Nummern nicht mit dem Paar im Handelsterminal übereinstimmen.

Könnte bitte jemand einen Blick darauf werfen und mir mitteilen, was mit OrderSelect nicht in Ordnung ist? Vielen Dank!

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 Ich denke, dass ticket den gleichen Wert wie OrdersTotal ausgeben sollte, also scheint es, dass mein Zähler nicht funktioniert.

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrderSelect = true

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrdersTotal = 11

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbypos = 0

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbyticket = 1

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: OrderTicket = 50213357

extern int TrailingStart=12;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   int ticket=0;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2;
   
   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);                     
                        
   {for(int i=OrdersTotal()-1; i>=0; i--){ //I added more curly brackets{}
      if(OrderSelect(i,SELECT_BY_POS)){
      ticket++;{
         if(OrderSymbol()==_Symbol){
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){ //For now, I have changed back to Bid and Ask and will include OrderClosePrice() later on.
                     if(TrailingStop*Pip<Bid-(TrailingStop*Pip)){ //I have added TrailingStop*Pip before the '<'
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue)) //I removed the !
                        return(0); //I replaced the Getlasterrror with a return value
                        RefreshRates();
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(TrailingStop*Pip>Ask+(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        return(0);
                        RefreshRates();
                       }
                    }
                }  
            }
         }
      } 
   }
}  
  return(0);
}
//+------------------------------------------------------------------+



 

Hallo zusammen, vielen Dank für die Hilfe. Ich habe den Fehler gefunden und die Probleme sind gelöst. Da ich keinen Stoploss verwende, ist der Wert von OrderStopLoss() immer 0. Das ist kein Problem, wenn ich die Kauforder ändere, weil 0 immer kleiner ist als Bid-TrailingStop*Pip. Aber bei der Verkaufsorder kann 0 nie größer sein als Ask+Trailingstop*Pip. Also musste ich das or(|| OrderStopLoss()) zu dieser Zeile hinzufügen:

if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){ //Added OrderStopLoss()==0
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
 
Trader3000 Diese Ticketnummer gehört zu einem Handel, den ich für den EURAUD geöffnet habe.
Keine Filterung in Ihrer OrderSelect-Schleife. Symbol ist nicht gleich Ordersymbol, wenn eine andere Währung zu einem anderen, separaten Chart hinzugefügt wird.- MQL4-Forum
 
WHRoeder:
Trader3000: Diese Ticketnummer gehört zu einem Handel, den ich für den EURAUD geöffnet habe.
Keine Filterung in Ihrer OrderSelect-Schleife. Symbol ist nicht gleich Ordersymbol, wenn eine andere Währung zu einem anderen, separaten Chart hinzugefügt wird. - MQL4-Forum

Vielen Dank für die Hilfe. Ja, es gibt definitiv ein Problem mit OrderSelect, weil es nur auf einigen Charts funktioniert. Das andere Problem ist, dass ich keine MagicNumber einfügen kann, weil die Trades manuell platziert werden. Ich habe den Teil des Codes verwendet, der meiner Meinung nach relevant ist, aber ich kann ihn nicht kompilieren. Er zeigt diesen Fehler an:

'MySelect' - function can be declared only in the global scope Trailing_v26.mq4 31 13

und Zeile 31 ist diese:

bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){

Hier ist der gesamte EA:

#property strict;
extern int TrailingStart=10;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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)+" pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop;
           
    bool    MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
    if (!OrderSelect(iWhat, eSelect, ePool))     return (false);
    if (OrderSymbol()      != _Symbol)           return (false);
    if (ePool != MODE_HISTORY)                   return (true);
    return(OrderType() <= OP_SELL);
}
    for(int i = OrdersTotal()-1; i >= 0; i--)
    if (MySelect(i, SELECT_BY_POS)){

    for(int iPos=OrdersHistoryTotal()-1; iPos >= 0; iPos--)
    if (MySelect(iPos, SELECT_BY_POS, MODE_HISTORY)){
        int nextTkt = OrderTicket();
     
              if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((Bid-OrderOpenPrice())>(TrailingStart*Pip)){
                     if(OrderStopLoss()<Bid-(TrailingStop*Pip)){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                        Print("Buy = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }     
                     }  
                  }     
               }
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if(OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()==0){
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        Print("Sell = ",GetLastError());
                        return(0);
                        RefreshRates();
                        }
                     }
                  }  
               }
            
         
         
  return(0);
}
//+------------------------------------------------------------------+



 
Trader3000:

Ja, es gibt definitiv ein Problem mit OrderSelect, weil es nur auf einigen Charts funktioniert. Das andere Problem ist, dass ich keine MagicNumber einfügen kann, weil die Trades manuell platziert werden. Ich habe den Teil des Codes verwendet, der meiner Meinung nach relevant ist, aber ich kann ihn nicht kompilieren lassen.

Ich habe Ihnen ein perfektes Codegerüst gegeben, auf dem Sie aufbauen können, das Ihre Probleme behebt, und habe sie sogar vorher aufgelistet, aber Sie ignorieren es und fragen sich weiterhin, warum Ihr Code nicht das tut, was Sie wollen!

Und warum? Wollen Sie, dass Ihr Code nicht funktioniert? Verwenden Sie das Beispiel und testen Sie es selbst!

 
Er denkt, er kann einfach ausschneiden und einfügen und muss nicht lernen zu programmieren. Er kann nicht einmal diesen einfachen Fehler beheben, ohne zu fragen:
'MySelect' - Funktion kann nur im globalen Bereich deklariert werden Trailing_v26.mq4 31 13
Grund der Beschwerde: