Einzelnen Beitrag anzeigen
  #45 (permalink)  
Alt 25.03.18
piptrade piptrade ist offline
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Wink

So, nun endlich meine Antwort:

Lieber next user,

Zitat:
Zitat von piptrade
Bei "openOrders == 1" bzw. "openOrders == 2" wird es schon interessanter:
Zitat von next user
Nur so nebenbei gefragt, wenn "openOrders" ... zwischen 1 & 2 trennt, könntest du dort doch einfach auch die
beiden Variablen "orderTicket1 / 2" nutzen.
Genau diese (Deine) Idee hat auch mich beschäftigt! (- deshalb erst jetzt meine Antwort ---> sorry !)
Und "Yes !" Inhaltlich völlig richtig und auch mein Ansinnen ! ...

Vorschlag:
Als erstes sollten wir uns vielleicht wieder auf einen einheitlichen Sprachgebrauch einigen und dabei die einzelnen Code-Bezeichnungen ggf. etwas eindeutiger formulieren:

A) Block_A (ehemals "Block 1" = neue Benennung!) = der, welcher unter "void OnTick()" zugeordnet ist, welcher die Ticket-Abfrage bewerkstelligen und die openOrder == 1 (Pos.1) schließen soll.

Code:
void OnTick() { 
// ...
int    orderTicket1 = 0;
int    orderTicket2 = 0;

   if (orderTicket1) 
       updateSL(orderTicket1);
   if (orderTicket2)   //  usw. 
//......
B) Block_B (ehem. "Block 2" = auch neue Benennung!) = der, welcher die Pos.1 (OrderOpening nach strategy-conditions = "void CheckForOpen()") auslöst und so auch für die Initiierung "Ticket_1" verantwortlich ist.

Code:
void CheckForOpen()  {   //  Formulierung entsprechend üblicher Codes
//....
      {
      res = OrderSend(Symbol(), OP_BUY, LotsOptimized(), Ask, 3, 0, 0, "", MagicNumber, 0, Green);
      return;
      }   
//    analog für SELL
//....
//    hier müßte dann das Ticket_1 (updateSL = Ticket_1 ????) initiiert werden
}
C) Block_C (bisher nicht benannter Block) = der, welcher die Pos.2 (Hedging = "void CheckHedgeOpen()") auslöst und so auch für die Initiierung "Ticket_2" verantwortlich wäre.

Code:
void CheckHedgeOpen() {
//...
   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;
   }   
//    analog für SELL
//....
//    hier müßte dann das Ticket_2 (updateSL = Ticket_2 ????) initiiert werden
}
Wobei sich gerade hier eine Frage aufdrängt: Wird dieses "Ticket_2" überhaupt gebraucht ? Die Pos.2 wird doch schon durch den TP bzw. den SL geschlossen ! (Probleme gab es immer nur, wenn dieses "CloseAllOrders()" (unter "void TrailStopLoss()") die Pos.2 UND die Pos.1 schließen sollte. Ließ ich die Pos. 1 unberührt, war ja "alles paletti" !)
Und wenn wir dieses "Ticket_2" tatsächlich nicht brauchen, könnte im "Block_A" ja auch die "Abfrage in der History" entfallen.
Ob all diese Gedanken richtig sind, weiß ich nicht, - dennoch erscheinen sie mir logisch !

Eine zweite Idee (Deine Frage: Wo wird denn die Pos.1 eröffnet?) könnte darin bestehen, dass man genau diese EröffnungsOrder modifiziert, indem eine "OrderModify ..." ergänzt wird, die schon einen SL enthält. (Auslöser: openOrders == 2 oder fix, die Hedge-Grenze 1 Pkt. überschreitend) - In diesem Falle könnten wir sogar auf die gesamte "Ticket-Geschichte" verzichten !

Die Vorteile hier : 1.) Verlustbegrenzung = wird verbessert
2.) Die 3. Position (jetzt openOrder == 2 !!!) würde nicht mit 1.1 lot sondern wiederum mit 0.4 lot ausgelöst werden, was dann die Gesamt-Positionsgröße der Tradefolge reduziert und damit ggf. auch eine Pos.7 (wäre ja auch für kleinere Equity sinnvoll !) zulässt. Nur `mal so nebenbei !


In der Hoffnung, dass die o.a. Gedanken und Ideen zumindest nachvollziehbar und halbwegs richtig/umsetzbar sind, würde ich gern
diese Änderungen/Optimierungen vornehmen. Wäre oder "IST" das der richtige Weg ?

Und wieder einmal in Erwartung Deiner (hoffentlich baldigen) Antwort sowie mit

dem üblichen DANKE und LG. pt.


PS.: Wenn wir dann ggf. bis zu dieser Stelle Einigkeit hergestellt haben, müsste nur noch Ticket_1 (in "Block_B") initiiert, "Block_A" inhaltlich reduziert und die richtige Korrespodenz zwischen den Blöcken A und B hergestellt werden. So zur ersten neuen Idee. Ist das soweit richtig ?
Zum zweiten Gedanken: "OrderModify ..." in der "void CheckForOpen()"- hier müsste eine korrekte Formulierung und Einfügung erfolgen.
Wenn Dein "JA" vorliegt, sollte das "Dingeling" nun endlich, und wie gewünscht, funktionieren !