Fragen zur Geldverwaltungssystem

 

Ich habe eine Lotsize-berechnung geschrieben und bin soweit Fertig wie auch zufrieden damit.

Bei "Forex-paar" berechnungen, berechnet mein Tool die gleiche Lotsize wie der Handelsgrössenrechner von meinem Broker. Also richtig, wie z.B bei dem USD/CAD (Bild anhang)

Genau wie bei fast allen Metallen und allen Energiewerten.

Soweit so gut.

Auch bei Stock CFD`s oder Agricultures lassen sich die Lotsizes bezogen auf Konto-Equity, Freie Margin oder Balance in bezug auf die Stoplossentfernung gut berechnen.

Ausschliesslich bei "Cash Indices CFD`s" liegt die berechnung um 2x 10er Potenzen falsch. Sprich er berechnet das 100x fache.

Z.B. der DAX40 CFD: (Bild anhang)


Es werden 100 Lots berechnet links(Rot) aufgrund fehlerhafter Value of Pips (links grün) berechnung.

In dem Handeslrechner von meinem Broker rechts wird es richtig berechnet. Vor allem hatt er den Korrekten Wert von 1.00€ pro "Tickwert" (Rechts grün)

Hier wird anscheinend mi tganzen Punktwerten gearbeitet. Bei Gold (einzige ussnahme) ist es leider auch so.

Ich weiss nichtmehr weiter und wäre froh wenn mir jemand erklären könnte warum immer in Tick und Pip-Einheiten gerechnet wird. Es bei Indizes aber nicht der Fall ist? Oder warum rechnet der Broker so, wie er rechnet?

Hier ist noch meine Funktion zur Berechnung:

double CalculateLotSize(string sym, double sl_pts, double riskPerc, int MMType)
{
      
      double Capital, Lots = 0.0;
      switch (MMType)
      {
         case '2': Capital = AccountInfoDouble(ACCOUNT_EQUITY); break;
         case '3': Capital = AccountInfoDouble(ACCOUNT_BALANCE); break;
         case '4': Capital = AccountInfoDouble(ACCOUNT_MARGIN_FREE); break;
         default: Alert ("Es konnte keine passende Lotsize gefunden werden! Errror: ", GetLastError()); return(0); break;
      }
        
      string currency = AccountInfoString(ACCOUNT_CURRENCY);
      Comment("Account Currency: "+currency);

      double PipValue = ((SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE)) * point/(SymbolInfoDouble(Symbol(),SYMBOL_TRADE_TICK_SIZE)));   
  
      Lots = (riskPerc/100) * Capital / (PipValue * (sl_pts));
  
  
      
      Lots = floor(Lots * 100) / 100;          // Truncate lot quantity to 2 decimal digits without rounding it
      
      
      Comment ("Lotsize: ", Lots, " SLPips: ",  SLPips, " SL: ", SL, " PipVal: ", PipValue);
      Print("\n" + "Lot size = " + DoubleToString(Lots,2)); 
   
     return (Lots);  
   
} 

in meiner OnInit habe ich noch folgendes dazu:
      
point = _Point;
digit = _Digits;
if((_Digits == 3) || (_Digits == 5)) { point*=10; digit /= 10;} 

Ich hoffe mir kann jemand das Problem mit den Indizies erklären.

Ansonsonen brauchte ich doch eine Methode bzw Funktion, die die Indizes && Gold vorher Heraus-Filtert, sodass ich bei der PipValue "point" == die richtige berechnung zuornet.

Ich hoffe es kennt sich jemand mit dem Thema aus & kann mir Explizit helfen. Links zu den Themen sind schön und gut, kenne mitlerweile aber alles deutschsprachiges.

Danke schonmals

MfG Nils M.

Dateien:
 

Schau mal hier: https://www.mql5.com/en/forum/171632#comment_4154791

und folge dem Link von DeltaPerLot!

Das hilft Dir wahrscheinlich auch: https://www.mql5.com/de/docs/trading/ordercheck

Calculating a trade lotsize by Max Loss in base currency
Calculating a trade lotsize by Max Loss in base currency
  • 2017.03.04
  • www.mql5.com
Hi, still working on my trader managed to fix my trade timer idea using a method combining HonestKnave and Wroeders help, so thanks guys...
 

Ich werd das. Ie verstehen warum man sich das leben mit pips immer so schwer macht

seits 5 stellige broker git, das ist ewig arbeite ich immer mit dem point wert, da geb ich halt sl, tp immer in points ein, das passt für alles und immer.

Was tust mit der zeile?

if((_Digits == 3) || (_Digits == 5)) { point*=10; digit /= 10;} 

und in deinem fenster gibts du sl= 100 pips ein


das wäre jetzt genau 1 punkt im dax weil der hat 2 kommastellen und die fängst du nicht ab.

einfachste Mathematik das da dann 1 lot rauskommmt

 

Doch das geht, ist zwar sinnlos und ein aufwand aber machbar.

einzahlungen sind in der deal info

https://www.mql5.com/de/docs/constants/tradingconstants/dealproperties

jezt kannst du hergehen, schauen wann dein test startet, das ist der erste deal beim testen die einzahlung und diese auslesen

Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
  • www.mql5.com
Eigenschaften der Deals - Handelskonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Digits für DAX40 ist = 2.

Du hast aber nur 3 und 5 berücksichtigt.

Generell fehlt die Unterscheidung in die verschiedenen Asset-Klassen, wie in der Doku beschrieben.

Außerdem benutzt du TICK_VALUE auf Symbolen, bei denen der Wert in variierenden Währung vom Broker geliefert werden kann.


Unter

ENUM_SYMBOL_CALC_MODE

findest du die Formeln.


Ansonsten gibt es noch diesen Thread, als Ergänzung zu DeltaPerLot

https://www.mql5.com/en/forum/425413

Ich glaube, den Hinweis habe ich dir schon Mal gegeben, kann das sein?