Lot-Größe berechnen - Seite 3

 

Das heißt ich rechne einfach so:

double abstand = (rates[1].open - rates[1].close);
   
   double pips; 
                                                                  
   if(_Point == 0.01)
      pips = abstand * 1000;
   else if(_Point == 0.1)
      pips = abstand * 10;
   else
      pips = abstand * 100000;
   
   pips = MathAbs(MathRound(pips));
 
amando:

wenn Du dir die Pipsize ansiehst, dann schau mal in der Doku unter _Point,

dann brauchst Du nicht immer Umrechnen und es passt für alle Symbole

ganz versteh ichs noch nicht was du da machst mit diesem Code

double abstand = (rates[1].open - rates[1].close);
   
   double pipSize = StringFind(_Symbol, "JPY") < 0 ? 0.0001 : 0.01;   //Für Forex GBPAUD: 0.0001, AUDJPY: 0.01
   
   if(StringFind(_Symbol,"Cash") < 1); //Für DAX, DOW & S&P
      pipSize = 0.1;
   
   double pips; 
                                                                  
   if(pipSize == 0.01)
      pips = abstand * 1000;
   else if(pipSize == 0.1)
      pips = abstand * 10;
   else
      pips = abstand * 100000;
   
   pips = MathAbs(MathRound(pips));



jedenfalls wenn Du 

double abstand = (rates[1].open - rates[1].close);
   
double  pips = MathAbs(MathRound(abstand * MathPow(10,_Digits)));


sollte das doch genauso gehen. Dann brauchst Du dich für den Wert nicht immer mit den Kommawerten rumschlagen, es sollte ja allgemein gültig sein

 

Okay, vielen Dank!

double abstand = (rates[1].open - rates[1].close);
   
double  pips = MathAbs(MathRound(abstand * MathPow(10,_Digits)));

Das funktioniert super!

Ich habe wohl noch viel zu lernen xD

 

Ich habe das ganze jetzt nochmal ein bisschen auf meinen Code angepasst:

double RisikoProzent(const string symbol,    //Symbol
                     const double risiko,    //Risiko in Prozent
                     const double sl,        //SL
                     const double abstand)   //Abstand zwischen entry und sl
{
   double Geldrisiko = Kapital /100 * risiko;
   double lots;
   
   if(sl == 0 || abstand == 0)
   {
      Print("You have to enter a StopLoss");
      return 0;
   }
   else
   {  
      //abstand in Pips umrechnen
      double  pips = MathAbs(MathRound(abstand * MathPow(10,_Digits)));
   
      //Lot-Size-Berechnung für alle Forex-Paare
      if(_sym.TradeCalcMode() == SYMBOL_CALC_MODE_FOREX)
         lots = Geldrisiko / (pips * _sym.TickValue());
      
      //Lot-Size-Berechnung für alle Nicht-Forex-Paare mit USD als Basiswährung
      if(_sym.TradeCalcMode() != SYMBOL_CALC_MODE_FOREX &&
         SymbolInfoString(symbol,SYMBOL_CURRENCY_BASE) == "USD")
         lots = Geldrisiko / (_sym.ContractSize() * pips*(1/SymbolInfoDouble("EURUSD",SYMBOL_BID))) ;
      
      //Lot-Size-Berechnung für alle Nicht-Forex-Paare ohne USD als Basiswährung
      if(_sym.TradeCalcMode() != SYMBOL_CALC_MODE_FOREX &&
         SymbolInfoString(symbol,SYMBOL_CURRENCY_BASE) != "USD")
         lots = Geldrisiko / (_sym.ContractSize() * pips) ;
      
      Print("lots: ", lots, " Geld: ", Geldrisiko, " Stop: ", sl, " Risiko: ", risiko);
      
   }
   return lots;
}

Dazu habe ich noch ein paar Fragen:

1. Habe ich das mit den Formeln und den "pips" richtig umgesetzt oder müsste ich mit "abstand" bzw. mit "sl" arbeiten?

2. Funktioniert das jetzt wirklich für alle Paare? Also das erste für alle Forex ist klar, das zweite für alles mit USD also ---USD beispielsweise XAUUSD nehme ich an und beim dritten bin ich unsicher, da müsste ja alles andere, also DAX, DOW, S&P, NASDAQ, usw. drunter laufen.

3. Eine Kurze Erklärung zu dieser Formel wäre hilfreich:

 lots = Geldrisiko / (_sym.ContractSize() * pips*(1/SymbolInfoDouble("EURUSD",SYMBOL_BID))) ;

4. In der Ursprungsversion gab es eine "NearestLot"-Methode, braucht man die?

 

Das funktioniert fur alles, wo usd oder eur die basiswährung ist

bei der forex calculation ist das egal, weil da gilt sowieso nur der pipvale

die nearest lot methode ist da, weil es broker gibt, wo du lots nur in 0,1, 0,25 oder 1 er schritten eingeben darfst


du musst immer aufpassen zwischen pips  und points

Points gilt generell, für pips musst du immer umrechnen, darum immer points, also alle kommastellen verwenden

 
Das heißt, so wie meine methode ist sie jetzt voll einsatzfähig?
 
UnknownInnocent:
Das heißt, so wie meine methode ist sie jetzt voll einsatzfähig?

Ja

 

Nun, leider ist er es wohl doch nicht :/

Die ersten beiden Teile funktionieren super, aber der Drittte Teil für Nicht-Forex und Nicht-USD/EUR riskiert nur weniger als 1% (etwa 0.1%) wenn ich sage, er soll 2% pro Trade riskieren.

if(_sym.TradeCalcMode() != SYMBOL_CALC_MODE_FOREX &&
         SymbolInfoString(symbol,SYMBOL_CURRENCY_BASE) != "USD")
         lots = Geldrisiko / (_sym.ContractSize() * pips) ;
 
Überprüfe mal deine werte
 

Verwende den Debugger und kontrolliere Befehl für Befehl, was Dein Programm macht.

Ist der schnellste Weg!!