Einzelnen Beitrag anzeigen
  #53 (permalink)  
Alt 27.03.18
next user next user ist offline
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?