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)
-   -   Positionsgröße Berechnen (http://www.expert-advisor.com/forum/showthread.php?t=6872)

RalphD 23.12.20 02:55

Positionsgröße berechnen
 
Hallo zusammen,

seit ca. zwei Wochen beschäftige ich mich intensiv mit dem Codeing. Die ersten EA´s laufen ganz gut. Jetzt verheitze ich mich aber schon seit Tagen an der Positionsgrößenberechnung.

Ich möchte den Eurobetrag pro Trade eingeben und anhand des SL soll dann die Size berechnet werden. Was auch gehen würde, besser beides um es auszuwählen, wäre die Berechnung in Prozent der Kontogröße.

Leider habe ich bis jetzt nichts Erklärendes dazu gefunden.

Kann mir da jemand bitte helfen eine Quelle zu finden, wo das erklärt wird? Oder vielleicht sogar einen Codeschnipsel dazu hat.

Vielen Dank im voraus.
Ralph

traderdoc 23.12.20 07:25

Nun ja, wo liegt das Problem?

Die Formel lautet doch ganz einfach:

Profit = Lot * Pips * Tickvalue

Das Umstellen nach Lot überlasse ich Dir.
Pips sind dabei wirklich die Änderungen in der letzten Kommastelle und
Tickvalue ist der Geldbetrag der Änderung in der letzten Stelle.
Ansonsten statt Profit x%*Kontogröße/100 einsetzen.

Traderdoc

RalphD 23.12.20 11:33

Liste der Anhänge anzeigen (Anzahl: 1)
Danke für die schnelle Antwort.

Die Formel ist nicht das Problem. Es ist mehr die Umsetzung. Ich weiß z.B. nicht wann ich NomalizeDouble, _Point oder Digits oder einen Umrechnungsfaktor verwenden muss. Oder ob ich da vielleicht einen total umständlichen Weg gewählt habe.
Ich habe mal meine Testdatei hier rein gestellt. Und schon mal sorry dafür. Bin halt noch ganz am Anfang.

traderdoc 23.12.20 11:43

Zitat:

Zitat von RalphD (Beitrag 44868)
Danke für die schnelle Antwort.

Die Formel ist nicht das Problem. Es ist mehr die Umsetzung. Ich weiß z.B. nicht wann ich NomalizeDouble, _Point oder Digits oder einen Umrechnungsfaktor verwenden muss. Oder ob ich da vielleicht einen total umständlichen Weg gewählt habe.
Ich habe mal meine Testdatei hier rein gestellt. Und schon mal sorry dafür. Bin halt noch ganz am Anfang.

Anstatt
double Kerzenrange=((High[1]-Low[1])*10000);

muss stehen:

double Kerzenrange=((High[1]-Low[1])/Point);

Und die Formel scheint doch ein Problem zu sein, da in Deiner Formel Tickvalue fehlt: MarketInfo(Symbol(), MODE_TICKVALUE)

traderdoc

RalphD 23.12.20 12:10

Danke für die Korrektur der Berechnung.
MarketInfo. Hm?!?
Ich sag ja. Ich bin ganz am Anfang. Nun habe ich zwar die Info, kann aber damit noch nicht wirklich was anfangen. Ich werde damit weiter experimentieren. Dann wird es wohl weiter gehen mit Try and Error.
Wo kann man denn darüber etwas nachlesen?

traderdoc 23.12.20 17:08

Na dann will ich Deinem Try and Error mal ein rasches Ende setzen:

int LS = (int)(-MathLog10(MarketInfo(Symbol(),MODE_LOTSTEP)));
double TV = MarketInfo(Symbol(), MODE_TICKVALUE);
double TP = (High[1]-Low[1])/Point;

double Lot = NormalizeDouble(AccountBalance()*Risiko%/100/TP/TV, LS);

Schöne Weihnachten!

traderdoc

RalphD 23.12.20 18:26

Das ist wahnsinnig nett von dir. Vielen lieben Dank.

Allerdings muss ich gestehen, dass ich das nur teilweise verstehe. Das macht aber nichts. Ich habe jetzt einen Ansatz nach was ich suchen muss. ich verstehe nämlich gern was ich mache. Werde mir erst mal anschauen was die einzelnen Variablen machen. Vielleicht hast du ja Lust das mal irgendwann zu erklären. Bis dahin frage ich Tante Google erstmal.

Nochmal vielen Dank und ein schönes Weihnachtsfest.

Ralph

traderdoc 23.12.20 23:34

Zitat:

Zitat von RalphD (Beitrag 44873)
Das ist wahnsinnig nett von dir. Vielen lieben Dank.

Allerdings muss ich gestehen, dass ich das nur teilweise verstehe. Das macht aber nichts. Ich habe jetzt einen Ansatz nach was ich suchen muss. ich verstehe nämlich gern was ich mache. Werde mir erst mal anschauen was die einzelnen Variablen machen. Vielleicht hast du ja Lust das mal irgendwann zu erklären. Bis dahin frage ich Tante Google erstmal.

Nochmal vielen Dank und ein schönes Weihnachtsfest.

Ralph

Als zusätzliches Weihnachtsgeschenk die Erklärung:
LS ist die Anzahl der Kommastellen der vom Broker festgelegten Lotgrößen. Die werden abgeleitet aus der Schrittweite der Lotgrößenänderung.
TV ist das bereits erwähnte Tickvalue, also der Wert in Accountwährung, der bei Änderung des Kurses in der letzten Stelle nach dem Komma eintritt.
TP ist der TakeProfit aus Deiner Berechnung bzgl. der Differen z des High und des Low der letzten geschlossenene Kerze dividiert durch Point, dem Wert der kleinsten Wertänderung dargestellt als Dezimalzahl.

Na ja und Lot ist nun die umgestellte Formel, die ich bereits in Post 2 schrieb, ergänzt um die korrekte Berechnung bzgl. der möglichen Lot-Kommastelle als normalisierte Double-Zahl.

Viel Erfolg!

traderdoc

RalphD 24.12.20 00:08

Du bist mein Held. Das bringt mich wieder etwas weiter. Vielen Dank.

Ich hoffe, ich bin auch mal irgend wann in der Lage anderen hier zu helfen. Im Moment bin ich leider nur am nehmen und nicht am geben.

Nochmal Danke und liebe Grüße
Ralph

RalphD 07.01.21 14:13

Hallo traderdoc,

kannst du mir bitte nochmal helfen?

Die Berechnung funktioniert jetzt. Zumindest wenn ich es in einem abgespeckten Code teste. Nun bin ich am verzweifeln. Ich bekomme im Tester immer einen "zero divide". Wie bekomme ich den StopLoss in die Berechnung? Muss der vorher noch in ein anderes Format als double geändert werden? Der bringt mir hier bei stopLoss den Fehler:

2021.01.07 12:49:13.902 2020.12.28 00:00:00 EA_EMA510v0.006 EURUSD',H1: zero divide in 'EA_EMA510v0.006.mq4' (138,83)

double lotSize = NormalizeDouble(AccountEquity() * riskPercent / 100 / stopLoss / PV, LS);
HTML-Code:

//+------------------------------------------------------------------+
//|  Sell Stop Order                                                |
//+------------------------------------------------------------------+
  if(signal=="Verkaufen" && OrdersTotal()==0)
      stopLoss=High[LastCandleHigh]+15*_Point;
      double PV = MarketInfo(Symbol(), MODE_TICKVALUE);
      int LS = (MarketInfo(Symbol(),MODE_LOTSTEP) == 0.1) + 2 * (MarketInfo(Symbol(),MODE_LOTSTEP) == 0.01); //Schrittweite der Lots
      double lotSize = NormalizeDouble(AccountEquity() * riskPercent / 100 / stopLoss / PV, LS);

      ticket=OrderSend
      (
        _Symbol,                        // string  symbol
        OP_SELLSTOP,                    // int      operation
        lotSize,                        // Volume
        Low[1]-5*_Point,                // Preis (Bid oder Ask)
        10,                              // Slippage
        stopLoss,                        // SL Low- 1,5 Punkt
        Low[1]-TakeProfit/10000,        // TP double  take profit
        "EMA510 Sell 006",              // string  comment
        MagicID,                        // int      magic number
        0,                              // datetime pending order expiration
        clrRed                          // color
      );
//+------------------------------------------------------------------+
//|  Buy Stop Order                                                |
//+------------------------------------------------------------------+
  if(signal=="Kaufen" && OrdersTotal()==0)
      stopLoss=Low[LastCandleLow]-5*_Point;
      PV = MarketInfo(Symbol(), MODE_TICKVALUE);
      LS = (MarketInfo(Symbol(),MODE_LOTSTEP) == 0.1) + 2 * (MarketInfo(Symbol(),MODE_LOTSTEP) == 0.01); //Schrittweite der Lots
      lotSize = NormalizeDouble(AccountEquity() * riskPercent / 100 / stopLoss / PV, LS);

      ticket=OrderSend
      (
        _Symbol,
        OP_BUYSTOP,                      // int      operation
        lotSize,                        // Volume
        High[1]+10*_Point,              // Preis (Bid oder Ask)
        10,                              // Slippage
        stopLoss,                        // SL Low- 0,5 Punkt
        High[1]+TakeProfit/10000,        // TP double  take profit
        "EMA510 Buy 006",                // string  comment
        MagicID,                        // int      magic number
        0,                              // datetime pending order expiration
        clrGreen                        // color
      );



Alle Zeitangaben in WEZ +2. Es ist jetzt 10:46 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