Lot-Größe berechnen - Seite 6

 
Der Vorschlag von mir verwendet OrderCalcProfit() da sollten automatisch(!) die unterschiedlichen Währungen von Symbol und Konto berücksichtigt sein, ebenso wie die unterschiedlichen Berechnungsmethoden.
Lot-Größe berechnen
Lot-Größe berechnen
  • 2020.06.15
  • www.mql5.com
Hallo, ich möchte meine Lot-Größe pro Trade berechnen, dass ich mit einem SL von 250pip max. 2% riskiere...
 
Carl Schreiber:
Der Vorschlag von mir verwendet OrderCalcProfit() da sollten automatisch(!) die unterschiedlichen Währungen von Symbol und Konto berücksichtigt sein, ebenso wie die unterschiedlichen Berechnungsmethoden.

das mag ja sein Carl, aber bei OrderCalcProfit() muss ich die Lotgröße wissen.


bei den Meisten Calc Modi, nicht bei allen gilt

Profit:  (close_price - open_price) * Contract_Size * Lots

demzufolge ist die Lotzahl

Lots = Profit / ((Close_price - OpenPrice) * Contract Size)

für Forex kann ich das Abkürzen wenn ich den SL in Points angebe

lots = Geldrisiko / (stoploss * _sym.TickValue())

Theoretisch könnte ich ja auch für alle anderen bis auf Futures abkürzen


Wenn ich jetzt ein Konto in EUR habe und das CFD für DOW z.B in USD Berechnet wird muss ich das ganze dann noch mal mit 1/EURUSD rechnen, dann hab ichs auch wieder genau

das wäre dann

Lots =  1/BidpriceEURUSD * Geldrisiko / (stoploss * _sym.TickValue())


jetzt zum Konkreten Problem

wenn ich einen Preis beim Dax habe

Entry: 9800,00

Exit: 9700,00

dann habe ich theoretisch 100 Punktedifferenz, dann kommen noch die Kommastellen dazu


Wenn ich jetzt die Formel hernehme

lots = Geldrisiko / (_sym.ContractSize() * abstand);

Bei einer Contractsize von 100 würde das bei einem Konto mit 10k und Risiko 2% folgendes ergeben

Lots = 200 / (100*100)  --> Lots = 0,02


bei seinem Broker habe ich eine Contract Size von 1


das würde dann ergeben

Lots = 200 / (1*100)  --> Lots = 2


im Beispiel

sl: 13124.3 tp: 13137.7

ergibt eine Differenz von 13,4

Lots = 200 / (13,4*1) = 14,9254


wie zum Henker er mit der Formel auf 74 kommt ist mir absolut nicht klar

 
amando:

das mag ja sein Carl, aber bei OrderCalcProfit() muss ich die Lotgröße wissen.

Jain!

Über FixRisk wird wird der mögliche Verlust bei 1.0 Lots errechnet, um damit dann in einem zweiten Schritt die tatsächlich zu handelnden Lots zu berechnen:

Schritt 1:

loss=-m_account.OrderProfitCheck(m_symbol.Name(),ORDER_TYPE_BUY, 1.0,m_symbol.Ask(),sl);

Schritt 2:

lot=MathFloor(m_account.Balance()*m_percent/loss/100.0/stepvol)*stepvol;

 
amando:


im Beispiel

ergibt eine Differenz von 13,4

Lots = 200 / (13,4*1) = 14,9254


wie zum Henker er mit der Formel auf 74 kommt ist mir absolut nicht klar

Du hast hier nen kleinen Fehler drin: Die 13,4 sind der Abstand zwischen SL und TP und nicht der Abstand zwischen entry und SL, das sind 6,7 und ich hatte nicht 2%, sondern 5% riskio daraus folgt:

lots = 500/ (6,7 * 1) = 74,62

 
Carl Schreiber:

Jain!

Über FixRisk wird wird der mögliche Verlust bei 1.0 Lots errechnet, um damit dann in einem zweiten Schritt die tatsächlich zu handelnden Lots zu berechnen:

Schritt 1:

Schritt 2:

Da muss ich mich erstmal einarbeiten, wie das mit dem ganzen Klassen-Zeug funktioniert.. in Java wäre das ja einfach irgendwie so:

risk = new CMoneyFixedRisk();

risk.Percent(5);

double lots = risk.CheckOpenShort(bid,abstand);

So einfach ist es ja offensichtlich nicht (es kommt ja immer 0 raus), also muss ich da erstmal noch ein bisschen lernen.

 
UnknownInnocent:

Du hast hier nen kleinen Fehler drin: Die 13,4 sind der Abstand zwischen SL und TP und nicht der Abstand zwischen entry und SL, das sind 6,7 und ich hatte nicht 2%, sondern 5% riskio daraus folgt:

lots = 500/ (6,7 * 1) = 74,62

Ok, und was passt dann nicht?

das mit entry hab ich verwechselt, dann passt die berechnung ja

der fehler sagt ja nur aus, das du. Icht genug geld am konto hast, ist die frage welchen hebel du hast

 
amando:

Ok, und was passt dann nicht?

das mit entry hab ich verwechselt, dann passt die berechnung ja

der fehler sagt ja nur aus, das du. Icht genug geld am konto hast, ist die frage welchen hebel du hast

1:500, wie baue ich das denn da ein?

Und was anderes... wenn ich da mit 74 lot reingehe, entspricht das doch 74 mal dem aktuellen wert, würde ich mit so einer Summe dann schon den Markt bewegen, bzw. ab wann würde das passieren?

 
UnknownInnocent:

1:500, wie baue ich das denn da ein?

Und was anderes... wenn ich da mit 74 lot reingehe, entspricht das doch 74 mal dem aktuellen wert, würde ich mit so einer Summe dann schon den Markt bewegen, bzw. ab wann würde das passieren?

Du wirst den markt nie bewegen


du hast 10k am konto

10kx500 macht

5000k = 5 000 000


Und du willst 74 bewegen

weil lot size ist ja 1, 

also stimmt mit dem hebel was nicht

 
Carl Schreiber:
Der Vorschlag von mir verwendet OrderCalcProfit() da sollten automatisch(!) die unterschiedlichen Währungen von Symbol und Konto berücksichtigt sein, ebenso wie die unterschiedlichen Berechnungsmethoden.

ich habe jetzt einen Grundaufbau, um CMonexFixedRisk zu verwenden, ist der so richtig? Und kann ich da noch das ein oder andere weglassen, dass es kürzer wird?

#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
#include <Trade\AccountInfo.mqh>
#include <Expert\Money\MoneyFixedRisk.mqh>
CTrade         m_trade;                      // trading object
CSymbolInfo    m_symbol;                     // symbol info object
CAccountInfo   m_account;                    // account info wrapper
CMoneyFixedRisk m_money;
//---
input ushort   InpStopLoss=100;               // StopLoss (in pips)
input double   PercentRisk=5;                // % risk
//---
double ExtStopLoss=0.0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   m_symbol.Name(Symbol());
   m_symbol.Refresh();
   if(!RefreshRates())
     {
      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),
            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));
      return(INIT_FAILED);
     }
//--- tuning for 3 or 5 digits
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   ExtStopLoss=InpStopLoss*m_symbol.Point()*digits_adjust;
//---
   if(!m_money.Init(GetPointer(m_symbol),Period(),m_symbol.Point()*digits_adjust))
      return(INIT_FAILED);
   m_money.Percent(PercentRisk); // 5% risk
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(!RefreshRates())
      return;
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return;

      //--- getting lot size for open long position (CMoneyFixedRisk)
      double sl=0.0;
      double check_open_long_lot=0.0;
      //--- variant #1: StopLoss=0.0
      sl=0.0;
      check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);

      //--- variant #2: StopLoss!=0.0
      sl=m_symbol.Ask()-ExtStopLoss;
      check_open_long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);

      if(check_open_long_lot==0.0)
         return;

      //--- check volume before OrderSend to avoid "not enough money" error (CTrade)
      double chek_volime_lot=m_trade.CheckVolume(m_symbol.Name(),check_open_long_lot,m_symbol.Ask(),ORDER_TYPE_BUY);

      if(chek_volime_lot!=0.0)
         if(chek_volime_lot>=check_open_long_lot)
           {
            if(m_trade.Buy(chek_volime_lot,NULL,m_symbol.Ask(),m_symbol.Ask()-ExtStopLoss,m_symbol.Ask()+ExtStopLoss))
              {
               if(m_trade.ResultDeal()==0)
                  count--;
              }
            else
               count--;
           }
      else
         Print("CMoneyFixedRisk lot = ",DoubleToString(check_open_long_lot,2),
               ", CTrade lot = ",DoubleToString(chek_volime_lot,2));
      //---
  }

//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
      return(false);
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
 
amando:

Du wirst den markt nie bewegen


du hast 10k am konto

10kx500 macht

5000k = 5 000 000


Und du willst 74 bewegen

weil lot size ist ja 1, 

also stimmt mit dem hebel was nicht

Hmm.... absolut keine Ahnung