|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Hallo, next user, - da bin ich wieder !
Gestern war ich noch recht optimistisch, was sich bis zum heutigen Tag allerdings in Grenzen hält. Der Code wurde entsprechend Deiner guten Hinweise "zig" mal geändert und läuft nach wie vor mit der alleinigen 1. Position reibungslos. Sobald die 2. Position nun am Trail-Target geöffnet wird, gerät alles ein bisschen durcheinander ! Unmittelbar nach Eröffnung der 2. Position werden sofort alle Positionen geschlossen; - ein erster SL wird gar nicht erst initiiert, geschweige denn nachgezogen. Einfach nur die Glattstellung am Trail-Target ! Hier nochmals der gesamte Code (für SELL): Code:
//--- SELL -------------------------+ if (OrderType() == OP_SELL && (openOrders == 1 || openOrders == 2)) { if (Ask < OrderOpenPrice() - Trail_Target_1 *100 * Point) { if (OrderStopLoss() == 0 || OrderStopLoss() > Ask + TSL) { if (!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ", GetLastError()); } } } if (OrderType() == OP_SELL && openOrders == 2) { if (Ask >= OrderStopLoss()) { CloseAllOrders(); } } Nachdem ich den logischen Ablauf des Codes mehrmals nachzuvollziehen versuchte und den Fehler einfach nicht finden kann, würde ich mich über eine nochmalige Hilfestellung, - von wem auch immer, - sehr freuen. Ganz LG. piptrade |
|
|||
Was mir gerade noch eingefallen ist:
Könnte es sein, dass nach dem "OrderModify" ein "return" eingefügt werden muss ? (Kleine Ursache, - große Wirkung ?) Oder anders herum gefragt: Gibt es ohne Rückgabewert überhaupt eine "OrderStopLoss()", eine "OrderStopLoss()", die innerhalb einer ergänzenden if-Bedingung zum Tragen kommt und so die Funktion "CloseAllOrders()" auslöst ? Code:
//--- SELL -------------------------+ if (OrderType() == OP_SELL && (openOrders == 1 || openOrders == 2)) { if (Ask < OrderOpenPrice() - Trail_Target_1 *100 * Point) { if (OrderStopLoss() == 0 || OrderStopLoss() > Ask + TSL) { if (!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ", GetLastError()); } return; } } if (OrderType() == OP_SELL && openOrders == 2 && Ask >= OrderStopLoss()) { CloseAllOrders(); } LG. piptrade |
|
|||
Ein "return" müsste da jetzt nicht hin, dieses beendet ja nur die aktuelle Funktion und springt zum Aufruf zurück.
Wenn der Code nach "OrderModify()" Probleme macht, so muss da an den Bedingungen der Ausführung gearbeitet werden... Wo hast du denn deinen Code untergebracht? Ein "return" würde, wenn überhaupt, dann nur bei einer eigenen Funktion sinn machen. PS: Kannst du kurz mal sagen, was genau "Trail_Target" & "Trail_SL" für Werte haben. Geändert von next user (14.03.18 um 19:14 Uhr) |
|
|||
"Trail_Target" = 9 *100 *Point und "Trail_SL" = 5 *100 *Point (für DAX). Das Trailing soll also erst dann beginnen, wenn die Position bereits im Plus ist.
LG. |
|
|||
Mal ein kleines Beispiel:
(Davon ausgehend, das du immer nur 2 Orders offen hast...) Code:
int orderTicket1 = 0; int orderTicket2 = 0; // Order eröffnen... // ... // ... void OnTick() { ... if(orderTicket1) updateSL(orderTicket1); if(orderTicket2) updateSL(orderTicket2); if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY)) { if(OrderSelect(orderTicket1,SELECT_BY_TICKET)) { if(OrderType() == OP_BUY) OrderClose(orderTicket1,OrderLots(),Bid,3); else OrderClose(orderTicket1,OrderLots(),Ask,3); } } ... } void updateSL(int ticket) { ResetLastError(); if(OrderSelect(ticket,SELECT_BY_TICKET)) { if(OrderType() == OP_BUY) { if(Bid - OrderOpenPrice() > Trail_Target *100 * Point) { if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL, OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ", GetLastError()); } } } else if(OrderType() == OP_SELL) { if(OrderOpenPrice() - Ask > Trail_Target *100 * Point) { if(OrderStopLoss() > Ask + TSL || OrderStopLoss() == 0) { if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL, OrderTakeProfit(), Blue)) Print("Error setting Sell trailing stop: ", GetLastError()); } } } } } eh nur eine übrig bleibt und geschlossen werden muss. |
|
|||
Jedes Argument ist absolut richtig ! DANKE !!!
Die Codehinweise gehe ich morgen in aller Ruhe durch. Letztendlich möchte ich auch wieder einiges dazulernen. Dazu muss ich aber auch jeden Schritt verstehen und interpretieren können. Step by step. Dennoch ganz, ganz herzlichen Dank, dass Du mich "nicht im Regen stehen läßt". Melde mich so schnell, wie möglich, - bis bald. LG. piptrade |
|
|||
Von der Neugierde getrieben habe ich mir Deine Code-Intensionen schon einmal angesehen, - und .... ??? - Alles scheinbar absolut TOP !
Dennoch, geht das nicht auch etwas einfacher ? Diese "blöde" 1. Position muss sich ggf. doch auch einfacher schließen lassen. Oder liege ich da "schief" ? LG. |
|
|||
Zitat:
Code:
if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY)) { if(OrderSelect(orderTicket1,SELECT_BY_TICKET)) { if(OrderType() == OP_BUY) OrderClose(orderTicket1,OrderLots(),Bid,3); else OrderClose(orderTicket1,OrderLots(),Ask,3); } } Dann wird mit dem zweiten "OrderSelect()" die andere Order selektiert und geschlossen. Hab jedoch noch ne Kleinigkeit vergessen: Code:
if(orderTicket1 && orderTicket2) { if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY)) { if(OrderSelect(orderTicket1,SELECT_BY_TICKET)) { if(OrderType() == OP_BUY) OrderClose(orderTicket1,OrderLots(),Bid,3); else OrderClose(orderTicket1,OrderLots(),Ask,3); orderTicket1 = 0; orderTicket2 = 0; } } } |
|
|||
Ohah..., Du bist meinen ersten Fragen zuvorgekommen. Thanks.
Dennoch schicke ich diese Zeilen zwecks der besseren Verständigung und werde mich anschließend sofort mit Deinem neuen Beitrag beschäftigen. Bis hierher erst einmal Danke, Danke, Danke! //--- Hallo next user, die Grundidee und die Abfolge Deines Codes glaube ich (zumindest im Groben) verstanden zu haben. Dennoch ist DAS für mich "ein ganz schöner Brocken", den es erst einmal "zu verdauen" gilt. Also: //--- Im 1. Code-Block sollen SL_updates der 1. und der 2. Position erfragt werden - dann wird festgestellt, ob wir uns in der Pos.2 befinden und dann, ob es eine Pos.1 gibt. Ist das alles so weit richtig, wird OP_BUY erfragt und sollte OP_BUY vorliegen, wird Pos.1 mit Bid geschlossen ---> anderenfalls wäre es eine OP_SELL, die mit Ask geschlossen wird. So weit ok.. Wenn ich jetzt allerdings kompelliere, = 2 warnings: "Der Rückgabewert von 'OrderClose' sollte aktiviert sein !" Dem entsprechend habe ich "return;" ergänzt, was allerdings nicht weitergeholfen hat; - die warnings bleiben bestehen ! Wie könnte ich diese "warnings" beheben ? Zum 2. verstehe ich nicht ganz, was anstelle Deiner 3 Punkte eingesetzt werden muss. Oben vermutlich: "if(OrderSelect(ticket,SELECT_BY_TICKET)== true)" oder ähnlich. Ist das richtig ? ... und unten ? //--- Im 2. Code-Block werden dann die SL_updates (Trail_SLs), einmal für BUY und einmal für SELL, erstellt. Hier verstehe ich den Part "ResetLastError();" nicht ganz. Soll hiermit eine letzte Fehlermeldung eliminiert werden ? Könntest Du den Grund und die Auswirkung kurz erläutern ? //--- Bis hierher erst einmal ein ganz, ganz herzliches DANKESCHÖN ! Allein die von Dir gewählte Herangehensweise war "Neuland", hat meinen Horizont aber um einiges erweitert; - DANKE ! Voller Spannung/Anspannung hoffe ich auf Deine baldige Antwort. LG. PS.: Ich melde mich, sobald ich mir ALLES angesehen und halbwegs "verdaut" habe. |
|
||||||
Bin grad am (späten) Frühstücken, also verdauen wir es mal gemeinsam
Zitat:
Dies ermöglicht auch den Code Code:
if(orderTicket1) updateSL(orderTicket1); if(orderTicket2) updateSL(orderTicket2); Enthalten sie hingegen eine Zahl ungleich "0"(Ticketnummer), wird "updateSL()" aufgerufen und der SL ggf. nachgezogen. === === === === === === === === === === === === Zitat:
Der Code Code:
// 1 if(orderTicket1 && orderTicket2) { // 2 if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY)) { // 3 if(OrderSelect(orderTicket1,SELECT_BY_TICKET)) { // 4 if(OrderType() == OP_BUY) OrderClose(orderTicket1,OrderLots(),Bid,3); else OrderClose(orderTicket1,OrderLots(),Ask,3); // 5 orderTicket1 = 0; orderTicket2 = 0; } } }
=== === === === === === === === === === === === Zitat:
einen Rückgabewert. Und da es keine unbedeutene Funktion ist, solltest du den Rückgabewert abfangen und nachschauen, ob deine Order geschlossen werden konnte, oder es einen Fehler gab." Ein "return" hat da nichts verloren. Würdest du dort ein "return" setzen, so springst du an der Stelle aus "OnTick()" raus. Beheben kannst du diese Warnings also, indem du den Rückgabewert abfängst. Ich habe den Code "auf die schnelle" geschrieben und das ausgelassen. Ein Beispiel könnte so aussehen Code:
if(!OrderClose(orderTicket1,OrderLots(),Bid,3)) Print("Order konnte nicht geschlossen werden, weil: ", GetLastError()); else Print("BIN ZU !!!"); Zitat:
Damit hab ich einfach nur dargestellt, das "OrderClose(...)" Parameter hat. Wie du in meinen anderen Posts sehen kannst, mach ich das manchmal, manchmal nicht. Anstelle dieser Punkte musst du nichts einsetzen. Lies den Satzt nochmal und du wirst verstehen, das ich lediglich gesagt habe, das du anstelle von "OrderClose(...) / ()" auch deine Funktion "CloseAllOrders()" nutzen kannst. === === === === === === === === === === === === Zitat:
Zitat:
Code in ihr ausgibt. Du kannst es allerdings getrost vergessen. Das betrifft nur MQL5, weil dort die Variable nach "GetLastError()" nicht wieder auf 0 zurückgesetzt wird. Ist wegen MQL5 halt ne Angewohnheit von mir. Einfach vergessen... === === === === === === === === === === === === Das "else" bei der Orderprüfung habe ich so gesetzt, da ich davon ausgegangen bin, das beide Orders aktiv sind. Falls das nicht (immer) der Fall ist, die erste Order bei der Schließung der zweiten also noch "Pending" sein kann, so solltest du im Code vielleicht noch ergänzen: Code:
if(OrderType() == OP_BUY) { if(!OrderClose(orderTicket1,OrderLots(),Bid,3)) Print("BUY-Order konnte nicht geschlossen werden, weil: ", GetLastError()); else Print("BIN ZU !!!"); } else if(OrderType() == OP_SELL) { if(!OrderClose(orderTicket1,OrderLots(),Ask,3)) Print("SELL-Order konnte nicht geschlossen werden, weil: ", GetLastError()); else Print("BIN ZU !!!"); } else { // Wenn Order noch Pending, dann OrderDelete() und NICHT OrderClose() !!! OrderDelete(orderTicket1); } |
Lesezeichen |
Stichworte |
alle order schließen, closeallorders, mql4, programmierung, programmierung metatrader, programmierung mql4, trailingstop |
|
|