Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 43248
Benutzer: 7.219
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Hopfen&Malz
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107
vor 2 Wochen
- rg-trader

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 247
Gesamt: 247
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 27.07.17
Neues Mitglied
 
Registriert seit: Jul 2017
Beiträge: 20
icepick1661 befindet sich auf einem aufstrebenden Ast
Standard 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;
}
Angehängte Dateien
Dateityp: mq4 Find Highest Long-Order_Test.mq4 (58,7 KB, 2x aufgerufen)
  #2 (permalink)  
Alt 27.07.17
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von icepick1661 Beitrag anzeigen
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

und füge deinen Code zwischen den beiden Tags ein.

Zitat:
Zitat von icepick1661 Beitrag anzeigen
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 anzeigen
//---"+ 10" und "- 10" fangen Rundungsfehler ab
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);
   }
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 anzeigen
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 anzeigen
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 anzeigen
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.
Thema geschlossen

Lesezeichen

Stichworte
array, array berechnen, array werte wählen, arrays, arrays berechnen, mql4, programmierung, programmierung metatrader, programmierung mql4, trailing stopp

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------