Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Wert eines Arrays bearbeiten (http://www.expert-advisor.com/forum/showthread.php?t=5779)

icepick1661 27.07.17 00:23

Wert eines Arrays bearbeiten
 
Liste der Anhänge anzeigen (Anzahl: 1)
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;
}

next user 27.07.17 05:16

Zitat:

Zitat von icepick1661 (Beitrag 39316)
Der Code diesmal als Datei, hier auch nochmal eingefügt (Traderdoc, das mit dem "# drücken verstehe ich nicht...):

Drücke beim nächsten mal folgendes
http://fs5.directupload.net/images/170727/ahmxx3tl.jpg
und füge deinen Code zwischen den beiden Tags ein.

Zitat:

Zitat von icepick1661 (Beitrag 39316)
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.

1. Der kleinste "OrderPrice", also Order mit kleinstem Abstand zum Kurs (Short)?
  • a) Solange nicht im Plus-Bereich, tue nichts.
  • b) Wenn Kurs unter Testspanne, dann BreakEven.
  • c) Wenn Kurs unter 2*Testspanne, dann OrderStopLossII.
Ist so bischen besser formuliert.

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++)

In der Schleife müsste es doch "ArSSize" sein.

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

Bei der zweiten speicherst du übrigens "OrderOpenPrice() - SBoughtPerc2 (10)" in eine Int-Variable, ist sicherlich nicht so gewollt.
Zitat:

Zitat von icepick1661 (Beitrag 39316)
//---"+ 10" und "- 10" fangen Rundungsfehler ab

Hmmm, echt? :D

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);
  }

Wie kann es die letztgekaufte Position sein, wenn du hier wegen "iArrS <= 1" immer die erste und zweite nimmst?
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:

Zitat von icepick1661 (Beitrag 39316)
STrailBaseValue = OrderStopLoss() - Ask;
STrailAdjValue = STrailBaseValue * 0.5;
STrailValue = SStopLossII - STrailAdjValue;

Die ersten beiden sollen also die 50% darstellen. Das würde ich allerdings erst machen, wenn der Kurs NICHT im Negativen (Minus-Bereich der Order) ist.

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:

Zitat von icepick1661 (Beitrag 39316)
Code:

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++;


Hier würde ich dir raten, den ersten If-Block mit geschweiften Klammern zu versehen, oder wenigstens einzurücken und die leere Zeile dazwischen zu löschen.
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:

Zitat von icepick1661 (Beitrag 39316)
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.

Mögliche Ursachen
  • Code:

    int ArSSize=ArraySize(ArShortOrderOpenPrices);

    for (int iArrS=0; iArrS<=ArLSize; iArrS++)

    Wenn "ArLSize" nicht definiert, oder kleiner als 0 ist, wird die Schleife nicht ausgeführt. Hier muss doch "ArSSize" anstatt "ArLSize" hin.
    --------------------------------------------------------------------
  • Code:

    if (OrderSelect(iArrS, SELECT_BY_POS, MODE_TRADES) == true)
    {
      if (OrderMagicNumber() == MagicNumberShort && OrderType() == OP_SELL)
      {

    Wenn eine der Bedingungen falsch ist, so kommst du erst garnicht rein, um etwas auszugeben.
    --------------------------------------------------------------------
  • Ansonsten versuch mal direkt nach
    Code:

    if (iArrS <= 1)

    oder

    if (iArrS > 1)

    etwas auszugeben. Überprüf aber erst mal alles vorherige, ob du überhaupt zu den If's kommst.


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:58 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum