|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
PS.: Der hier vorliegende EA wurde innerhalb der letzten 3 Jahre soweit geschrieben und entwickelt, dass er ca. 1.600% p.a. erwirtschaftet. Und das zu 99,2 % (2017) vollautomatisch ! Und die verbleibenden 0,8% werden im manuellen Trading mittels einer "ausgefeilten Trading-Strategie" erreicht. (gerade hier sind natürlich auch gigantische und überproportionale Profitzuwächse möglich !, - die genutzt werden sollten.)
Ich habe vor 4 Jahren operative Eingriffe erleben müssen, was nur die aller wenigsten überstehen. Nach dem 1. Jahr der Lethargie habe ich mich aufraffen können und mich mit der mql4 motiviert. DAS war der richtige Weg. Der "HEAD_ExpertAdvisor" ist der lebendige Beweis dafür. LG. Euer piptrade |
|
|||
Aber bitte nicht für dich, wenn du meinen Tee-Vorschlag im anderen Thread wahrnimmst...
|
|
|||||||
Zwar etwas später als geplant, aber naja...
=== === === === === === === === === === === === Zitat:
Also Punkt 2 & 3, damit sind die von dir neu hinzugefügte Funktion "CheckForUpdateSL()" und meine ursprüngliche "updateSL()" gemeint. Dazu gleich weiter unten mehr... === === === === === === === === === === === === Zitat:
Zitat:
Wo erst bekommen denn bei dir die Ticket-Variablen ihren Wert? Das meinte ich mit "überall" nutzen. === === === === === === === === === === === === Jetzt zum Codeabschnitt: Ich geh erstmal kurz auf deine roten Hinweise im Code ein...
---------------------------------------------------------------- So, jetzt noch kurz zum Code an sich:
|
|
||||
Hallo, next user !
Lieber später, als NIE ! - das ist schon völlig in Ordnung. Hauptsache Du unterstützt mich bis "zum bitteren Ende" und lässt mich "nicht im Regen stehen"! Und für das, was ich bisher dazulernen konnte/durfte bin ich sehr dankbar! Thanks ! So, nun aber wieder an die Arbeit: Pkt.1) Zitat:
Pkt.2) Zitat:
die "OrderSend"-Funktion (siehe Code) verwenden: Code:
int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit,"My order",16384,0,clrGreen); if(ticket<0) { Print("OrderSend failed with error #",GetLastError()); } else Print("OrderSend placed successfully"); Und wenn auch das richtig sein sollte, müßte ich dann das "void updateSL(int ticket)" gegen "void updateSL(int ticket_2)" für "ticket_2" ersetzen ? Und jetzt die unklaren Codeabschnitte: Zitat:
"void CheckTakeProfit()" auch läuft, ... dann sollte ich mit "CheckForUpdateSL()" bzw. richtiger: "updateSL()" / "void updateSL()" analog verfahren. Oder sind unter "void OnTick()" werder dieses "CheckTakeProfit()" noch das "updateSL()" notwendig ? (So ist es, glaube ich !) Zitat:
Code:
if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY)) { if(OrderSelect(orderTicket1,SELECT_BY_TICKET,MODE_TRADES)) Verwendung finden. Oder liege ich da falsch ? Zum Code an sich: Pkt.1) "int orderTicket1 = 0;" bzw. "int orderTicket2 = 0;" - so steht es jetzt durchgängig im Code. Pkt.2) Thema "Doppelblöcke": So, wie Du es darstellst ist es nicht ganz richtig. Die Unterscheidungen betreffen nicht nur die"openOrders", sondern auch die "Trail_Targets" und die "TSL(s)". Hier sollen Auslöser und Spanne (von Pos.1 zu Pos.2) reduziert werden, da hier mit einer höheren Positionsgröße gearbeitet wird. Puhhh... , - das war`s mal wieder. Nunmehr hoffe ich, dass wieder einige Kleinigkeiten richtiggestellt wurden und unsere nächsten Posts kürzer ausfallen. Und wenn dann als neuer Post nur noch das lang ersehnte "OK" übermittelt wird, sollten wir es geschafft haben. DANKE, dass Du wirklich auf jedes Komma, jeden Punkt und auch auf ... eingehst. Und vielen, vielen Dank für Deine Geduld, Ausdauer und Zielstrebigkeit. Mit jedem neuen Statement habe ich etwas dazugelernt, so dass schon jetzt allein die Verständigung besser klappt. Thanks, bis bald und LG. pt. |
|
|||||||||
Zitat:
=== === === === === === === === === === === === Zitat:
Zitat:
Der Rest ist richtig. Zitat:
Code:
void updateSL(int ticket) { ... } werden doch beim Aufruf genutzt: Code:
if(orderTicket1) updateSL(orderTicket1); if(orderTicket2) updateSL(orderTicket2); Zitat:
"CheckTakeProfit()" nutzt du ja denke ich für TP. Ob es notwendig ist, weißt nur du genau. "updateSL()" SORGT DOCH EBEN FÜR DAS UPDATEN DER (TRAIL)SL! Die wird doch die ganze Zeit genutzt und jetzt denkst du, sie sei unnötig? Hast du vergessen, wozu wir sie erstellt haben? === === === === === === === === === === === === Zitat:
Wenn sie aber von dir bereits an anderer Stelle aus welchem Grund auch immer durch "CloseAllOrders()" geschlossen wurde, so wird "OrderSelect()" fehlschlagen und der Block danach NICHT ausgeführt, was Folgen hat! === === === === === === === === === === === === Zitat:
"CloseAllOrders()" verarbeitet werden. Da hast du mich verwirrt... === === === === === === === === === === === === Zitat:
Zitat:
auf 2 Blöcke mit entsprechenden Bedingungen reduzieren kann. === === === === === === === === === === === === Wegen dem ganzen "Durcheinander" im Code ect. frage ich mich grad, ob nicht das die Ursache für das plötzliche schließen der Order verantwortlich ist... Auch haben wir ja vor ein paar Tagen Ausgaben angesprochen, die du doch machen wolltest, oder. Schauen wir mal weiter... |
|
|||
Lieber next user,
„erstens kommt es anders, zweitens als man denkt !“ So und dieses Mal auch hier. Vorab aber erst einmal das DANKESCHÖN, für Deine letzten Hinweise. Wie immer haben mir diese wieder einmal geholfen, ein Stückchen weiterzukommen. Einerseits dadurch, dass ich nur diesen Hinweisen nachging und andererseits dadurch, dass ich registrieren musste, dass mir das Hintergrundwissen zu „OrderSend“„ zu Order Modify“ sowie das Auslesen der History und der Umgang mit den „tickets“ zumindest teilweise noch fehlt ! Und genau das ist der Grund, weshalb ich mich nicht eher gemeldet habe. Deshalb „Sorry“ und die Bitte um Verständnis. Im Weiteren erscheint es mir als sinnvoll diese Lücken mit Wissen zu füllen, so dass ich über die Osterfeiertage „eirige Dinge“ aus der Welt schaffen und „runde Dinge“ machen möchte. Deshalb auch jetzt und hier keinen vorschnellen Comment. Anbei: Es ist schon gut, all diese mögliche Abfolgen einmal selbst zu coden und sich zu zwingen, der entsprechenden Logik nachzugehen. So ist es auch wesentlich leichter, entsprechende Hinweisdetails zu verstehen. Lassen wir das Fest in aller Ruhe verstreichen, um dann mit neuem Elan an alten Dingen „zu feilen“. DANKE. Ich denke, dass ich mich spätestens Mo./Di. wieder melde, wünsche ein “Frohes Fest“ und verbleibe mit LG. pt. |
|
|||
Zitat:
Dir auch noch schöne Feiertage. |
|
|||
Hallo, next user,
das Fest der unrunden Dinge ist nun vorbei und, wie versprochen, hier meine Rückmeldung. Ebenfalls, wie zugesagt, habe ich mich neben österlichen Dingen auch um einige MQL4-Funktionen gekümmert. Sicher sind im Nachfolgenden noch Fehler enthalten, sicher werden hier und da auch umrichtige Begriffe verwendet, dennoch bin ich unterschiedliche Codebestandteile des betreffenden EA durchgegangen und möchte hier hauptsächlich die Passagen ansprechen, die in diesem Forenbeitrag primär zur Disskusion stehen. 1. Der Grundaufbau des EA wurde bereits in einem vorhergehenden post übergeben. Hier konnte entnommen werden, dass unter „void OnTick()“ unter anderem die Funktionen „CheckForOrder()“, „CheckHedgeOpen()“ und „CheckTakeProfit()“ deklariert sind, welche im späteren Verlauf des EA als separate “void“- oder „Funktions“-Blöcke ausführlich behandelt werden. Und hier gab es eine este Ungereimtheit: Die Funktion „Trail_SL()“ wurde bisher unter „void CheckTakePrpfit“ gecodet. Also müßte nach meinem Ermessen folgende Veränderung vorgenommen werden: zusätzliche Deklaration der Funktion „CheckTrail_SL()“ unter „void OnTick()“, um später auch hierfür einen separaten „Funktions-Block“ „void CheckTrail_SL()“ ausbilden zu können. Also nicht mehr unser altes „updateSL(int ticket)“. Jetzt hätte ich 4 „saubere“ Deklarationen und die Möglichkeit auch 4 separate Funktionsblöcke zu bilden. 2. Gehen wir `mal davon aus, dass dies annähernd richtig ist. So wird die Pos.1 immer und generell unter „void CheckForOrder()“ mittels „OrderSend...“und die Pos.2 immer und generell unter „void CheckHedgeOpen()“ ebenfalls unter einer „OrderSend...“ geöffnet. 2 x „OrderSend...“ ! Bei diesen Eröffnungen sind StopLoss und TakeProfit jeweils „0“. Das Schließen der Pos.1 erfolgt dann mittels TP unter „voidCheckTakeProfit()“ und einem „OrderModify...“ oder eines SL unter „void CheckTrail_SL()“ und wiederum einem „OrderModify...“ Selbiges betrifft die Pos.2 ! Um an dieser Stelle konsequent zu bleiben, wäre es n.m.E. richtig, wenn „ticket_1“ und „ticket_2“ nicht aus den Modifizierungen „geupdatet“, sondern mittels der „OderSend...“-Befehle festgelegt werden. Dies wiederum würde heissen, das das o.a, „void CheckForOpen()“ auf „void CheckForOpen(int ticket_1)“ - und das „void CheckHedgeOpen()“ auf „void HedgeOpen(int ticket_2)“ erweitert werden müßte. In den jeweiligen Funktionen/Durchläufen wären dann nicht mehr diese „res = OrderSend...“ gefragt, sondern „ticket_1 = OrderSend...“ bzw. „ticket_2 = OrderSend...“ zu formulieren. Damit sind nunmehr auch die Tickets eindeutig und könnten mit „return ticket_1“ bzw. „return ticket_2“ übergeben werden. Und damit zu 3. „ticket_1 = 0;“ und „ticket_2 = 0;“ werden global deklariert und stellen den jeweiligen Ausgangszustand der Tickets dar. 4. Jetzt könnte direkt unter“void OnTicK“ ein zusätzlicher Block platzieren werden, der zwischen „HISTORY = geschlossene Pos. 2“ und „TICKET = offene Pos.1“ unterscheidet und welcher dafür zuständig ist, die ggf. noch geöffnete Position nachträglich zu schließen. In diesem Zusammenhang müsste als erstes die Anweisung gegeben sein, dass „if (ticket_1) --→ CheckForOpen (ticket_1)“ und dass „if (ticket_2) --→ CheckHedgeOpen (ticket_2)“. Dann sollten die Ticket-Abfragen und der „OrderClose...“-Befehl folgen. Den Abschluss würden die Rücksetzungen der Tickets auf “0“ und ein „return“ bilden. Bis auf Formulierungs- oder Benennungsfehler erscheint mir das alles recht logisch und nachvollziehbar. Dennoch bin ich relativ sicher, dass der „Teufel wahrscheinlich im Detail“ liegt und ggf. doch noch einiges Andere „geradezurücken“ ist. Vielleicht könnte das ursprüngliche Problem aber auch auf der hier beschriebenen Basis gelöst werden !? Sauber, klar und eindeutig. Bin natürlich auf Deine neuerliche Reaktion gespannt, warte voller Ungeduld auf Deinen nächsten post, sage schon `mal DANKE und bis bald ... LG. pt. |
|
|||
Lieber next user,
wie schon angenommen, war nicht alles zu 100% wirklich richtig ! - Dennoch stimmte der „Leitfaden“; - die zu vermutende Logik und der zu vermutende Code ! 4 separate Blöcke, einschließlich Deklaration und deren Funktionsausführung wurden umgesetzt ! Die „Ticket-updates“ werden jetzt in der „void CheckForOpen()“ und in der „void CheckHedgeOpen()“ (Primär-Orders für Pos.1 und Pos.2) festgelegt und in der Endkonsequenz sogar übernommen ! Globale Deklarationen wurden ebenfalls ergänzt. Soweit war ein erster und wichtiger Fortschritt erreicht !!! - Eine tatsächliche Kommunikation und damit eine neue BASIS !!! Thanks, - für mehrere kleine Details Deiner Statements, die ich mir immer wieder „vor Augen führte“, haben mir hier weitergeholfen. Da Du momentan scheinbar "verschollen“ bist und weder im Forum noch direkt an meiner Seite "aufwachst", blieb nur nur DAS „Do it`s your help“; … und das waren nunmehr 3 Tage „Kampf“ ! Dennoch bin ich mehr als nur zufrieden, diese „Krampf-Orgie“ auf mich genommen zu haben, dass Resultat kann sich nämlich wirklich sehen lassen !!! (Bis auf eine absolute Kleinigkeit); - läuft der EA ! Und er läuft richtig gut ! Jetzt ist lediglich noch etwas „Kosmetik“ der Conditions und im Code-Styling angesagt und das „DINGELING“ kann seinen Weg, - welcher das auch seien mag`, - gehen ! Lieber next user, … lieber traderdock, - herzlichen Dank für Eure „Bemühungen“, vielleicht ist hier aber auch „Herausforderungen“ richtiger ? Dennoch DANKE !!! In diesem Sinne LG. Euer piptrade PS.: (Fair play !) An alle, die den Beitrag verfolgt haben: Den allumfassenden, richtigen Code werde auch ich Euch nicht so einfach liefern. Dafür musste ich zu hart dafür arbeiten. Dennoch hat jeder Interessierte die Möglichkeit eines direkten Kontaktes. Für einen kleinen Obolus gebe ich gern den richtigen Code preis. Eine Einsicht “in“ - oder ein realer Test des EXPERT ADVISORs - wäre dann eine vielleicht nächste und zugesichert, lukrative Option. LG. Und um "meiner Seele freien Lauf zu lassen": Lieber next user - Programmierungswissen und Strategie-Erfahrung wären ggf. der richtige "DEAL" gewesen ! |
Lesezeichen |
Stichworte |
alle order schließen, closeallorders, mql4, programmierung, programmierung metatrader, programmierung mql4, trailingstop |
|
|