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

 

Der beste Weg, um den Stoploss richtig zu setzen, ist, sich den Spread genau zu überlegen. Der Spread ist der Abstand zwischen dem Ask und dem Bid. Wenn Sie also einen Stoploss zu einem Kaufauftrag mit Bid - SL hinzufügen, wird der Spread automatisch mit einbezogen und Sie brauchen ihn nicht zu kodieren und können den Spread effektiv völlig ignorieren. Die Verwendung von Ask + SL für einen Verkaufsauftrag hat denselben Effekt. Aber VORSICHT --- in Zeiten geringen Handelsvolumens vergrößert sich der Spread und es kann gut sein, dass Sie einen SL haben, der weit von dem Platz entfernt ist, den Sie erwarten --- deshalb sollten Sie vielleicht einen Code hinzufügen, der verhindert, dass der SL oberhalb einer bestimmten Spread-Größe hinzugefügt wird.

Nachdem die Frage des Spreads geklärt ist, liegt die nächste Hauptursache für Fehler 130 darin, dass sich die Preise geändert haben, während Ihr EA noch ausgeführt wird. Dies kann durch einen EA verursacht werden, der sehr lange für die Ausführung braucht, oder der Server ist sehr beschäftigt mit der Bearbeitung von Geschäften, was die Ausführung Ihres EAs verzögert. Das Ergebnis ist, dass ein Tick Ihren EA dazu veranlasst hat, mit der Ausführung zu beginnen, aber ein anderer Tick kam, bevor die Ausführung beendet war, und die Preise sind nun ungültig.

In jedem Fall müssen Sie die Kurse mit RefreshRates aktualisieren: while (RefrshRates() == 1) Sleep(5); ------ oder was immer Sie als Wartezeit festlegen.

 
BigAl:


In jedem Fall müssen Sie die Preise mit Hilfe von RefreshRates aktualisieren: while (RefrshRates() == 1) Sleep(5); ------ oder was immer Sie als Wartezeit angeben möchten.

Das ist nur korrekt, wenn der Code vordefinierte Variablen verwendet https://docs.mql4.com/predefined/variables, wenn der Code MarketInfo für Bid und Ask verwendet, dann hat RefreshRates keinen Einfluss...
 
qjol:
AFAIK RefreshRates() hat nichts mit dem Fehler 130 zu tun.

Ich stimme RaptorUK zu, dass die Verwendung von MODE_ASK etc. die Notwendigkeit von RefreshRates() beseitigen würde, aber ich nahm an, dass wie in Shinobis Codebeispiel ....

Ich sende eine Bestellung mit zum Beispiel:

int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);

die vordefinierte Variable ASK verwendet wird und sich daher sowohl der Ask/Bid- als auch der Spread-Wert geändert haben könnten, was den Fehler 130 verursacht. In einem solchen Fall könnte RefreshRates() unmittelbar vor dem OrderSend verwendet werden

 
BigAl:

Punkt genommen RaptorUK und ich stimme zu, dass die Verwendung von MODE_ASK usw. die Notwendigkeit für RefreshRates() beseitigen würde, aber ich nahm an, dass wie in Shinobis Codebeispiel ....

Ich sende eine Bestellung mit zum Beispiel:

int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);

die vordefinierte Variable ASK verwendet wird und sich daher sowohl der Ask/Bid- als auch der Spread-Wert geändert haben könnten, was zu dem Fehler 130 führt. In einem solchen Fall könnte RefreshRates() unmittelbar vor dem OrderSend verwendet werden

Vielen Dank an alle für eure tollen Ratschläge!
Ich bin im Moment etwas beschäftigt, aber sobald ich die Chance habe, werde ich alle eure Vorschläge ausprobieren und dann einen zusammenfassenden Beitrag für alle schreiben, die mit dem gleichen Problem über diesen Thread stolpern könnten.

Danke und pass auf dich auf!

shinobi
 
BigAl: Ich sende eine Order mit zum Beispiel:

int ticket = OrderSend(Symbol(), OP_BUY, position_size, Ask, SLIPPAGE, initial_stop, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);

sagt nicht alles aus. Wie berechnen Sie initial_stop - mit Bid?

Wie berechnen Sie den SLIPPAGE - unter Berücksichtigung von 4/5-stelligen Brokern?

 
Hallo Leute!

Ich musste für eine Weile eine Pause einlegen (Umzug in eine neue Stadt, neuer Job).
Aber jetzt möchte ich an diesen Thread anknüpfen und endlich eine Lösung für diesen verfluchten #130 Stoploss-Fehler finden.

Ich bin dankbar für alle Ihre Ratschläge und habe versucht, sie alle umzusetzen:

1: Spread.
Um den Spread als mögliche Ursache für den Fehler zu eliminieren, habe ich den Stoploss wie folgt gesetzt:
Bid-stoploss (Long)
Ask+stoploss (Short)

2: Changing Market Rates
Um die mögliche Ursache von sich ändernden Marktkursen vor dem Senden der Order zu eliminieren,
habe ich meinen Code geändert und alle Vorkommen von Ask und Bid durch
MarketInfo(Symbol(), MODE_ASK) und MarketInfo(Symbol(), MODE_BID) ersetzt

3: 4-5 Digits-Broker
Um die mögliche Ursache einer ungültigen Anzahl von Ziffern zu eliminieren, habe ich den Stoploss gemäß WHRoeders Code gerundet:
int     pips2points;    // slippage  3 pips    3=points    30=points
double  pips2dbl;       // Stoploss 15 pips    0.0015      0.00150
int     Digits.pips;    // DoubleToStr(dbl/pips2dbl, Digits.pips)

//init digit adjustment
if (Digits % 2 == 1) {      // DE30=1/JPY=3/EURUSD=5 forum.mql4.com/43064#515262
    pips2dbl    = Point*10; pips2points = 10;   Digits.pips = 1;
} else {
    pips2dbl    = Point;    pips2points =  1;   Digits.pips = 0; 
}

OrderSend(Symbol(), OP_BUY, position_size, MarketInfo(Symbol(), MODE_ASK), SLIPPAGE, (MarketInfo(Symbol(), MODE_BID) - stoploss) * pips2dbl, TAKEPROFIT, NULL, EXPERT_ID, 0, Green);
Wie bereits erwähnt, sind die Variablen SLIPPAGE und TAKEPROFIT in meinem Fall immer 0. Sie sollten also auch kein Problem darstellen.


Ich habe also alle Vorschläge berücksichtigt, aber der Fehler besteht immer noch. Soweit ich das beurteilen kann, tritt er genauso oft auf wie vorher, also muss es eine andere Ursache dafür geben.
Hier ist ein aktuelles Protokoll:

tickvalue: 12.50000000
pos size: 37.00000000
Ask/Bid 1262.00000000/1261.75000000
stoploss:12.59610000
position_size: 37
Spread 0.25000000

Error could not take long position. Fehler ist: #130 invalid stops

Die obige OrderSend-Codezeile wurde mit den protokollierten Werten verwendet, um zu versuchen, eine Long-Position einzugehen.
Haben Sie weitere Ideen, was die Ursache sein könnte?

Danke!
shinobi
 

Ist dies ein ECN Broker?

WHRoeder 2011.09.15 20:36

Bei ECN-Brokern müssen Sie eröffnen und DANN Stops setzen.

 
shinobi:
Um die mögliche Ursache einer ungültigen Anzahl von Ziffern auszuschließen, habe ich den Stoploss gemäß WHRoeders Code gerundet:
  1. Der von mir gepostete Code enthielt keine Rundung.
  2. Bei ECN-Brokern müssen Sie eröffnen und DANN Stops setzen.
  3. Bei Metallen (wo TICKSIZE != Point) muss der Eröffnungskurs für schwebende Aufträge gerundet werden
    double TS=MarketInfo(pair, MODE_TICKSIZE);
    OOP = MathRound(OOP/TS)*TS;
    Ich weiß nichts über Stops.

  4. Hören Sie auf, uns zu sagen, wie die Werte sind und was Sie glauben, getan zu haben. Posten Sie den Code.
 

Machen Sie einfach

extern double StopLoss = 50;

extern double TakeProfit = 50;

dann für Käufe:

double SL=Bid - StopLoss*Point;

double TP=Gebot + TakeProfit*Punkt;

int Ticket=OrderSend(Symbol(),0,1,Ask,2,SL,TP,"",12345);

if( Ticket<0) print("error="GetLastError());

for sells:

double SL=Ask + StopLoss*Point;

double TP=Ask - TakeProfit*Punkt;

int Ticket=OrderSend(Symbol(),1,1,Bid,2,SL,TP,"",12345);

if( Ticket<0) print("error="GetLastError());

dann die Log-Datei posten, wenn es nicht funktioniert.

 
Danke Raptor, WHRoeder und SDC für eure Antworten.

SDC:
Ich habe Ihren Code wie folgt ausprobiert:
   int result_ticket = -1;
   double stoploss            = 50;
   double takeprofit          = 50;
   double SL = 0.0;
   double TP = 0.0;
   if(long) {   //take long position
      SL = MarketInfo(Symbol(), MODE_BID) - stoploss * MarketInfo(Symbol(), MODE_POINT));
      TP = MarketInfo(Symbol(), MODE_BID) + takeprofit * MarketInfo(Symbol(), MODE_POINT));
      result_ticket = OrderSend(Symbol(), 0, 1, MarketInfo(Symbol(), MODE_ASK), 2, SL, TP, "", 12345);
   } else {     //take short position
      SL = MarketInfo(Symbol(), MODE_ASK) + stoploss * MarketInfo(Symbol(), MODE_POINT));
      TP = MarketInfo(Symbol(), MODE_ASK) - takeprofit * MarketInfo(Symbol(), MODE_POINT));
      result_ticket = OrderSend(Symbol(), 1, 1, MarketInfo(Symbol(), MODE_BID), 2, SL, TP, "", 12345);
   }

   //check for errors
   if(result_ticket == -1) {
      Log("error="+GetLastError());
      return(-1);
   }
Der einzige Unterschied ist, dass ich Point, Ask und Bid durch MarketInfo ersetzt habe, um das von Raptor und BigAI erwähnte RefreshRates Problem zu vermeiden.
Das Problem bleibt bei diesem einfachen Beispiel bestehen. Ich erhalte immer noch

#ESZ1,M5: Eröffnungsposition
#ESZ1,M5: Tickwert: 12.50000000
#ESZ1,M5: Größe der Position: 1.00000000
#ESZ1,M5: Ask/Bid 1244.50000000/1244.25000000
#ESZ1,M5: Spanne 0,25000000
#ESZ1,M5: SL: 1244.00000000
#ESZ1,M5: TP: 1245.00000000
#ESZ1,M5: Fehler=130

Raptor:
Ich verwende derzeit UWC-Trader mit einem Demokonto zum Testen.
Wie bereits erwähnt handle ich mit Futures. Z.B. ESZ1 und FDXZ1.

WHRoeder:
Sorry, ich runde auch nicht. Ersetze "runden" durch "anpassen für 4/5-stellige Broker". D.h. ich habe gerade deinen Code angewendet.
Ich habe auch den OrderSend so gepostet, wie ich ihn in meiner vorherigen Antwort verwende. Und die Werte aller beteiligten Variablen. Ich bin mir nicht sicher, welcher andere Teil des Codes interessant sein könnte.
Wie das von SDC vorgeschlagene Minibeispiel gezeigt hat, kann der Fehler auf diesen einfachen Code zurückgeführt werden. Es muss also etwas Grundsätzlicheres sein.

Ich handele nicht mit Metallen, also sollte die Rundung nicht wichtig sein.

Ich werde es als nächstes versuchen:
Eröffnung (kein Stoploss) und spätere Modifizierung (Stoploss setzen).

Nochmals vielen Dank für Ihre Gedanken,

Shinobi