Hast Du den Code selber geschrieben?
Dann versuche, das OrderSend zu modifizieren, indem Du bspw. ein normales Ask statement wie folgt ersetzt:
NormalizeDouble(Ask,Digits) (Digits bspw. 5 bei 5 digit Brokern). Als Ergebnis wird entsprechend die Nachkommazahl gerundet.
Falls Du keinen Code hast, sondern einen EA executable hast, dann wird voraussichtlich der SL zu eng am aktuellen Kurs sein.
Erhöhe testweise die SL settings deutlich (soweit diese Settings gibt). Das sollte auf einem DEMO Konto stattfinden.
Soweit auch das nicht hilft, teste ein übliches Paar wie EURUSD- wenn es dort funktioniert, ist die SL/TP Logik für Gold eher ungeeignet.
Lars Rompe:
Hallo Lars, vielen Dank für deine Antwort.
Den Code habe ich nicht selber geschrieben, bin aber dabei die Sprache zu lernen. Ich bin halt noch blühender Anfänger.
Der Code ist super ordentlich und verständlich aufgebaut. Die SL/TP Logik sollte damit doch funktionieren. Meines Erachtens habe ich das auch schon getestet.
int executeLong(){ int ticket = 0; double entry = Ask; entry = roundUp(entry); double sl = entry - SLPoints * Point; // sl = roundUp(sl); double tp = entry + TPPoints * Point; // tp = roundUp(tp); double lots = Lots; // if(Handelsvolumen == Variabel) lots = calcLots(entry - sl, RisikoInProzent); if(lots < MarketInfo(Symbol(),MODE_MINLOT)) lots = MarketInfo(Symbol(),MODE_MINLOT); else if(lots > MarketInfo(Symbol(),MODE_MAXLOT)) lots = MarketInfo(Symbol(),MODE_MAXLOT); entry = NormalizeDouble(entry,Digits); sl = NormalizeDouble(sl,Digits); tp = NormalizeDouble(tp,Digits); if((entry-sl) / Point <= MarketInfo(Symbol(),MODE_STOPLEVEL)) return 0; if((tp-entry) / Point <= MarketInfo(Symbol(),MODE_STOPLEVEL)) return 0; if((entry-Ask) / Point <= MarketInfo(Symbol(),MODE_STOPLEVEL)) return 0; if(AccountFreeMarginCheck(Symbol(),OP_BUY,lots)<=0) return 0; ticket = OrderSend(Symbol(),OP_BUY,lots,entry,1000,sl,tp,Commentary,Magic,0);
- Verwende aus der Editor-Leiste </> oder Alt+S um Code darzustellen - ich habe das jetzt mal für Dich gemacht -schaut doch besser aus, oder ;)
- Du kauft den Ask aber für den Exit gilt der Bid! Versuch das einmal.
- Du verwendest für den Kauf ja nicht Ask sondern einen Preis höher als Ask roundUP(Ask) - dadurch kommt der SL zu nahe!
- Für die Prüfung verwendest Du auch nicht aktuell Ask und Bid (entry-sl bzw. tp-entry) so dass die eben auch nicht greift!
- Verwende aus der Editor-Leiste </> oder Alt+S um Code darzustellen - ich habe das jetzt mal für Dich gemacht -schaut doch besser aus, oder ;)
- Du kauft den Ask aber für den Exit gilt der Bid! Versuch das einmal.
- Du verwendest für den Kauf ja nicht Ask sondern einen Preis höher als Ask roundUP(Ask) - dadurch kommt der SL zu nahe!
- Für die Prüfung verwendest Du auch nicht aktuell Ask und Bid (entry-sl bzw. tp-entry) so dass die eben auch nicht greift!
Hmm, interessant. Danke Carl.
Mal schauen, ob ich das hinbekomme!
LG Steven
- Verwende aus der Editor-Leiste </> oder Alt+S um Code darzustellen - ich habe das jetzt mal für Dich gemacht -schaut doch besser aus, oder ;)
- Du kauft den Ask aber für den Exit gilt der Bid! Versuch das einmal.
- Du verwendest für den Kauf ja nicht Ask sondern einen Preis höher als Ask roundUP(Ask) - dadurch kommt der SL zu nahe!
- Für die Prüfung verwendest Du auch nicht aktuell Ask und Bid (entry-sl bzw. tp-entry) so dass die eben auch nicht greift!
int executeLong(){ int ticket = 0; double entry = Ask; double exit = Bid; double sl = exit - SLPoints * Point; double tp = exit + TPPoints * Point; double lots = Lots; // if(Handelsvolumen == Variabel) lots = calcLots(entry - sl, RisikoInProzent); if(lots < MarketInfo(Symbol(),MODE_MINLOT)) lots = MarketInfo(Symbol(),MODE_MINLOT); else if(lots > MarketInfo(Symbol(),MODE_MAXLOT)) lots = MarketInfo(Symbol(),MODE_MAXLOT); entry = NormalizeDouble(entry,Digits); exit = NormalizeDouble(exit,Digits); sl = NormalizeDouble(sl,Digits); tp = NormalizeDouble(tp,Digits); if((entry-sl) / Point <= MarketInfo(Symbol(),MODE_STOPLEVEL)) return 0; if((tp-entry) / Point <= MarketInfo(Symbol(),MODE_STOPLEVEL)) return 0; if((entry-Ask) / Point <= MarketInfo(Symbol(),MODE_STOPLEVEL)) return 0; if(AccountFreeMarginCheck(Symbol(),OP_BUY,lots)<=0) return 0; ticket = OrderSend(Symbol(),OP_BUY,lots,entry,1000,sl,tp,Commentary,Magic,0);
Ich habe mal versucht die Struktur beizubehalten. roundUp habe ich einfach rausgenommen, ist das so einfach oder gehört da mehr dazu?
exit ist jetzt Bid für den Tp und Sl
Nun habe ich aber noch Logikprobleme. Die fett-markierten "entry" für die Prüfung stehen ja nun für Ask, müssen davon welche Bid sein?
Beispiel Brechnung mit Ask
13.001 - (13.000-100) = 13.001 - 12.900 = 99
(13.000 + 100) - 13.001 = 13.100 - 13.001 = 99
13.001 - 13.001 = 0
Beispiel Berechnung mit Bid
13.000 - (13.000-100) = 13.000 - 12.900 = 100
(13.000 + 100) - 13.000 = 13.100 - 13.000 = 100
13.000 - 13.001 = -1
Hmm was sagt mir das. Die Logik verstehe ich gerade nicht.
- Naja, das: 13.000 - 13.001 = -1 ist eigentlich etwas falsch, es wären 0,001 (ein Point - ein Point?) und das ist der Spread also der Abstand zwischen Ask und Bid.
- Gibt es jetzt noch den Fehler mit SL - ich glaube nicht!
- Wenn so etwas passiert, dann druck alle Werte aus, also Ask,Bid,sl,tp,Stop_Level. Meist ist es der Unterschied zwischen dem, was man sich vorstellt, was errechnet wird und dem was tatsächlich herauskommt!
ticket = OrderSend(Symbol(),OP_BUY,lots,entry,1000,sl,tp,Commentary,Magic,0);
Aufpassen ...unter MQL5 kommt da nur ein BOOL zurück .
Da musst du das MQLTradeResult auswerten um an ein Ticket zu kommen.
https://www.mql5.com/de/docs/trading/ordersend
Der gute Moderator den wir haben könnte das ruhig mal deutlicher machen hier im Forum. MQL4-MQL5
Carl ... :-)
Gruß
- www.mql5.com
Carl ... :-)
Danke! Blumen kriegt man immer gern :)
Aber es geht doch um MT4 - MarketInfo() gibt's in MT5 nicht.
Ich habe aufgehört darauf hinzuweisen, dass MT4 nach ganz unten gehört.
Ich hab einmal dem ServiceDesk vorgeschlagen, dass diese Trennung: Mt5 alle oben und MT4 als letztes ganz unten, nicht beachtet wird, und man vielleicht ein verpflichtendes Feld dafür einfügen sollte, aber so bleiben halt nur meine Kristallkugeln aus der Winkelgasse ...
- Naja, das: 13.000 - 13.001 = -1 ist eigentlich etwas falsch, es wären 0,001 (ein Point - ein Point?) und das ist der Spread also der Abstand zwischen Ask und Bid.
- Gibt es jetzt noch den Fehler mit SL - ich glaube nicht!
- Wenn so etwas passiert, dann druck alle Werte aus, also Ask,Bid,sl,tp,Stop_Level. Meist ist es der Unterschied zwischen dem, was man sich vorstellt, was errechnet wird und dem was tatsächlich herauskommt!
Ach jetzt funktioniert garnix mehr. Es finden keine Trades mehr statt. Ich krieg n Rappel.
- Auch wenn das etwas zynisch klingt, aber so lernt man programmieren!
- Wie gesagt, lass Dir alle Zahlen ausdrucken.
- Verwende Comment(..), um Dir laufende Zahlen anzeigen zu lassen.
- Sonst gibt es noch den Debugger (F5 im Editor)!
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Hallo liebe Experten,
kann mir wer diesen Fehler erklären? Was wurde getestet, das solch ein Fehler auftritt? Wie kann ich das beheben? Ich verstehe es einfach nicht.
ERR_CHART_WRONG_PARAMETER
4107
Ein fehlerhafter Parameterwert für Funktionen für die Arbeit mit dem Chart