|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Error
Hallo zusammen,
ich habe mal wieder Probleme. Und zwar bekomme ich relativ oft Meldungen mit dem Fehlercode 130, 138, 4051. Diese Fehler treten nur auf wenn ich eine Market-Order aufgeben will. Bei Pending-Orders gibt es keine Problem. Ich habe gelesen dass das Problem kommt, wenn man direkt einen TP und SL platzieren will. Als Lösung wird empfohlen den TP und SL direkt nach dem platzieren der Order mit OrderModify zu setzen. Würdet ihr mir das auch empfehlen? Wäre es generell besser erst nur die Order zu setzen und in einem zweiten Schritt anzupassen? |
|
|||
Wenn das bei Dir der Fall ist, dann gehört der Broker zu denjenigen, die es nicht zulassen, dass der SL bzw. TP gleichzeitig mitgesendet werden und dann muss man per OrderModify() nachträglich die Marken setzen. Prinzipiell das so zu tun würde ich nicht, aber man kann im Programm den EA entscheiden lassen, ob der Broker das Mitsenden toleriert oder nicht. Wenn nicht, dann werden halt zukünftig alle Order ohnen den Marken geöffnet.
traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Okay, das den TP und SL rauszunehmen und später durch OrderModify zu setzen ist keine Lösung.
Dachte dann die Slippage wäre zu klein gewählt, aber auch eine Anpassung hier ist keine Lösung. Habe gelesen man sollte direkt vor OrderSend mit RefreshRates() die Daten aktualisieren. Leider kein Unterschied. Es ist zum kotzen. Woran kann der Fehler "ERROR 138" denn noch liegen? |
|
|||
Vielleicht findet jemand in der Funktion einen gravierenden Fehler?
Der Compiler gibt keine Fehler oder Warnung an. Im Test wird die Order auch gelegentlich ausgeführt. Es kommt aber wie schon gesagt ganz oft der Fehler 138. Code:
//+------------------------------------------------------------------+ //| Funktion BUY | //+------------------------------------------------------------------+ void Func_Buy () { if(Digits == 3) Multiplier = 100; if(Digits == 5) Multiplier = 10000; Verlustgrenze = Kapital / 100 * Risiko; Abstand = NormalizeDouble((Bid - S1) * Multiplier, Digits); if(Abstand>150){Abstand=150;} Verlustgrenze = NormalizeDouble(Verlustgrenze / Abstand,2); Volumen = NormalizeDouble((Verlustgrenze / 0.10)* 0.01,2); Stop_Loss = NormalizeDouble(S1 - 4 * Point * 10, Digits); Take_Profit = NormalizeDouble(Bid + 1 * (Abstand) * Point * 10, Digits); R1 = NormalizeDouble(R1, Digits); if(Take_Profit<R1) {Take_Profit=R1;} int Ticket = OrderSend(Symbol(),OP_BUY,Volumen,Ask,Slippage,Stop_Loss,Take_Profit,"BUY_MARKET",0,0,clrGreen); if(Ticket<0) { Print("OrderSend failed with error #",GetLastError()); } else Print("OrderSend placed successfully"); } |
|
|||
Ich bin wirklich ratlos. Wenn ich die Funktion einzeln über einen Button aufrufe wird alles korrekt ausgeführt.
Egal zu welcher Zeit und in welchem WP, keinerlei Probleme. Woran kann es denn dann bitte liegen, dass die Order beim automatischen Aufruf nicht augeführt wird. Die vorherige Abfrage muss ja funktionieren, denn sonst würde die Funktion zum senden der Order garnicht erst aufgerufen. |
|
|||
Dann würde ich Dir empfehlen, nach den entsprechenden Variablen eine Print-Ausgabe zu schreiben. Dann siehst Du doch evtl. Unterschiede zwischen der Button- und der EA-Variante.
Da Error 138 der Requote-Fehler ist, könnte man nun vor dem Benutzen von Ask und Bid noch RefreshRates() einfügen. Ein while(!IsTradeAllowed()) Sleep(100); verhindert anfangs gesetzt, dass die Order geöffnet werden soll, obwohl ein Öffnen z.Z. nicht möglich wäre. Das würde ein Requote nach sich ziehen, aufgrund des Sleep. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Bringt alles nichts. Ich habe jetzt wirklich alles abgeschaltet, bis auf die eine Funktion, wovon auch hier schon der Code steht.
Der einzige Unterschied, diese wird nach einer simplen if Abfrage aufgerufen. Die Funktion alleine funktioniert auch. Daher ist es mir unbegreiflich, warum sie permanent den Fehler 138 auswirft, wenn die Funktion durch eine if Abfrage aufgrufen wird, anstatt durch den klick auf einen Button. @traderdoc: Vielen Dank für den Tipp. Ich werde es ausprobieren. Ich hätte dazu aber noch eine kleine Frage. Wo und wie muss ich RefreshRates() einsetzen? Geändert von Lena (09.08.17 um 12:46 Uhr) |
|
|||
Am Besten eine Zeile vor dem Aufruf der Variablen Bid bzw. Ask.
Was sagen denn die Print-Ausgaben? Sind sie identisch? Wenn ich das richtig gelesen habe, dann wird einmal per Button die Funktion Func_Buy() angesprungen, wo alles funktioniert und anderenfalls über eine if-Abfrage diese Funktion angesprungen, wo es nicht mehr funktioniert. Ich bin der Meinung, wenn die Print-Abfragen identisch sind muss die zweite Variante auch funktionieren. Was ist das für eine if-Abfrage? traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Das ist richtig. Ich kann die BUY Funktion einmal über einen Button aufrufen, oder aber automatisch über den EA.
Die if Abfrage ist nicht besondes kompliziert. Es wird nur abgeglichen ob der tiefste Punkt des Vortages einen festgelegten Wert tangiert. if(iLow(NULL,PERIOD_D1,1)>=Var1){ //Aufruf BUY Funktion; } Inzwischen ist es mir egal!!! Ich habe den Fehler im Test noch immer. Auf dem Livekonto wird aber alles ganz korrekt ausgeführt. Es ist nur schade weil ich gerne sehen würde wie sich der EA über einen längeren Zeitraum schlägt. |
|
|||
Ich kann es nur immer wiederholen, keine Print-Ausgaben - keine bis schwierige Fehlerfindung, und das würde die Ausgabe des iLow() mit einbeziehen.
Aber gut. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
Lesezeichen |
Stichworte |
130, 138, 4051, error, error 130, error 138, error 4051, fehlercode 130, fehlercode 138, fehlercode 4051, mql4, programmierung, programmierung metatrader, programmierung mql4 |
|
|