Fehler Verständnis

 

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



 
Steven Mueller:


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);
 
  1. 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 ;)
  2. Du kauft  den Ask aber für den Exit gilt der Bid! Versuch das einmal.
  3. Du verwendest für den Kauf ja nicht Ask sondern einen Preis höher als Ask roundUP(Ask) - dadurch kommt der SL zu nahe!
  4. 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!

 
Carl Schreiber:
  1. 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 ;)
  2. Du kauft  den Ask aber für den Exit gilt der Bid! Versuch das einmal.
  3. Du verwendest für den Kauf ja nicht Ask sondern einen Preis höher als Ask roundUP(Ask) - dadurch kommt der SL zu nahe!
  4. 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

 
Carl Schreiber:
  1. 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 ;)
  2. Du kauft  den Ask aber für den Exit gilt der Bid! Versuch das einmal.
  3. Du verwendest für den Kauf ja nicht Ask sondern einen Preis höher als Ask roundUP(Ask) - dadurch kommt der SL zu nahe!
  4. 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.

 
  1. 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.
  2. Gibt es jetzt noch den Fehler mit SL - ich glaube nicht!
  3. 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ß

Dokumentation zu MQL5: Handelsfunktionen / OrderSend
Dokumentation zu MQL5: Handelsfunktionen / OrderSend
  • www.mql5.com
[in,out] Pointer auf eine Struktur vom Typ MqlTradeResult, die das Ergebnis einer Handelsoperation beschreibt, wenn diese erfolgreich durchgeführt wurde (wenn true zurückgegeben wurde). Eine Handelsanfrage durchläuft mehrere Stufen der Prüfungen auf dem Handelsserver. Zunächst wird überprüft, ob alle benötigten Felder des Parameters korrekt...
 
Der gute Moderator den wir haben könnte das ruhig mal deutlicher machen hier im Forum. MQL4-MQL5   

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 ...

 
Carl Schreiber:
  1. 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.
  2. Gibt es jetzt noch den Fehler mit SL - ich glaube nicht!
  3. 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.

 
  1. Auch wenn das etwas zynisch klingt, aber so lernt man programmieren!
  2. Wie gesagt, lass Dir alle Zahlen ausdrucken.
  3. Verwende Comment(..), um Dir laufende Zahlen anzeigen zu lassen.
  4. Sonst gibt es noch den Debugger (F5 im Editor)!
Grund der Beschwerde: