"CloseAllOrders" am SL einer 2. Position
Liebe Trader, liebe User-Gemeinde,
seit geraumer Zeit komme ich einfach nicht weiter und würde mich über Eure Unterstützung sehr freuen. Das Problem: Eine 1. Position wird eröffnet und mit einem Trailing_Stop ausgestattet. Hier funktioniert der nachfolgende Code: Code:
double TSL = Trail_SL *100 *Point; Code:
if (OrderType() == OP_BUY && openOrders == 2) Würde mich über Eure Hilfestellung sehr freuen. LG. piptrade |
Das fällt mir auf die Schnelle dazu ein:
Zitat:
Irgendwie verstehe ich aber noch nicht ganz, wie Deine beiden Position laufen, etwa so: 1. Position eröffnet mit TS und läuft, 5 Min später 2. Position eröffnet mit TS und läuft hinterher - wenn 2. Position den TS der ersten einholt, alles zumachen? |
Hallo AVT,
herzlichen Dank für Dein schnelles Statement. An Hand der Antworten merkt man erst einmal, was man ggf. falsch erläutert hat und wie präzise die deutsche Sprache ist. Zitat:
Unabhängig von allen strategischen Überlegungen und allen "Pips und Paps" (wäre zu umfangreich) hier nochmals eine kurze Erläuterung, was ich eigentlich will: Es sind 2 Positionen geöffnet (die 1. Pos. ohne TP und ohne SL) und die 2. Position läuft in den TS. Genau an dieser Stelle sollen nun BEIDE Positionen geschlossen werden. Der Code soll einfach nur BEIDE Positionen schließen, falls die 2. Position den TS erreicht. Deshalb der "Einbau" "CloseAllOrders" unter ---> if (openOrders() == 2). LG. piptrade |
Zitat:
Zitat:
Code:
if(OrderType() == OP_BUY) den TrailingStop der zweiten Order mit "OrderModify()" aktualisierst, direkt danach dann aber "CloseAllOrders()" aufrufst. |
Hallo, next user,
der Zitate-Widerspruch resultiert daraus, dass ich alles etwas zu vereinfachen versuche, um am Kern des Problems ein Stückchen weiterzukommen. Zum Zweiten: Das Zusammenfügen beider Code-Bestandteile bei gleichzeitiger Ergänzung der Ausnahme (if (openOrders == 2)) ist ein guter Hinweis. Werde ich so anwenden. Und zum 3.: "CloseAllOrders()" sollte soweit richtig sein, da es an mehreren Stellen des EA angewendet wird und dort gut funktioniert. Was aber wichtig zu sein scheint ist die Tatsache, dass ich den Trail_SL mit "OrderModify()" aktualisiere, sofort danach aber "CloseAllOrders()" aufrufe. Damit kann ein Modify bestenfalls nur 1 x erfolgen. Wäre dann die nachfolgende Code-Ergänzug möglich und sinnvoll ? ("CloseAllOrders()" soll ja erst dann stattfinden, wenn der modifitierte Trail_SL durchbrochen wird.) Code:
if(OrderStopLoss() < Bid - TSL || OrderStopLoss() == 0) LG. piptrade |
Zitat:
andere Richtung läuft und ein Nachziehen des StopLoss nötig wird. |
Hallo, next user,
richtig, der Trail_SL soll natürlich nachgezogen werden. Verläuft der Kurs dann aber in die entgegengesetzte Richtung, verbleibt der Trail_SL an seiner letzten Stelle, wo er u.U. gebrochen wird. Und erst dann soll CloseAllOrders() erfolgen. Also müssen neue, separate if-Bedingungen geschaffen werden: Code:
{ Kommen wir so der Lösung etwas näher ? LG. piptrade |
Ich würde Schwankungen immer im Code beachten, das heißt kein "==" sondern
Code:
if(Bid <= OrderStopLoss()) |
Ohhh, sorry,
ich hatte nicht kompelliert. So sollte es etwas richtiger sein ! Code:
LG. piptrade |
Das <= gefällt mit gut ! (hatte ich vorher auch schon `mal, - allerdings mit den anfänglich falschen if-Bedingungen)
Im Moment bin ich recht zuversichtlich, werde den Code jetzt testen. Somit vorab recht herzlichen Dank; - ich melde mich noch einmal, wenn alles funktioniert (- oder auch, wenn nicht!) LG. piptrade |
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 -------------------------+ 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 -------------------------+ 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. |
"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; 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)) Dann wird mit dem zweiten "OrderSelect()" die andere Order selektiert und geschlossen. Hab jedoch noch ne Kleinigkeit vergessen: Code:
if(orderTicket1 && orderTicket2) |
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 :D
Zitat:
Dies ermöglicht auch den Code Code:
if(orderTicket1) Enthalten sie hingegen eine Zahl ungleich "0"(Ticketnummer), wird "updateSL()" aufgerufen und der SL ggf. nachgezogen. === === === === === === === === === === === === Zitat:
Der Code Code:
// 1 if(orderTicket1 && orderTicket2)
=== === === === === === === === === === === === 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)) Zitat:
Zitat:
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) |
Hallo, lieber next user,
bin in den vergangene Stunden tatsächlich nochmals ALLES durchgegangen, habe den Code entsprechend den aktuellen Gegebenheiten ergänzt und noch unverstandene Details markiert (red). Mit nachfolgendem Resultat: Code:
int orderTicket1 = 0; Dennoch gibt es sicher 2 - 3 "Ungereimtheiten" (meine Ergänzungen), die geprüft und ggf. bereinigt werden sollten. In der Hoffnung auf Deine nochmaligen Denkanstöße der ungeduldige, spannungsgeladene piptrade PS.: Und wieder warst Du schneller ! Dieses mal habe ich mir Deinen post jedoch schon angesehen und die Ergänzungen bereits integriert. Ich bin begeistert ! Darüber hinaus ist es einfach "Spitze", DASS Du und WIE Du die einzelnen Details "auseinandernimmst" und erläuternd darauf eingehst. Sicher werde ich noch einige Zeit brauchen, bis jede Erklärung auch bei mir in "Fleisch und Blut" übergegangen ist, dennoch habe ich schon bis hier her eine Menge dazugelernt. Wenn jetzt noch die letzten kleinen Unsicherheiten ausgeräumt werden könnten, wäre die Welt endlich wieder in Ordnung. DANKE für Deinen tollen Einsatz ! pt |
Zitat:
eben der OnTick-Angabe übernommen. Ich dachte, dir wäre klar, wie ich es gemeint habe. "OnTick()" ist ja eine "hauseigene" Funktion eines EA's. Mit meinem Code hatte ich nur angegeben, das der Code (in meinem OnTick) in die Funktion "OnTick gehört". Also kurz nochmal:
|
Lieber next user, Hallo !
Da hast Du absolut recht; - dieses "OnTick()" wurde tatsächlich, ohne grassartig nachzudenken, übernommen. Damit war natürlich ein "OnTick()" zuviel im Code und mußte als "error" ausgewiesen werden. Sorry, mein Fehler. Was die Unterscheidung zwischen "hauseigenen" und "persönlichen" Haupt-Funktionen eines EA betrifft, bin ich mir der Differenzierung bewußt. Dennoch habe ich auch hierzu nachfolgende Frage: Nach Initialisierung und Deklaration von Parametern, nach "void OnInit()" und "void DeInit()" beginnt irgendwann auch der Abschnitt "void OnTick()". So der "hauseigene" Funktionsablauf. Alle in diesen letzten 2 Klammern stehenden Operationen werden also per Tick durchlaufen. Innerhalb meines Codes wurde die "OnTick()"-Funktion zwar richtig angelegt, fälschlicher Weise aber relativ zeitig wieder geschlossen. Es folgten weitere abgegrenzte Bereiche mit eigens kreierten, persönlichen "voids", die weitere Funktionen im EA abdecken. Auch diese Bereiche werden per Tick durchlaufen und funktionieren tadellos. So wurde das Auslösen der "Trail_SL-Funktion" in einem Abschnitt "void TakeProfit()" untergebracht und wurde dort auch ohne Beanstandung ausgeführt !!! So weit zur Vorgeschichte. Jetzt waren die in diesem Beitrag erarbeiteten Code-Bereiche A) "Schließen der 1. Position" und B) "updateSL" in den Gesamt-Code zu integrieren. Bereich A): wurde nun unmittelbar an die "Trail_SL-Funktion" angehängt und "void TakeProfit()" auch erst hier per Klammer geschlossen. Bereich B): hier funktionierte dieses Anhängen nicht; - hier sollte "Global deklariert" werden. Dem entsprechend habe ich die Funktion "updateSL" unmittelbar hinter der "OnTick()"-Funktion eingeordnet - und siehe da - keine errors ! Allerdings verblaßte diese erste Freude, als ich den ersten Test durchführte ! Ich bin exakt auf dem Stand von vor 5 Tagen. Irgend etwas scheint immer noch nicht zu stimmen. Hier die Demonstration des "Eibaus", einschl. ausführlichen Code-Details: Code:
void OnTick() { und entdeckst den verhängnisvollen "Haken" ? - Ich würde mich riesig freuen - und auch gegenüber den anderen usern wäre es ein "runder" Beitrag. Und wieder spannungsgeladen und ungeduldig - mit ganz lb. Grüße pt. PS.: Die Tests dauern ewig, da die 2. Pos. entweder gar nicht erreicht oder ergebnislos schon durch eine 3. Pos. abgelöst wird. Somit "SORRY", dass ich mich nicht schneller melden konnte. |
Oh oh, ich glaub da ist bischen was an Verständnis verrutscht :D
Gehen wirs nochmal durch: Code:
void OnTick() Die dritte "CheckTakeProfit()" muss ich jetzt aber etwas auseinandernehmen: Code:
void CheckTakeProfit(); { === === === === === === === === === === === === Code:
double TSL = Trail_SL *100 *Point; === === === === === === === === === === === === Code:
//--- Trailing_SL for order type BUY --------------------------------+
=== === === === === === === === === === === === Code:
//--- Schließen Ticket1 -------------------------
=== === === === === === === === === === === === Code:
void updateSL(int ticket)
Eigentlich müsste dein Code ungefähr so aussehen: Code:
// OBEN
=== === === === === === === === === === === === Code:
} // diese Klammer schließt nun den gesamten TP-Bereich |
Lieber next user, Hallo!
Es ist einfach nur toll, dass Du mich nicht "auf die Folter spannst", sondern mir so schnell geantwortet hast. DANKE. Dem entsprechend bin ich jedes Wort, jede Silbe und manchesmal sogar jeden Buchstaben durchgegangen und habe jeden Logikansatz nachvollzogen. Deine Argumente sind absolut überzeugend ! Das, was zwischenzeitlich etwas durcheinandergeraten war, sollte jetzt wieder geradegerückt sein und in den richtigen Bahnen verlaufen. Fast auf Anhieb "NULL error" !!! Schon DAS ist richtig gut ! ... Und wenn dann noch die Live-Tests am Mo. halbwegs klappen - ohhhh, dass wäre ... ! Lieber next user; - zwischendurch nochmals DANKE; - ich melde mich ! LG. pt. PS.: ... und wenn dann der in diesem Thema ursprünglich gewünschte Part tatsächlich funktionsfähig ist, gebe ich mehr als nur gern, meine Empfehlung weiter ! Allein das "Hin und Her" der Diskussionen war lehrreich und hilft zumindest mir ein großes Stück weiter. |
Liste der Anhänge anzeigen (Anzahl: 2)
Lieber next user, nochmals Hallo!
Was in den letzten Tagen relativ schnell abgearbeitet wurde, kann ich heute "Revue passieren" lassen: Zitat 1: Zitat:
Zitat 2: Zitat:
Zitat 3: Zitat:
Zitat 4: Zitat:
Zitat 5: Zitat:
Zitat 6: Zitat:
Zitat 7: Zitat:
Zitat 8: Zitat:
Die Funktion "CheckTakeProfit()" ist aber dennoch notwendig für eine 3., 4., 5. und 6. Order (DAX). Diese TPs werden "step by step" verkleinert, um eine 7. oder 8. Position möglichst auszuschließen. Hierzu wäre allerdings eine Strategie-Erläuterung sinnvoll, um das Gesamtanliegen des EA zu verstehen. 2 Anhänge sollen hierzu wenigstens eine kleinen Einblick vermitteln. (Bei näherem Interesse bitte einfach nachfragen;).) And the last: Zitat:
So weit, so gut. Und wenn der gesamte Code dann etwas "aufgeräumt" und strukturiert ist, kann er sogar ästhetisch gut aussehen und "das Auge erfreuen"! Dieses kleine "Zwischenspiel" war ich noch schuldig. Auch ein kleiner Einblick zur Wirkungsweise des EA und in die Performance gehören sicher dazu (siehe Anhänge). Ansonsten werde ich mich am Mo. melden, um Erfolg oder Misserfolg meiner Tests zu verkünden. Bis dahin, LG. pt. |
Hallo an alle user, die das Thema begleiten,
und natürlich ein Hallo an next user ! Mit Bangen hatte ich dem Moment entgegengesehen, der nun über Erfolg oder Misserfolg entscheiden würde: Die ersten Tradingstunden der neuen Woche. Und um nicht lange drumherum zu reden, - der Code funktioniert NICHT ! Was könnte jetzt noch falsch sein ? "Sehe ich den Wald vor lauter Bäumen" nicht mehr? Hier nochmals der vollständige Code: Code:
int OnInit() sofort danach Pos.1 und Pos. 2 bei eben diesen + 9 Punkten (abzüglich Spread), - ohne sichtlichen Grund. Auch in der 1. Position wird nun gar nicht mehr getrailt ! Schade, eine ganze Woche Arbeit, ohne den gewünschten Erfolg. Ich habe zwar vieles dazugelernt und kann die gewollten Schritte auch nchvollziehen, dennoch liegen ein oder mehrere Fehler vor ! In meinem ursrünglichen Code hatte wenigstens die Pos.1 tadellos funktioniert. Ursprünglich entstand das o.a. Problem nur bei der Pos. 2, hatte ich (CloseAllOrder()" eingefügt. Ließ ich "CloserAllOrder()" weg, funktionierte auch hier das Trailing hervorragend; - allerdings wurde die Pos. 1 dann nicht geschlossen. Soweit zur Erinnerung. Was nun ??? Große Trauer, - ich war soooo zuversichtlich ! LG. pt. |
Zitat:
Zitat:
Falls du es nicht schaffst, den Zeitpunkt & Codestelle beim Schließen der 2 Order zu ermitteln, dann poste mal den ganzen, relevanten Code und nicht nur Passagen. Dann kann ich auch viel wahrscheinlicher den Fehler sehen! |
Hallo next user,
lieb von Dir, dass Du "am Ball bleibst". Kann morgen früh in aller Ruhe Deine Hinweise durchgehen. In diesem Zusammenhang werde ich auch versuchen einen Gesamtüberblick des EA zusammenzustellen, damit Fehlerstellen leichter erkennbar werden. Ich hoffe nur, wir (Du) finden den "Haken. Bis dahin LG pt. |
So, da bin ich wieder !
... und das mit ersten Erkenntnissen : Hallo, lieber next user, habe mir jetzt nochmals die Zeit genommen, alles in Ruhe zu überprüfen. Die erste Erkenntnis war nun, dass der von Dir gewählte Begriff "updateSL" (unter "void OnTick()" die ganze Anglegenheit tatsächlich am besten trifft. Dieses update ist ja wichtig, um a) die Positionen 1 + 2 ständig zu "scannen", b) zu registrieren, dass ggf. eine der beiden Tickets geschlossen wurde und c) um dann nachträglich die Pos. 1 zu schließen. Bis dahin ist in Punkto "Block 1" alles recht gut verständlich. (Ohne den 2. "Block" "void updateSL(int ticket)" wird allerdings "updateSL" beim Kompellieren als error ausgewiesen.) Somit muß dieses "updateSL" also in einem 2. "Block" = "void updateSL(int ticket)" nochmals aufgegriffen werden und - siehe da, - das o.a. error verschwindet, da es jetzt erkannt wird. Auch bis dahin ist alles halbwegs verständlich. Nicht ganz verständlich hingegen ist, was der 2. "Block" bewirkt. Theoretisch sind jetzt alle Orders geschlossen und es sollte (irgendwann) eine neue, erste Order, gem. Strategie-Konditionen, eröffnet werden. So z.B. eine BUY-Pos.. Auch das ist noch OK. Damit gibt es jetzt wieder ein Ticket in der History (wie eigentlich immer), ein zweites Ticket ist geöffnet. Dies wiederum wird unter OrderSelect erkannt, was zum Schließen der Position führen müßte. Kaum wäre die neue 1. Pos. geöffnet, würde sie auch schon wieder gechlossen werden ? Wo ist hier der Gedankenfehler ? - oder ist der Gedanke ggf. gar nicht so falsch ? Und ein zweiter Gedanke: Angenommen, die o.a. 1. Pos. verbleibt im Markt, sie wird selektiert, es wird festgestellt BUY oder SELL, so würde bei Erreichen des Trail_Targets der Trail_SL übergeben werden. Weiterhin angenommen, die 1. Pos. erreicht ihr Trail_Target NICHT und rutscht statt dessen in die Verlustzone, ---> jetzt wird gehedged und eine 2. Pos. zusätzlich geöffnet. Somit gibt es jetzt 2 geöffnete Tickets, wobei nur die 2. Pos. den Trail_SL erhalten soll. Da im Code aber nur nach Ticket bzw. Tickets und anschließend nur nach BUY bzw. SELL unterschieden wird, müßte doch wenigstens auch die "openOrders == 2" angesprochen werden ? - Oder ? Wie sonst kann der Trail_SL an die richtige Pos. übergeben werden ? Erst einmal bis zu diesem Punkt. Vielleicht kannst Du meine ersten Gedanken nochmals prüfen und sollten sie Fehler aufweisen, korrigieren. LG. pt. |
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 === === === === === === === === === === === === Zitat:
"updateSL" ... "nochmals aufgegriffen werden" ... HÄ? Poste mal bitte den Code von deinem MIX! === === === === === === === === === === === === Zitat:
=== === === === === === === === === === === === 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:
Zitat:
|
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) --------------------+ 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() { 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:
=== === === === === === === === === === === === Zitat:
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) ---
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); Code:
if (OrderType() == OP_BUY && openOrders == 2) { 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) 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. |
Alle Zeitangaben in WEZ +2. Es ist jetzt 16:56 Uhr. |
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum