EA Validierung

 

Hallo zusammen, ich bin gerade dabei meinen ersten EA fertigzustellen bzw. validieren zu lassen. Der Code ist eigentlich fertig geschrieben, getestet habe ich ihn sowohl im Backtest als auch in Echtzeit, und es lief sowohl bei EURUSD als auch bei GPDUSD alles gut. Nun habe ich bei der Validierung einen Fehler-Bericht mit "failed instand sell"-Anmerkungen bei denen der SL immer 100 Points über dem Verkaufswert ist und der TP immer 250 Points darunter. Die letzte Zeile lautet wörtlich:

2019.03.14 23:11:40 failed instant sell 1 GBPUSD at 1.32323 sl: 1.32423 tp: 1.32073 [Invalid stops] Ich habe wirklich keine Ahnung, warum hier invalide Stops vorliegen sollen. Hat jemand einen Rat?

 
Benjamin Fotteler:

Hallo zusammen, ich bin gerade dabei meinen ersten EA fertigzustellen bzw. validieren zu lassen. Der Code ist eigentlich fertig geschrieben, getestet habe ich ihn sowohl im Backtest als auch in Echtzeit, und es lief sowohl bei EURUSD als auch bei GPDUSD alles gut. Nun habe ich bei der Validierung einen Fehler-Bericht mit "failed instand sell"-Anmerkungen bei denen der SL immer 100 Points über dem Verkaufswert ist und der TP immer 250 Points darunter. Die letzte Zeile lautet wörtlich:

2019.03.14 23:11:40 failed instant sell 1 GBPUSD at 1.32323 sl: 1.32423 tp: 1.32073 [Invalid stops] Ich habe wirklich keine Ahnung, warum hier invalide Stops vorliegen sollen. Hat jemand einen Rat?

Vielleicht hat sich (slippage, Kurslücke, Presseaussendung, ..) Bid und Ask so stark und schnell verändert, dass Dein Auftrag ungültig wurde und das hast Du anscheinend nicht geprüft und abgefangen - so meine kleine Kristallkugel.
 

Jetzt dämmert es mir. Bei der Initialisierung überprüfe ich, ob der Stoploss innerhalb des gegebenen Rahmens liegt, indem ich SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) abfrage. Aber dieser Wert ist wohl gar nicht konstant, sondern verändert sich mit der Zeit, damit gegebene Umstände (wie z.B. die Vermeldung irgendwelcher bedeutenden Wirtschaftszahlen) nicht unberücksichtigt bleiben. Dann muss ich den Stoploss also nicht nur bei der Initialisierung, sondern bei jeder Order überprüfen. Zum Glück gibt es diese automatische Validierung. Und zum Glück ist der Carl hier im Forum. Danke.

 

Tja, schon wieder durchgefallen. Und zwar an derselben Stelle:

2019.03.14 23:11:40 failed instant sell 1 GBPUSD at 1.32323 sl: 1.32423 tp: 1.32073 [Invalid stops]

Ich überprüfe bzgl. des Stops, ob er innerhalb des angegebenen Risikos liegt und ob er innerhalb des StopLevels liegt:

double loss;
if(!OrderCalcProfit(type, _Symbol, lots, entryPrice, sl, loss)) return false;
if (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01 < -loss) return false;
int stopsLevel = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
if(stopLoss <= stopsLevel + slippage || takeProfit <= stopsLevel + slippage) return false;

  Was habe ich vergessen?

 

Sinnvoller Weise habe ich einfach mal meinen EA für den betreffenden Zeitraum im Backtest laufen lassen und konnte so den Fehler rekonstruieren. Der Fehler ist einfach, ich habe den Spread nicht berücksichtigt. Da ich das Risiko vom Einstiegspreis (entryPrice) her berechne, setze ich den Stoploss auch von diesem Preis her, damit aufgrund eines hohen Spreads keine unerwartet hohen Verluste auftreten können. Das macht in meinen Augen Sinn, führte aber zu obigem Fehler. Beheben konnte ich es durch die Mitberücksichtigung des Spreads:

int spreadPoints = ceil(spread / _Point);
int stopsLevel = (int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL);
if(stopLoss <= stopsLevel + slippage + spreadPoints || takeProfit <= stopsLevel + slippage) return false;
 
  1. Wenn der Zeitpunkt so genau bekannt ist, dann kannst Du das doch mit "debuggen mit hist. Kursen" (Ctrl+F5) kontrollieren (Einstellung unter: Extras => Optionen => Debug/Profiling).
  2. Wenn Du einen Kauf zu Ask und einen Verkauf zu Bid machst, wäre der Spread automatisch berücksichtigt? SL und TP könnten dann vom jew. ,anderen' Preis berechnet werden.
  3. Die Idee des Risiko-Managements ist eigentlich, dass der Chart die Preise für Eröffnung, SL und TP vorgeben und dann die Losgröße entsprechen des Risikos gewählt wird.
  4. Überleg Dir, ob Du Deinen EA (auch) als Signal veröffentlichst, gute Signale zu 30,- (pro Monat) haben über 100 Abonnenten jew. für MT4 und Mt5
 

Das mit dem Stoploss hat mich einige Überlegungen gekostet. Die Analyse der Chartwerte gibt an, wo der EA einsteigen und wo er aussteigen soll, wobei sich der Ausstiegspunkt mit der Zeit ändert. In einem solchen Fall wollte ich den Stoploss nicht nach "unten" korrigieren, weshalb ich den Ausstieg direkt via Market-Order ausführe. Und weil ich, was das Risikomanagement betrifft, fixe Lotgrößen und fixe Stoploss-Werte bevorzuge ... das ist eine persönliche Sichtweise ... habe ich den Stoploss-Preis nicht anhand des "anderen" Wertes berechnet, weil dann der Spread den riskierten Betrag pro Trade wieder etwas variabel macht ... und ich möchte einen fixen Wert, den man pro Trade riskiert. Sollte dieser fixe Wert dann zu hoch sein in Relation zu dem verfügbaren Kapital, dann soll keine weitere Position eröffnet werden, bis das verfügbare Kapitel anderweitig gestiegen ist oder die Parameter entsprechend abgeändert worden sind.

Der Ansatz mit der relativen Stoploss-Größe und der relativen Lotgröße ist mir auch durch den Kopf gegangen ... aber - ich kann nicht sagen, ob es mehr aus analytischen Gründen oder persönlichen Präferenzen ist - ich habe mich für den fixen Wert entschieden.

Den Rat mit dem Signal werde ich gerne berücksichtigen, wenn ich etwas länger im MQL5-Geschäft programmiert habe. Denn da sind noch einige andere Ideen im Hinterkopf, um die ich mich zuerst kümmern möchte.

 
Es wäre ja auch möglich, sofern ich das richtig verstanden habe, mit zweierlei zu arbeiten.

Im Grunde nutzt du den Bid-Preis, musst aber den Spread mit berücksichtigen.

Um die Stops für die Order richtig zu hinterlegen, benutzt du den Ask Preis und setzt deinen Stop nach deinen Regeln um den Spread zu weit weg für deine Kalkulation.

Nun nimmst du den Spread als Kosten mit auf.

Deinen eigentlichen Stop (etwas kürzeren, anhand des Bid-Preis berechneten) führst du im EA und löst ihn durch eine Instant oder Market Order aus.

So kannst du die Order setzten und trotzdem deine ursprüngliche Kalkulation beibehalten.

Also einen Ask-Stop für die Order, und einen Bid-Stop für den EA.

Hoffe es ist verständlich.
 
Momentan habe ich bei einem Kauf einen Ask-Stop, bei welchem ich anhand der Stoploss-Größe, des Spreads und dem Symbol_Trade_Stops_Level validiere, bevor ich ihn absende. Natürlich könnte ich den Spread auch auf die andere Seite der Gleichung setzen, aber das wäre dann doch "gehubst wie gesprunge" oder? Falls Du etwas anderes meintest, dann habe ich Dich leider missverstanden.
 

Also die Pending Orders haben diese Systematik:


und hier noch eine Checkliste:


"Kauf einen Ask-Stop" damit meinst Du einen Buy-Stop über dem Ask?

Man kauft zum Ask und verkauft zum Bid, daher müssen die jew. pending Aufträge jew, über oder unter diesen Preisen liegen - mit dem Mindestabstand von FREEZE_LEVEL!

 
Benjamin Fotteler #:
Momentan habe ich bei einem Kauf einen Ask-Stop, bei welchem ich anhand der Stoploss-Größe, des Spreads und dem Symbol_Trade_Stops_Level validiere, bevor ich ihn absende. Natürlich könnte ich den Spread auch auf die andere Seite der Gleichung setzen, aber das wäre dann doch "gehubst wie gesprunge" oder? Falls Du etwas anderes meintest, dann habe ich Dich leider missverstanden.
Ich glaube, du hast mich richtig verstanden. Allerdings ändert das die Ausführung, es ist zwar für die Rechnung egal auf welcher Seite der Spread ist, jedoch nicht für die Ausführung.

Der Stop auf deiner Order wäre dann um den Spread zu weit weg, jedoch der Stop, den der EA per Marketorder ausführt, stimmt wieder.




Grund der Beschwerde: