Brauche Hilfe bei Fehler #130 ungültiger Stoploss - Seite 3

 
dasselbe Problem. Die Order wird problemlos mit Stoploss = 0 und Takeprofit = 0 eröffnet.
Aber dann schlägt OrderModify fehl.

Der nachstehende Code wird nach dem obigen Code aus dem letzten Beitrag ausgeführt.

   bool modify = false;
   entry_price = OrderOpenPrice();
   if(long) {  
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT);
      TP = MarketInfo(Symbol(), MODE_BID) + takeprofit * MarketInfo(Symbol(), MODE_POINT);
      modify = OrderModify(result_ticket, entry_price, SL, TP, Red);  
   } else {    
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT);
      TP = MarketInfo(Symbol(), MODE_ASK) - takeprofit * MarketInfo(Symbol(), MODE_POINT);
      modify = OrderModify(result_ticket, entry_price, SL, TP, Green); 
   }
   Log("[5] SL: " + SL);
   Log("[5] TP: " + TP);
   
   if(!modify) {
      Log("error="+GetLastError());
      return(-1);
   }

Das Log ist:

#ESZ1,M5: Eröffnungsposition
#ESZ1,M5: Tickwert: 12.50000000
#ESZ1,M5: Pos Größe: 1.00000000
#ESZ1,M5: Ask/Bid 1242.00000000/1241.75000000
#ESZ1,M5: Spanne 0,25000000
#ESZ1,M5: eröffnen #13679252 kaufen 1.00 #ESZ1 bei 1242.00 ok
#ESZ1,M5: Order 13679252 erfolgreich eröffnet
#ESZ1,M5: SL: 1241.25000000
#ESZ1,M5: TP: 1242.25000000
#ESZ1,M5: error=130

Also scheint es nicht einmal zu funktionieren, erst zu öffnen und dann den Stoploss zu setzen :-/
 

Die Spanne beträgt 0,25

#ESZ1,M5: Spanne 0.25000000

OK, Sie eröffnen einen BUY bei . . 1242.00 (Ask)

#ESZ1,M5: Eröffnung #13679252 Kauf 1.00 #ESZ1 zu 1242.00 ok

#ESZ1,M5: Order 13679252 erfolgreich eröffnet

Dann versuchen Sie zu modifizieren mit einem TP zum Geldkurs + 2 * Spread und SL zum Geldkurs - 2 * Spread

#ESZ1,M5: SL: 1241.25000000

#ESZ1,M5: TP: 1242.25000000

Wenn Ihr FreezeLevel 0.50 ist, dann ist das Ihr Problem . . was ist Ihr FreezeLevel ?

 
shinobi:
Gleiches Problem. Die Order wird problemlos mit Stoploss = 0 und Takeprofit = 0 eröffnet.
Aber dann schlägt OrderModify fehl.

Keine Einstellung für 4/5-stellige Makler. Nicht erst öffnen und dann Stopps setzen.

Wie bereits beantwortet

 

ja, Sie handeln wahrscheinlich mit einem ECN-Broker, Sie müssen Orders mit Null-Stopps öffnen und dann die Order modifizieren, nachdem sie geöffnet wurde, so dass es ein Problem mit 50 Pips SL und TP gibt, also tun Sie, was Raptor sagte, überprüfen Sie das Freezelevel und Stoplevel auch nur für den Fall

Überprüfen Sie auch Ihren OrderModify() Code .... vielleicht funktioniert es so, aber ich denke Sie sollten die Order mit OrderSelect() auswählen, bevor Sie OrderOpenPrice() ausführen können

 
Nochmals vielen Dank für eure Hilfe!
Leider spukt #130 immer noch nachts in mir herum ;)

Hier ist mein nächster Versuch:

   double stoploss = 50;
   double SL = 0.0;
   
   //open position
   if(long)  //take long position
      result_ticket = OrderSend(Symbol(), 0, 1, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);  
   else     //take short position
      result_ticket = OrderSend(Symbol(), 1, 1, MarketInfo(Symbol(), MODE_BID), 2, 0, 0, "", 12345); 
   //check for errors
   if(result_ticket == -1) {
      Log("error="+GetLastError());
      return(-1);
   }
   Log("Order "+result_ticket+" Successfully Opened");

   //select order
   if (!OrderSelect(result_ticket, SELECT_BY_TICKET)) {
      Log("error="+GetLastError());
      return(-1);
   }    
   entry_price = OrderOpenPrice();
   
   //check stoplevel
   double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   Log("Stoplevel: " + stoplevel);
   Log("stoploss: " + stoploss);
   if(stoploss < stoplevel)
      stoploss = stoplevel + 1;

   //checl freezelevel
   double freezelevel = MarketInfo(Symbol(), MODE_FREEZELEVEL);
   Log("Freezelevel: " + freezelevel);
   Log("stoploss: " + stoploss);
   if(stoploss < freezelevel)
      stoploss = freezelevel + 1;
   
   if(long)
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT);
   else
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT);
   Log("SL: " + SL*pips2dbl);
   if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) {
      Log("error="+GetLastError());
      return(-1);
   }
   Log("Stoploss successfully set");

Wie Sie sehen können, habe ich das Beispiel vereinfacht, indem ich den Takeprofit nicht verwendet habe. Der Fehler tritt definitiv aufgrund des Stoploss auf, also brauchen wir keinen Takeprofit.
Ich eröffne die Order zunächst mit 0 Stoploss (und Takeprofit) und versuche später, den Stoploss mit OrderModify zu setzen.
Zuvor prüfe ich Mode_Stoplevel und Mode_Freezelevel und passe den Stoploss bei Bedarf an. (Eine Anpassung findet unten im Log statt, weil der Stoploss anfänglich 50 ist, aber Mode_Stoplevel 75 ist, ich setze dann den Stoploss auf Mode_Stoplevel + 1, also 76)

RaptorUK und SDC:
MarketInfo(MODE_FREEZELEVEL) gibt 0 zurück. Ich glaube nicht, dass Freezelevel das Problem ist.
Ich habe die Ausgabe in die Protokolldatei eingefügt.

SDC:
Ich habe auch einen OrderSelect eingefügt, bevor ich OrderOpenPrice aufgerufen habe, nur um sicherzugehen. Im Log kann man sehen, dass OrderSelect funktioniert hat, sonst wäre der Code nicht so weit gekommen (exit -1).

WHRoeder:
Ich bin dem einfachen Beispiel von SDC gefolgt. Aber ich habe es nun erweitert, indem ich die Pips 4/5 Digit Anpassung beim Setzen des Stoploss verwendet habe, wie Sie oben sehen können. Sie können auch sehen, dass die Order zuerst mit Stoploss und Takeprofit auf Null gesetzt wird und dann der Stoploss mit OrderModify gesetzt wird. Wie Sie im Protokoll unten sehen können, wird die Order erfolgreich geöffnet, wenn S/L und T/P auf Null gesetzt sind, aber ich bin immer noch nicht in der Lage, den S/L im nächsten Schritt mit OrderModify zu setzen.

Hier ist das vollständige Protokoll:

#ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/15 9:24
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56489.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Init successfully completed.
#ESZ1,M5: initialized

#ESZ1,M5: Opening Position
#ESZ1,M5: tickvalue: 12.50000000
#ESZ1,M5: Ask/Bid 1250.50000000/1250.25000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: pos size: 1
#ESZ1,M5: open #13697436 sell 1.00 #ESZ1 at 1250.25 ok 
#ESZ1,M5: Order 13697436 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 12.51260000
#ESZ1,M5: error=130

Ich bin Ihnen sehr dankbar für Ihre kontinuierliche Hilfe, und ich glaube, wir haben das Problem eingegrenzt :)
Was könnte noch das Problem sein? Gibt es noch etwas, das ich versuchen könnte?

shinobi
 
RaptorUK:

Die Spanne beträgt 0,25

#ESZ1,M5: Spanne 0.25000000

OK, Sie eröffnen einen BUY bei . . 1242.00 (Ask)

#ESZ1,M5: Eröffnung #13679252 Kauf 1.00 #ESZ1 zu 1242.00 ok

#ESZ1,M5: Order 13679252 erfolgreich eröffnet

Dann versuchen Sie zu modifizieren mit einem TP zum Geldkurs + 2 * Spread und SL zum Geldkurs - 2 * Spread

Ist Ihr STOP_LEVEL nicht 3 * Spread? Ihr Stop ist zu nah...

#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: stoploss: 50.00000000
 
Hey Raptor,

Ja, das ist der Grund, warum ich das Stopniveau hier (aus dem obigen Code) prüfe:

   double stoplevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
   Log("Stoplevel: " + stoplevel);
   Log("stoploss: " + stoploss);
   if(stoploss < stoplevel)
      stoploss = stoplevel + 1;

Also im letzten Beispiel wurde der Stoploss auf 76 gesetzt, was 3*Spread +1 entspricht.
Das sollte doch weit genug weg sein, oder?
 
shinobi:
Hallo Raptor,

Ja, das ist der Grund, warum ich das Stoplevel hier überprüfe (aus dem Code oben):


Also im letzten Beispiel wurde Stoploss auf 76 gesetzt, was 3*Spread +1 entspricht.
Das sollte weit genug weg sein, richtig?
Ja, das sollte es ... aber ich frage mich, ob Sie hier ein Rundungsproblem haben und ob Sie auf die nächsten 0,25 aufrunden müssen (der S&P500 bewegt sich in 0,25 Schritten), damit Ihr SL um 0,25 oder mehr vom STOP_LEVEL entfernt ist ... wenn Sie verstehen, was ich meine?
 
Gute Idee, aber leider hat auch das nicht geholfen.
Ich habe Folgendes getan.

Zuerst habe ich eine eigene Funktion geschrieben, um Doppelwerte auf das nächste Doppel zu runden:
double DoubleRound(double number, double step)
{
    double mod = MathMod(number, step);
    if(mod < step/2.0)
      step = 0;
    double rounded = number - mod + step;
    return (rounded);
}

Sie tut, was Sie erwarten. Wenn man sie mit DoubleRound(1237.687360000) aufruft, gibt sie 1237.50 zurück.

Dann habe ich es bei meinem S/L kurz vor dem Aufruf von OrderModify verwendet. Und ich habe MODE_TICKVALUE verwendet, der für #ESZ1 0,25 ist.
Also:

   //round to nearest Tickvalue   
   SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKVALUE));

 
  Log("SL: " + SL);
   if(!OrderModify(result_ticket, entry_price, SL* pips2dbl, 0, Red)) {
      Log("error="+GetLastError());
      return(-1);
   }

Im Log kann man sehen, dass die Rundung gut funktioniert hat. Allerdings wurde der Stoploss trotzdem abgelehnt :/

#ESZ1,M5: loaded successfully 
#ESZ1,M5: Date: 2011/11/16 7:44
#ESZ1,M5: Symbol: #ESZ1
#ESZ1,M5: Depot: 56364.95000000
#ESZ1,M5: Stop Level [Points]: 75.00000000
#ESZ1,M5: Freeze Level [Points]: 0.00000000
#ESZ1,M5: Spread [Points]: 25.00000000
#ESZ1,M5: Min/Max Lot: 0.01000000/1000.00000000
#ESZ1,M5: Point: 0.01000000
#ESZ1,M5: Tick Size: 0.25000000
#ESZ1,M5: Tick Value: 12.50000000
#ESZ1,M5: Digits: 2.00000000
#ESZ1,M5: Contract: 2011.09.14 00:00-2011.12.16 23:59
#ESZ1,M5: Opening Position
#ESZ1,M5: Ask/Bid 1240.00000000/1239.75000000
#ESZ1,M5: Spread 0.25000000
#ESZ1,M5: open #13708089 sell 1.00 #ESZ1 at 1239.75 ok 
#ESZ1,M5: Order 13708089 Successfully Opened
#ESZ1,M5: Stoplevel: 75.00000000
#ESZ1,M5: Freezelevel: 0.00000000
#ESZ1,M5: stoploss: 76.00000000
#ESZ1,M5: SL: 1237.50000000
#ESZ1,M5: error=130

Ich kann mir nicht vorstellen, was das Problem sonst sein könnte! Diese #130 ist wirklich hartnäckig!!!
 

Sie haben einen Sell eröffnet

#ESZ1,M5: öffnen #13708089 verkaufen 1.00 #ESZ1 bei 1239.75 ok

und versucht, einen SL darunter zu setzen...

#ESZ1,M5: SL: 1237.50000000

#ESZ1,M5: Fehler=130