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 !