Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools  
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4060
Beiträge: 38493
Benutzer: 6.365
Aktive Benutzer: 237
Links: 80
Wir begrüßen unseren neuesten Benutzer: Steffen123
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 2 Tagen
- Steffen123
vor 2 Tagen
- UZander
vor 3 Tagen
- harryb
vor 4 Tagen
- Blade-13
vor 4 Tagen
- Dumbinatio...

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 69
Gesamt: 69
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #51 (permalink)  
Alt 27.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 152
piptrade befindet sich auf einem aufstrebenden Ast
Standard

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
  #52 (permalink)  
Alt 27.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
Zitat:
Zitat von next user Beitrag anzeigen
Werde ich nachher in Ruhe durchgehen.
Aber nur bei einer ganz großen Kanne Tee.

traderdoc
Aber bitte nicht für dich, wenn du meinen Tee-Vorschlag im anderen Thread wahrnimmst...
  #53 (permalink)  
Alt 27.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zwar etwas später als geplant, aber naja...

=== === === === === === === === === === === ===

Zitat:
Zitat von piptrade Beitrag anzeigen
...
2. Unter "void OnTick()" wird dann das "updateSL()" aufgeführt, damit die weiter unten stehende Funktion "void updateSL()"
auch per Tick erfolgen kann.
3. Ebenfalls unter "void On Tick()" müßte dann die Funktion "updateSL()" (= Block_A) ausgeführt und die Pos.1
nachträglich geschlossen werden.
4. NICHT unter "void OnTick()" stehend !!!, also eher im unteren Teil des Codes, wird dann die Funktion "void updateSL()"
aufgeführt, welche den Trail_SL immer wieder aktuell modifiziert (= Block_B). Gleichzeitig sollte dieser Block dann auch
für das ticket-update zuständig sein.
Du führst ja wieder etwas ein...
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 von piptrade Beitrag anzeigen
Zitat:
Zitat von next user Beitrag anzeigen
Die beiden Tickets werden ja beim "updateSL()" und nachher auch bei der Schließbedingung verwendet.
Da es ursprünglich nur um die beiden Orders ging, habe ich die beiden Variablen eingeführt. Allerdings hatte ich auch erwartet,
das du sie dann auch überall nutzt. Die Ticketnummern speicherst du bei "OrderSend()" aber anscheinend (erst) in einer
Variablen "res". Warum nutzt du nicht die beiden Ticketvariablen? Auch sind die nicht als lokale Variablen in "OnTick()" vorgesehen,
sondern wurden von mir ursprünglich global definiert...
---> Die Variablen wurden jetzt wieder global, also ganz oben, angeordnet. So zum 2. Teil Deines Zitates.
---> Den ersten Teil des Zitates verstehe ich allerdings nicht. Die Verwendung der Tickets = ok. und verstanden. NICHT verstanden Deine Erwartung, dass ich die Tickets auch überall verwenden soll und die Ticketnummern bei "OrderSend()" zu speichern sind.
Wo sollten die Tickets denn noch genutzt werden ? Und was hat es mit der "OderSend()" und einer Speicherung der Ticketnummern auf sich. Beides wurde bisher gar nicht erwähnt. Oder ? ...
Was ich damit meinte (wie geschrieben, ausgehend von 2 Orders!), z.B.:
Zitat:
Zitat von piptrade Beitrag anzeigen
Code:
res = OrderSend(Symbol(), OP_BUY, LotsOptimized(), Ask, 3, 0, 0, "", MagicNumber, 0, Green);
"OrderSend()" liefert ja die Ticketnummer. Warum nutzt du hier "res"? Warum nicht direkt die Ticket-Variablen?
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...

  • Zitat:
    Zitat von piptrade Beitrag anzeigen
    Code:
    int    orderTicket1 = 0;                 //  jetzt wieder global
          int    orderTicket2 = 0;                 //  jetzt wieder global
    ...
    ...
    void  OnDeinit() { Funktion hatte in der Form noch gefehlt !
    Jap.

  • Zitat:
    Zitat von piptrade Beitrag anzeigen
    Code:
    CheckForUpdateSL();           //     <=========== NEU (für Block_B)
    //                          notwendig für späteren Aufruf dieser Funktion
    Erklär mir mal, was diese zweite Funktion für eine Notwendigkeit für spätere Aufrufe hat.

  • Zitat:
    Zitat von piptrade Beitrag anzeigen
    Code:
    MODE_TRADES  hinzugefügt
    Joahh. Da es der vorbelegte Standard ist, lass ich es immer weg...

  • Zitat:
    Zitat von piptrade Beitrag anzeigen
    Code:
    void CloseAllOrders()  { AllOrders closed                                                
    }        //  Anwendg. by TakeProfit / Pos.1, Pos. 3 - 6 /not for Pos.2
    Dann müsste man bei Block A noch ergänzen und prüfen, ob Pos 1 nicht SCHON geschlossen ist, wenn du sagst,
    das "CloseAllOrders()" auch für Pos 1 Verwendung findet.

----------------------------------------------------------------

So, jetzt noch kurz zum Code an sich:

  • Zitat:
    Zitat von piptrade Beitrag anzeigen
    1. Schritt: es werden "int Ticket_1 = 0" und "int Ticket_2 = 0" global (also im Code ganz oben) deklariert.

    CODE:
    Code:
    //--- globale Deklarationen (extern bzw. intern) --------------------+
          int    orderTicket1 = 0;                 //  jetzt wieder global
          int    orderTicket2 = 0;                 //  jetzt wieder global
    Einigen wir uns jetzt auf den ersten, oder den zweiten Variablennamen?

  • Zitat:
    Zitat von piptrade Beitrag anzeigen
    CODE:
    Code:
    CheckForUpdateSL();           //     <=========== NEU (für Block_B)
    //                          notwendig für späteren Aufruf dieser Funktion
    ...
    ...                             
    void CheckForUpdateSL()(int ticket)  {
       ResetLastError();                        //  könnte ev. entfallen !
    
    //--- Pos. 1
       if(OrderSelect(ticket,SELECT_BY_TICKET))  {
          if(OrderType() == OP_BUY  &&  openOrders == 1)  {
             if(Bid - OrderOpenPrice() > Trail_Target_1 *100 * Point)  {
                if(OrderStopLoss() < Bid - TSL_1 || OrderStopLoss() == 0)
                {
                   if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL_1, OrderTakeProfit(), Blue))
                      Print("Error setting Buy trailing stop: ", GetLastError());
                }
             }
          }
          else if(OrderType() == OP_SELL  &&  openOrders == 1)  {
             if(OrderOpenPrice() - Ask > Trail_Target_1 *100 * Point)  {
                if(OrderStopLoss() > Ask + TSL_1 || OrderStopLoss() == 0)
                {
                   if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL_1, OrderTakeProfit(), Blue))
                      Print("Error setting Sell trailing stop: ", GetLastError());
                }
             }
          }
    //--- Pos.2     
          if(OrderType() == OP_BUY  &&  openOrders == 2)  {
             if(Bid - OrderOpenPrice() > Trail_Target_2 *100 * Point)  {
                if(OrderStopLoss() < Bid - TSL_2 || OrderStopLoss() == 0)
                {
                   if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSL_2, OrderTakeProfit(), Blue))
                      Print("Error setting Buy trailing stop: ", GetLastError());
                }
             }
          }
          else if(OrderType() == OP_SELL  &&  openOrders == 2)  {
             if(OrderOpenPrice() - Ask > Trail_Target_2 *100 * Point)  {
                if(OrderStopLoss() > Ask + TSL_2 || OrderStopLoss() == 0)
                {
                   if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSL_2, OrderTakeProfit(), Blue))
                      Print("Error setting Sell trailing stop: ", GetLastError());
                }
             }
          }
    //---
       }
    }
    • Doppelte Codeblöcke müssen nicht sein!
    • Ich sehe hier schon wieder NUR die Unterscheidung zwischen Order 1 & 2. Das kann man doch bequem mit den Tickets machen.
    • Wie schon gesagt, erklär bitte, warum diese eingeführte Funktion notwendig ist?
  #54 (permalink)  
Alt 27.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 152
piptrade befindet sich auf einem aufstrebenden Ast
Standard

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:
Du führst ja wieder etwas ein...
Also Punkt 2 & 3, damit sind die von dir neu hinzugefügte Funktion "CheckForUpdateSL()" und meine ursprüngliche "updateSL()" gemeint.
---> "updateSL()" unter "void OnTick()"; bzw. "void updateSL(int ticket)", als eigenständige Funktion, wären hier natürlich richtig gewesen !

Pkt.2)
Zitat:
Zitat von piptrade Beitrag anzeigen
Code:
res = OrderSend(Symbol(), OP_BUY, LotsOptimized(), Ask, 3, 0, 0, "", MagicNumber, 0, Green);

Zitat:
"OrderSend()" liefert ja die Ticketnummer. Warum nutzt du hier "res"? Warum nicht direkt die Ticket-Variablen?
Wo erst bekommen denn bei dir die Ticket-Variablen ihren Wert?
Das meinte ich mit "überall" nutzen.
---> wenn ich Dich hier richtig verstehe, sollte ich auf das "res" (Eröffnung der Pos.1 nach Strategie) verzichten und statt dessen
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");
Richtig ? Und wenn "Ja", müßte ich wahrscheinlich hier das "int ticket" gegen unser "int ticket_1" austauschen.
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:
Erklär mir mal, was diese zweite Funktion für eine Notwendigkeit für spätere Aufrufe hat.
---> wenn ich unter "void OnTick()" dieses "CheckTakeProfit();" aufführe, damit die spätere und weiter unten angeführte Funktion
"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:
Dann müsste man bei Block A noch ergänzen und prüfen, ob Pos 1 nicht SCHON geschlossen ist, wenn du sagst, dass "CloseAllOrders()" auch für Pos 1 Verwendung findet.
---> wird die Prüfung der Pos.1 nicht schon durch diese Zeilen erledigt ?

Code:
     if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))  {
        if(OrderSelect(orderTicket1,SELECT_BY_TICKET,MODE_TRADES))
.. und, wenn "Ja" soll doch nicht mehr dieses "CloseAllOrders()", sondern statt dessen "if(!OrderClose(orderTicket1,Order... )"
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.
  #55 (permalink)  
Alt 27.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von piptrade Beitrag anzeigen
Pkt.1)
---> "updateSL()" unter "void OnTick()"; bzw. "void updateSL(int ticket)", als eigenständige Funktion, wären hier natürlich richtig gewesen !
Lass uns bitte aufhören, von Funktion und Funktionsaufruf getrennt zu reden, ok.

=== === === === === === === === === === === ===

Zitat:
Zitat von piptrade Beitrag anzeigen
Pkt.2)
---> wenn ich Dich hier richtig verstehe, sollte ich auf das "res" (Eröffnung der Pos.1 nach Strategie) verzichten und statt dessen
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");
Ja, die Ticket-Variablen einfach direkt bei "OrderSend()" füllen.

Zitat:
Zitat von piptrade Beitrag anzeigen
Und wenn "Ja", müßte ich wahrscheinlich hier das "int ticket" gegen unser "int ticket_1" austauschen.
Hattest du mit deinem letzten Post nicht bestätigt, das wir uns jetzt auf "orderTicket1 / 2" geeinigt haben?
Der Rest ist richtig.

Zitat:
Zitat von piptrade Beitrag anzeigen
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 ?
Da bist du jetzt denke ich bischen durcheinander:
Code:
void updateSL(int ticket)
{
...
}
Das ist die erstellte Funktion selbst! Die Variable "ticket" ist nur ein Parameter für die Funktion (Platzhalter). Die Ticket-Variablen selbst
werden doch beim Aufruf genutzt:
Code:
if(orderTicket1)  updateSL(orderTicket1);   
if(orderTicket2)  updateSL(orderTicket2);
=== === === === === === === === === === === ===

Zitat:
Zitat von piptrade Beitrag anzeigen
Oder sind unter "void OnTick()" werder dieses "CheckTakeProfit()" noch das "updateSL()" notwendig ? (So ist es, glaube ich !)
So, jetzt kommst du wohl ganz aus der Spur, oder?
"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:
Zitat von piptrade Beitrag anzeigen
---> wird die Prüfung der Pos.1 nicht schon durch diese Zeilen erledigt ?

Code:
     if(OrderSelect(orderTicket2,SELECT_BY_TICKET,MODE_HISTORY))  {
        if(OrderSelect(orderTicket1,SELECT_BY_TICKET,MODE_TRADES))
Nope! Die erste fragt ab, ob Pos2 schon geschlossen ist. Ist das der Fall, so wird in der zweiten die Pos1 selektiert, UM sie zu schließen!
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:
Zitat von piptrade Beitrag anzeigen
.. und, wenn "Ja" soll doch nicht mehr dieses "CloseAllOrders()", sondern statt dessen "if(!OrderClose(orderTicket1,Order... )"
Verwendung finden. Oder liege ich da falsch ?
Davon bin ich ja bis jetzt ausgegangen, aber dann schreibst du in deinem Code, das ALLE Orders bis auf Order2 von
"CloseAllOrders()" verarbeitet werden. Da hast du mich verwirrt...

=== === === === === === === === === === === ===

Zitat:
Zitat von piptrade Beitrag anzeigen
Pkt.1) "int orderTicket1 = 0;" bzw. "int orderTicket2 = 0;" - so steht es jetzt durchgängig im Code.
Gut.

Zitat:
Zitat von piptrade Beitrag anzeigen
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.
Mit "Doppelblöcke" meinte ich nicht "nahezu identisch", sondern, dass man diese 4 Blöcke mit großen Ähnlichkeiten
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...
  #56 (permalink)  
Alt 29.03.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 152
piptrade befindet sich auf einem aufstrebenden Ast
Standard

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.
  #57 (permalink)  
Alt 29.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von piptrade Beitrag anzeigen
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.
Jap. Das ist so ziemlich das beste "Lernmaterial". Einmal selber verstanden, geht es wie Butter von der Hand...

Dir auch noch schöne Feiertage.
  #58 (permalink)  
Alt 04.04.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 152
piptrade befindet sich auf einem aufstrebenden Ast
Standard

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.
  #59 (permalink)  
Alt 06.04.18
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 152
piptrade befindet sich auf einem aufstrebenden Ast
Standard

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 !
Thema geschlossen

Lesezeichen

Stichworte
alle order schließen, closeallorders, mql4, programmierung, programmierung metatrader, programmierung mql4, trailingstop


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 11:40 Uhr.


Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2018 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------