|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Wert eines Arrays bearbeiten
Hallo,
ich habe eine weitere Frage: Ich möchte die Stopps einzelner Positionen eines dynamischen Arrays bearbeiten. Im Beispiel Short-Orders soll das wie folgt geschehen: 1. Die erste bzw. letztgekaufte (die mit dem kleinsten "OrderPrice") : Sie soll(-en) a) nicht bearbeitet werden (hat schon den passenden SL), solange der Kurs über dem "OrderPrice" notiert, b) den Stopp auf "OpenPrice" gesetzt bekommen, wenn der Kurs den "OpenPrice" - Testspanne unterschreitet (also <OrderStopLossII), c) den Stopp auf OrderStopLossII (...ist "OpenPrice" - Testspanne) gesetzt bekommen, wenn der Kurs "OpenPrice" - 2*Testspanne unterschreitet. 2. Für alle weiteren (oder wenn eine (die erste?) Position allein in diese Situation kommt: Fällt der Kurs danach weitere 10 Punkte, soll der SL um die Hälfte, also 5 Punkte nachgezogen werden - allerdings niemals wieder erhöht werden. Vereinfacht: Kauf zu 100, SL 110 (hier nicht das Problem, wird bei Kauf eingerichtet). Kurs 90: SL auf 100 (= "OpenPrice") Kurs 80: SL auf 90 (= OrderStopLossII) Kurs 70: SL auf 85 (50% der Strecke, hier 10 Punkte als Basis). Wie ich das schreibe, fällt mir auf, dass die "if"-Bedingungen für das OrderModifying evtl. nicht stimmen, das ist aber nicht mein Problem. Das Problem: ich setze die Bedingungen "if (iArrS <=1)" bzw. dito >1 und diese Bedingungen funktionieren scheinbar nicht, selbst wenn ich nur (abstrakt ausgedrückt) "Print irgendwas" anweise. Der Code diesmal als Datei, hier auch nochmal eingefügt (Traderdoc, das mit dem "# drücken verstehe ich nicht...): int CountShortCustomized; int LotsShortDone=0; int ShortSLAdj=0; int DivisorS=0; int SStopLossII=0; int SReduceValue=0; int TestspannePkt=10; double SBoughtPerc2; double SStoppSpanne=0; if (iPosS > 0) ArraySort (ArShortOrderOpenPrices, WHOLE_ARRAY, 0, MODE_ASCEND); int ArSSize=ArraySize(ArShortOrderOpenPrices); for (int iArrS=0; iArrS<=ArLSize; iArrS++) { if (OrderSelect(iArrS, SELECT_BY_POS, MODE_TRADES) == true) { if (OrderMagicNumber() == MagicNumberShort && OrderType() == OP_SELL) { //SBoughtPerc2 = NormalizeDouble(OrderOpenPrice() * NextBuyPercent / 100, Digits); //Print("SBoughtPerc2 = OrderOp * NextBuyPrc / 100: ", SBoughtPerc2, "; ", OrderOpenPrice(), "; ", NextBuyPercent, " Margin: ", SYMBOL_MARGIN_INITIAL); SBoughtPerc2 = TestSpannePkt; SStoppSpanne = OrderOpenPrice() + SBoughtPerc2; SStopLossII = OrderOpenPrice() - SBoughtPerc2; //Zwischenberechnung Trail-SL int STrailBaseValue; int STrailAdjValue; int STrailValue; STrailBaseValue = OrderStopLoss() - Ask; STrailAdjValue = STrailBaseValue * 0.5; STrailValue = SStopLossII - STrailAdjValue; int TicketShort_No = OrderTicket(); if (iArrS <= 1) { if (OrderStopLoss() > OrderOpenPrice() && Ask > SStopLossII) { Print("Position ist die Letztgekaufte (Short); aufsteigend: SL II: ", SStopLossII, ", OpenPrice: ", OrderOpenPrice(), ", Kurs: ", Ask, ", akt. SL: ", OrderStopLoss(), ", Done (0?): ", LotsShortDone); } if (OrderStopLoss() > OrderOpenPrice() && Ask < SStopLossII) { bool SShortAdjResult=false; SShortAdjResult = OrderModify(TicketShort_No,0,OrderOpenPrice(),0,0, Red); } if (Ask < SStopLossII && OrderStopLoss() > OrderOpenPrice() +10 && OrderStopLoss() > OrderOpenPrice() -10)// && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumberShort) //---"+ 10" und "- 10" fangen Rundungsfehler ab { SShortAdjResult=false; SShortAdjResult = OrderModify(TicketShort_No,0,SStopLossII,0,0,Red); } if (Ask < OrderStopLoss() && OrderStopLoss() <= SStopLossII && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumberShort) { ShortSLAdj = STrailValue; SShortAdjResult=false; SShortAdjResult = OrderModify(TicketShort_No,0,ShortSLAdj,0,0,Red); } } if (iArrS > 1) if (Ask < OrderStopLoss() && OrderStopLoss() < SStopLossII && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumberShort) { ShortSLAdj = STrailValue; SShortAdjResult=false; SShortAdjResult = OrderModify(TicketShort_No,0,ShortSLAdj,0,0,Red); Print("Position angepasst (ab Pos. 3): SL = Trail-SL 50%; Trail-SL = ", ShortSLAdj, "; Ticket: ", TicketShort_No, ", Index: ", iArrS); } CountShortCustomized++; } } LotsShortDone = ArSSize - CountShortCustomized; } |
|
|||||
Zitat:
und füge deinen Code zwischen den beiden Tags ein. Zitat:
2. "Für alle weiteren", die obigen Punkte gelten also nur für die eine Order? "Fällt der Kurs danach weitere 10 Punkte", die anderen Orders sollen also erst verarbeitet werden, wenn die eine Order die obigen Punkte erreicht hat? Sorry, ich sollte so langsam schlafen gehen... Code:
int ArSSize=ArraySize(ArShortOrderOpenPrices); for (int iArrS=0; iArrS<=ArLSize; iArrS++) Bist du ausschließlich im DAX? Wenn nicht, so würde ich mir diese Zeilen nochmal überlegen: Code:
SStoppSpanne = OrderOpenPrice() + SBoughtPerc2; SStopLossII = OrderOpenPrice() - SBoughtPerc2; ... OrderOpenPrice() +10 OrderOpenPrice() -10 Hmmm, echt? Code:
for (int iArrS=0; iArrS<=ArLSize; iArrS++) ... if (iArrS <= 1) { if (OrderStopLoss() > OrderOpenPrice() && Ask > SStopLossII) { Print("Position ist die Letztgekaufte (Short); aufsteigend: SL II: ", SStopLossII, ", OpenPrice: ", OrderOpenPrice(), ", Kurs: ", Ask, ", akt. SL: ", OrderStopLoss(), ", Done (0?): ", LotsShortDone); } Das wäre doch nur der Fall, wenn du auch nur 2 Positionen hast. Außerdem wirst du, wie schon erwähnt Probleme mit "SStopLossII" haben, da diese Variable eine Ganzzahl ist. Zitat:
Außerdem wirst du Probleme mit diesen drei Zeilen haben, da sowohl alle drei Variablen hier, als auch "SStopLossII" vom Typ INT sind, und somit nacher alle nur einen ganzzahligen Wert beinhalten werden, der aufgrund der Berechnungen nichtmal richtig sein wird. Dadurch werden auch deine späteren Bedingungen und Berechnungen fehlerhaft sein. Zitat:
Außerdem wird "CountShortCustomized++" unabhängig vom If verarbeitet, hoffe das ist so gewollt (nicht, das es noch zum ersten If gehören sollte). Zitat:
|
Lesezeichen |
Stichworte |
array, array berechnen, array werte wählen, arrays, arrays berechnen, mql4, programmierung, programmierung metatrader, programmierung mql4, trailing stopp |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|