|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Hallo, next user,
würde mich freuen, wenn Du auf meinen letzten comment antworten würdest. Haben wir die ganze Zeit ggf. eines der wichtigsten Dinge übersehen ? Kann doch eigentlich nicht sein ! Und doch stehen die o.a. Argumente im Raum, um nochmals aufgegriffen zu werden ! Mit bangen Hoffen - LG. pt. |
|
|||||
Zitat:
Hatte gestern nur keine Zeit, daher erst jetzt eine Antwort. === === === === === === === === === === === === Zitat:
"void updateSL(int ticket)" ist die Funktion! "updateSL(...)" (MIT KLAMMERN) ist ein Funktionsaufruf. Wie eben im Code: Code:
void updateSL(int ticket) // Funktion selbst ... if(orderTicket1) updateSL(orderTicket1); // Funktionsaufruf === === === === === === === === === === === === Zitat:
"updateSL" ... "nochmals aufgegriffen werden" ... HÄ? Poste mal bitte den Code von deinem MIX! === === === === === === === === === === === === Nach den beiden Punkten zuvor, frage ich mich grad, was genau bei dir der zweite Block ist? === === === === === === === === === === === === Zitat:
=== === === === === === === === === === === === Zitat:
"updateSL" angesprochen werden. |
|
|||
Hallo next user,
konnte erst jetzt im "Mail-Kästchen" nachsehen und so Deine Nachricht aufnehmen. DANKE. Dennoch bin ich momentan so verwirrt, dass ich gar nicht mehr so richtig weiß, wo ich anfangen oder auch weitermachen soll. Wenn Dein letzter comment richtig ist (... und davon gehe ich aus), sollte ich tatsächlich erst einmal einige Schritte zurückgehen und Deine Hinweise beachtend den Code rekonstruieren. Anschließend würde ich dann diesen Code mit allen relevanten Bestandteilen ins Forum stellen. Vielleicht lässt sich so der bestehende Fehler am ehesten finden. Dennoch werde ich ein klein wenig Zeit dazu brauchen, um nicht die alten Fehler zu wiederholen. Deshalb "Sorry", wenn es ein bisschen dauert. LG. pt. |
|
|||
Zitat:
Keine Eile. Mach dir nen Tee und schalt mal vielleicht für ne Runde ab. |
|
|||
Hallo next user,
das mit dem "Tee" und dem "Abschalten" war eine gute Idee. Und die Gesamtstruktur des EA darzustellen ev. auch; - denn es wurden noch 2, 3 Kleinigkeiten gefunden, die an einer "runden Sache" vorbeigingen. Und "SO" sieht die Ges.-Struktur, einschl. der erarbeiteten Blöcke 1 + 2, jetzt aus: Code:
//--- globale Deklarationen (extern bzw. intern) --------------------+ int orderTicket1 = 0; int orderTicket2 = 0; double TSL = Trail_SL *100 *Point; //===================================================================+ int OnInit() { view graphic and calculat "AccountFreeMargin" } //===================================================================+ int DeInit() { Funktion fehlt noch ! <-------------------------------fehlt noch ! } //===================================================================+ void OnTick() { //--- function for "AccountFreeMargin" //--- Add. Conditions for TradeZoneTimer //--- calculate open orders by current symbol --> and close by TP if (CalculateCurrentOrders(Symbol()) == 0) CheckForOpen(); //--- calculate open orders --> and opening a hedging position if (CalculateCurrentOrders(Symbol()) != 0) CheckHedgeOpen(); CheckTakeProfit(); // nicht notwendig (next user)!!! //========================================= //--- open TrailStopLoss (CheckClose_Pos.1) - Block 1 - NEU (next user) //========================================= if(orderTicket1) updateSL(orderTicket1); if(orderTicket2) updateSL(orderTicket2); if(orderTicket1 && orderTicket2) { if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY)) { if(OrderSelect(orderTicket1,SELECT_BY_TICKET)) { if(OrderType() == OP_BUY) { if(!OrderClose(orderTicket1,OrderLots(),Bid,3)) Print("Order konnte nicht geschlossen werden, weil: ", GetLastError()); else Print("BIN ZU !!!"); } else if (OrderType() == OP_SELL) { if(!OrderClose(orderTicket1,OrderLots(),Ask,3)) Print("Order konnte nicht geschlossen werden, weil: ", GetLastError()); else Print("BIN ZU !!!"); } orderTicket1 = 0; orderTicket2 = 0; } } } //--- } // end "void OnTick()" //===================================================================+ //--- open TrailStopLoss Block 2 ----------------- NEU (next user) //===================================================================+ void updateSL(int ticket) { ResetLastError(); if(OrderSelect(ticket,SELECT_BY_TICKET)) { if(OrderType() == OP_BUY && (openOrders == 1 || openOrders == 2)) { 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 && (openOrders == 1 || openOrders == 2)) { 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()); } } } } } //===================================================================+ int CalculateCurrentOrders(string symbol) { Calculate open positions } //===================================================================+ void CheckForOpen() { Check for openOrder Conditions } //===================================================================+ double LotsOptimized() { MoneyManagement - Calculate lot size } //===================================================================+ void CheckTakeProfit() { Check for TakeProfit Conditions } //+==================================================================+ void CheckHedgeOpen() { Check for HedgeOrder Conditions } //+==================================================================+ void CloseAllOrders() { AllOrdersClosed function } //===================================================================+ //--- End -----------------------------------------------------------+ Anbei möchte ich nochmals erwähnen: Toll, dass Du mich SO an der Hand nimmst, mein stetes "Aufbegehren" ohne zu Murren richtig stellst und dabei eine Ausdauer zeigst, für die man nur dankbar sein kann. In diesem Zusammenhang bin ich immer noch davon überzeugt, dass wir (Du) es schaffen werden, das "Ding" korrekt zum Laufen zu bringen. Also, nochmals danke und LG. pt. PS.: Sobald ich Dein "OK" bzw. letzte Änderungen vorliegen habe, werde ich den Original-Code nochmals überprüfen/angleichen. Dann sollten auch die nächsten Tests mit Erfolg verlaufen. |
|
|||
Zitat:
Also der Nachtrag: Für die Pos. 2 wird die "CloseAllOrders()" nur noch in "void CheckTakeProft()" verwendet: Code:
void CheckTakeProfit() { for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) continue; if (OrderMagicNumber() != MagicNumber || OrderSymbol() != Symbol()) continue; //--- TakeProfit for order type BUY ---------------------------------+ //================================= //--- Pos. 1 (FixLevel + ATR 1) --- if (OrderType() == OP_BUY && openOrders == 1 && OrderTakeProfit()==0) { if (Bid >= OrderOpenPrice() + Trail_Target_1 * 100 * Point) { double TakeProfit_1 = OrderOpenPrice() + Trail_Target_1 + (1.2 *SMA7_ATR5_1); bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_1,0,Lime); } return; } //--- Pos. 2 (FixLevel + ATR 2) --- if (OrderType() == OP_BUY && openOrders == 2 && OrderTakeProfit()==0) { if (Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point) { double TakeProfit_2 = OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1; OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_2,0,Lime); if (Bid >= TakeProfit_2) CloseAllOrders(); } } //--- analog for SELL } Kleiner Hinweis am Rande: dieses "CloseAllOrders()" unter"void CheckTakeProft()" könnte ggf. auch einen Mangel aufweisen, da in manchen GesamtCodeVarianten die Pos. 2 zwar eröffnet, dann aber sehr schnell am Trail_Target wieder geschlossen wurde. Man kann dann im Chart gerade noch sehen, dass TP und Trail_SL gesetzt werden und schon ist die Position einfach zu. (Auch in der History wurden dann weder TP noch SL eingetragen !) Vielleicht hilft auch das. LG. pt. |
|
|||
Schaue mir das nachher mal an, muss jetzt erstmal weg...
|
|
|||
Warte in gespannte Haltung - DANKE !
|
|
|||
Sorry,
wurde gestern doch etwas spät. So, jetzt mal zu deinem Code: Erstmal... Zitat:
=== === === === === === === === === === === === Hehe, so gaaaaanz entspricht das nicht der Wahrheit. Meine Aussage bezog sich auf "CheckTakeProfit()", wie du sie HIER gepostet hast. Mit dem Inhalt dort IST sie ja komplett unnötig gewesen. Der Inhalt der Funktion, wie du ihn jetzt gepostet hast, kam in dem verlinkten Post ja garnicht vor. === === === === === === === === === === === === Da in dem Codeblock 1 ja die Order mit einer Meldung geschlossen wird, und du dies sicherlich erwähnt hättest, ist das Problem wohl in "CheckTakeProfit()" oder deiner Funktion, welche die Orders öffnet, zu suchen. Jetzt mal zu folgendem Code: Code:
//--- Pos. 1 (FixLevel + ATR 1) --- if(OrderType() == OP_BUY && openOrders == 1 && OrderTakeProfit()==0) { if(Bid >= OrderOpenPrice() + Trail_Target_1 * 100 * Point) { double TakeProfit_1 = OrderOpenPrice() + Trail_Target_1 + (1.2 *SMA7_ATR5_1); bool OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_1,0,Lime); } return; } //--- Pos. 2 (FixLevel + ATR 2) --- if(OrderType() == OP_BUY && openOrders == 2 && OrderTakeProfit()==0) { if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point) { double TakeProfit_2 = OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1; OrderAngepasst = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),TakeProfit_2,0,Lime); if(Bid >= TakeProfit_2) CloseAllOrders(); } }
In dem anderen Code habe ich jetzt beim kurzen Durchgehen keinen Fehler gesehen, der dein Problem begründen würde. Also schau dir nochmal "CheckTakeProfit()", sowie ggf. die Funktion zum Öffnen der Orders, falls die Order SOFORT wieder geschlossen wird, an. === === === === === === === === === === === === Zitat:
--------------------------------------------------- Was du schreibst würde vom Ablauf her bedeuten:
Logisch betrachtet kann die Order dann NICHT in Block 1 oder "CheckTakeProfit()" geschlossen werden, wenn wirklich TP UND SL gesetzt werden. Meine Vermutung:
=== === === === === === === === === === === === Am besten, du setzt an allen relevanten Stellen Ausgaben ein, um GENAU zu erfahren, was der Auslöser fürs Schließen ist. |
|
|||||||
Hallo, next user,
DANKE, DANKE, DANKE ! - das ist schon fast zuviel des Guten ! Dennoch werde ich Stück für Stück jedem Hinweis nachgehen: 1. Ok. - "OnDeInit()" = erledigt. === 2. "CheckTakeProfit()" - alleinig, ist natürlich unnötig. Ich ging davon aus, dass Du aus dieser 1-zeiligen Erwähnung (unter "void OnTick()") auch eine später im Code enthaltenen Funktion ableitest. "CheckForOpen()" bzw. "CheckHedgeOpen()" werden in diesen Bereich ja auch angeführt, - die zugehörigen Funktionsabläufe aber ebenfalls nicht gepostet. ==== Zitat:
Code:
res = OrderSend(Symbol(), OP_SELL, LotsOptimized(), Bid, 3, 0, 0, "", MagicNumber, 0, Red); return; Code:
if (OrderType() == OP_BUY && openOrders == 2) { if (Close[0] < OrderOpenPrice() - HedgeTarget_1 * 100 * Point) { // 6 Pkt. lot = LotsOptimized(); Print("SELL", " ", AccountFreeMarginCheck(Symbol(), OP_SELL, lot)); if (AccountFreeMarginCheck(Symbol(), OP_SELL, lot) <= 0) return; res = OrderSend(Symbol(), OP_SELL, lot, Bid, 3, 0, 0, "", MagicNumber, 0, Red); // öffne Pos. 3 } return; } Sowohl das Öffnen mittels Hedging oder auch das orderOpen (nach Strategie) haben bisher keinerlei Probleme bereitet und funktionieren einwandfrei ! Daran sollte es somit nicht liegen. === Zitat:
verschieden und auch die "SMA7_ATR5_1"- Summanden unterscheiden sich. Somit sollte es schon richtig sein, wenn unter "openOrders() == 1" etwas anderes geschieht, als in "openOrders() == 2". === Zitat:
Code:
if(Bid >= OrderOpenPrice() + Trail_Target_2 * 100 * Point) ... double TakeProfit_2 = OrderOpenPrice() + Trail_Target_2 + SMA7_ATR5_1; ... if(Bid >= TakeProfit_2) CloseAllOrders(); wird. Damit werden keine starren, sondern flexible Ziele für die TPs auslöst. Zitat:
... wenn Bid das Target bei z.B. + 9 Punkten überschreitet // soll "TakeProfit_2" = Target + SMA_ATR als TP gesetzt werden. Und erst, wenn dann dieser "TakeProfit_2" durch Bid überschritten wird, - sollen alle Order gelöscht werden. Hier scheint der Algoritmus richtig zu sein, denn "if(Bid >= TakeProfit_2)" wird richtig erkannt und CloeAllOrders() ausgelöst. Soweit zum TP-Bereich. Im Bereich des Trail_SL hingegen ist es etwas anders: Hier werden durch die ersten "ifs" ebenfalls Konditionen für das Nachziehen des SL vorgegeben, dann an "OrderStopLoss()" übergeben, - welches stetig aktualisiert wird. Hänge ich ein separates, späteres "if" an, welches diese "OrderStopLoss()" aufgreift und nur bei Unterschreitung mittels Bid dieses "CloseAllOrdes()" ausgelösen soll, - so scheint hier "OrderStopLoss()" gar nicht erkannt zu werden. Könnte das so sein? Was wäre hier zu tun, damit diese "OrderStopLoss()" erkannt wird und dann das Schließen aller "openOrder" erfolgt ? (ggf. neben Deiner Tiket-update-Variante) Wie ich schon zu Beginn dieses Foren-Beitrags erwähnte, bringt gerade das HIER (unter Trail_SL) angehängte "CloseAllOrders()" alles durcheinander ! === Zitat:
=== Zitat:
=== So weit erst einmal zu den wesentlichen Dingen. Im Weiteren werden hauptsächlich Fehlervermutungen geäußert, welchen ich noch heute Abend in aller Ruhe nachgehen werde. Bis hierher erst einmal wieder ein "dickes Lob" und das zugehörige DANKESCHÖN"! Anbei eine für mich als Laien recht wichtige Frage: Zitat:
Vielleicht kannst Du mir gerade die letzte Frage schon `mal vorab und kurzfristig beantworten. Ansonsten werde ich ein Momentchen brauchen, um all Deinen Statemets nachzugehen. Bin ich dann endlich damit "durch", melde ich mich natürlich umgehend ! Bis dahin mit ganz LG. pt. |
Lesezeichen |
Stichworte |
alle order schließen, closeallorders, mql4, programmierung, programmierung metatrader, programmierung mql4, trailingstop |
|
|