Wie berechne ich die Losgröße?

 

Nehmen wir an, mein Minikonto hat eine Marge von 10.000 $, und ich möchte beim nächsten Handel ein Risiko von 2 % eingehen (d.h. ich verwende einfach 200 $, um <eine bestimmte Anzahl> von Kontrakten zu kaufen).

[Mir ist klar, dass dies eine eingeschränkte Sichtweise von "Risiko" ist. Ich interessiere mich nicht für StopLoss-Pips oder Gewinnziele oder was auch immer].

Wenn ich MetaTrader verwende, erhalte ich von meinem Broker die folgenden Minikontoinformationen:

accountLeverage = AccountLeverage(); // Wert = 200
modeLotSize = MarketInfo("EURUSDm", MODE_LOTSIZE); // Wert = 10000
modeLotStep = MarketInfo("EURUSDm", MODE_LOTSTEP); // Wert = .01
modeMinLot = MarketInfo("EURUSDm", MODE_MINLOT) ); // Wert = 0,01

FRAGE: Wie berechne ich die Losgröße für 200 $? (Es wäre nützlich, die Kosten für ein Mindestlos zu kennen. In diesem Fall beträgt die Mindestlosgröße 0,01).

FRAGE: Ist die Formel zur Berechnung der Losgröße für alle Währungspaare dieselbe?

Vielen Dank im Voraus.

 

Das Problem ist nicht vollständig definiert. Wenn Sie sagen, dass Sie 2 % riskieren wollen, müssen Sie eine der Variablen festlegen: das Stop-Loss-Niveau oder das Handelsvolumen. Da Sie nach der Berechnung der Losgröße fragen, bedeutet das, dass Sie diese nicht festlegen wollen, aber das setzt voraus, dass Sie sich für Stop-Loss-Pips interessieren, obwohl Sie sagen, dass Sie das nicht wollen. Wenn Sie keinen Stop-Loss haben, bedeutet das Risiko von 2 %, dass Sie eine feste Losgröße nehmen, z. B. 1,0, und warten, bis Ihre laufenden Verluste 2 % der ursprünglichen Marge erreichen. Wie Sie sehen, brauchen Sie die Losgröße hier nicht zu berechnen.


Sobald das Stop-Loss-Niveau in den Blickpunkt rückt, ist die Berechnung einfach:


double tradeVolume = AccountFreeMargin() * Risk/100 / ( StopLossPoints * MarketInfo( Symbol(), MODE_TICKVALUE ) );


Das heißt, dass Sie bei einem bestimmten Stop-Loss-Niveau für einen bestimmten Handel immer den angegebenen Prozentsatz Ihrer anfänglichen Marge verlieren, wenn der Stop-Loss gezogen wird.


Sie sollten den resultierenden Wert auch mit MODE_LOTSTEP normalisieren und mit MODE_MINLOT und MODE_MAXLOT begrenzen.

 
bstone wrote >>

Das Problem ist nicht vollständig definiert. Wenn Sie sagen, dass Sie 2 % riskieren wollen, müssen Sie eine der Variablen festlegen: das Stop-Loss-Niveau oder das Handelsvolumen. Da Sie nach der Berechnung der Losgröße fragen, bedeutet das, dass Sie diese nicht festlegen wollen, aber das setzt voraus, dass Sie sich für Stop-Loss-Pips interessieren, auch wenn Sie sagen, dass Sie das nicht wollen. Wenn Sie keinen Stop-Loss haben, bedeutet das Risiko von 2 %, dass Sie eine feste Losgröße nehmen, z. B. 1,0, und warten, bis Ihre laufenden Verluste 2 % der ursprünglichen Marge erreichen. Wie Sie sehen, brauchen Sie die Losgröße hier nicht zu berechnen.


Sobald das Stop-Loss-Niveau in der Ansicht erscheint, ist die Berechnung einfach:

double tradeVolume = AccountFreeMargin() * Risk/100 / ( StopLossPoints * MarketInfo( Symbol(), MODE_TICKVALUE ) );


Das bedeutet, dass Sie bei einem bestimmten Stop-Loss-Niveau für einen bestimmten Handel immer den angegebenen Prozentsatz Ihrer Anfangsmarge verlieren, wenn der Stop-Loss gezogen wird.

Sie sollten den resultierenden Wert auch mit MODE_LOTSTEP normalisieren und ihn mit MODE_MINLOT und MODE_MAXLOT begrenzen.

Dies ergibt eine Antwort von 6,66 für ein Minikonto. Scheint das ungefähr richtig zu sein?

double risk3 = 2.0;
stopLossPips = 30;
double orderLotSize3 = AccountFreeMargin() * risk3/100 / ( stopLossPips * MarketInfo( Symbol(), MODE_TICKVALUE ) );
orderLotSize3 = orderLotSize3 - MathMod( orderLotSize3, 2*MarketInfo( Symbol(), MODE_LOTSTEP ) );
orderLotSize3 = NormalizeDouble(orderLotSize3, 2);

 

Nur wenn MODE_TICKVALUE 1,0 ist, was seltsam aussieht (hängt aber von den Eigenschaften des Minikontos ab). Was ist MODE_TICKVALUE für das betreffende Instrument und Ihr Minikonto? Für EURUSD, ein Standardkonto und einen Hebel von 1:100 sind es $10, was ein Handelsvolumen von 0,66 Lots bei einem Risiko von 2 % und einem Stopp von 30 pp ergibt.

 
Hello.

int    init ()
{

double ad.Volume                                                                                                ;

string as.Symbol            = "EURUSD"                                                                          ;

double ad.LotStep           = MarketInfo ( as.Symbol , MODE_LOTSTEP        )                                    ;
double ad.MinimalVolume     = MarketInfo ( as.Symbol , MODE_MINLOT         )                                    ;
double ad.NominalLot        = MarketInfo ( as.Symbol , MODE_LOTSIZE        )                                    ;
double ad.NominalMargin     = MarketInfo ( as.Symbol , MODE_MARGINREQUIRED )                                    ;
double ad.QuoteAsk          = MarketInfo ( as.Symbol , MODE_ASK            )                                    ;
double ad.QuoteBid          = MarketInfo ( as.Symbol , MODE_BID            )                                    ;

double ad.EquityQuant       = 0.01                                                                              ;
double ad.MarginLimit       = AccountEquity () * ad.EquityQuant                                                 ;
double ad.VolumeLimit       = ad.MarginLimit   / ad.NominalMargin                                               ;

if   ( ad.VolumeLimit       < ad.MinimalVolume )
       ad.Volume            = 0                                                                                 ;
else { int ai.Steps         = MathFloor ( ( ad.VolumeLimit - ad.MinimalVolume ) / ad.LotStep )                  ;
       ad.Volume            = ad.MinimalVolume + ad.LotStep * ai.Steps                                          ; }

double ad.Leverage          = AccountLeverage ()                                                                ;
double ad.RealLeverage      = ad.Leverage                                                                       ;

double ad.MarginBuy.1       = ad.QuoteAsk * ad.Volume * ad.NominalLot / ad.RealLeverage                         ;
double ad.MarginSell.1      = ad.QuoteBid * ad.Volume * ad.NominalLot / ad.RealLeverage                         ;

double ad.MarginBuy.2       = AccountFreeMargin () - AccountFreeMarginCheck ( as.Symbol , OP_BUY  , ad.Volume ) ;
double ad.MarginSell.2      = AccountFreeMargin () - AccountFreeMarginCheck ( as.Symbol , OP_SELL , ad.Volume ) ;

Alert ( "ad.MarginSell.2    = " , ad.MarginSell.2    , " " , AccountCurrency ()                               ) ;
Alert ( "ad.MarginBuy.2     = " , ad.MarginBuy.2     , " " , AccountCurrency ()                               ) ;
Alert ( "ad.MarginSell.1    = " , ad.MarginSell.1    , " " , AccountCurrency ()                               ) ;
Alert ( "ad.MarginBuy.1     = " , ad.MarginBuy.1     , " " , AccountCurrency ()                               ) ;
Alert ( "ad.Volume          = " , ad.Volume          , " " , "lots"                                           ) ;
Alert ( "Output :"                                                                                            ) ;
Alert ( " "                                                                                                   ) ;
Alert ( "ai.Steps           = " , ai.Steps                                                                    ) ;
Alert ( "ad.LotStep         = " , ad.LotStep         , " " , "lots"                                           ) ;
Alert ( "ad.MinimalVolume   = " , ad.MinimalVolume   , " " , "lots"                                           ) ;
Alert ( "ad.VolumeLimit     = " , ad.VolumeLimit     , " " , "lots"                                           ) ;
Alert ( "ad.MarginLimit     = " , ad.MarginLimit     , " " , AccountCurrency ()                               ) ;
Alert ( "ad.NominalMargin   = " , ad.NominalMargin   , " " , AccountCurrency ()                               ) ;
Alert ( "ad.RealLeverage    = " , ad.RealLeverage                                                             ) ;
Alert ( "ad.NominalLot      = " , ad.NominalLot      , " " , StringSubstr ( as.Symbol , 0 , 3 )               ) ;
Alert ( "Processing :"                                                                                        ) ;
Alert ( " "                                                                                                   ) ;
Alert ( "ad.EquityQuant     = " , ad.EquityQuant                                                              ) ;
Alert ( "AccountEquity   () = " , AccountEquity   () , " " , AccountCurrency ()                               ) ;
Alert ( "as.Symbol          = " , as.Symbol                                                                   ) ;
Alert ( "Input :"                                                                                             ) ;
Alert ( " "                                                                                                   ) ;
Alert ( "AccountCurrency () = " , AccountCurrency ()                                                          ) ;
}
Best regards,
Ais.
 
Important.
1. Calculation of the "ad.Margin****.1" is correct for "***USD" symbols if USD is account currency.
2. Calculation of the "ad.Margin****.2" is more universal but some symbols may have miscounts.
3. Real leverage and "AccountLeverage ()" may differ.
4. Real leverage calculation formula depends on forex symbol parsing.
Example.
...

//<method 24>
int    air.Ticker.Compute.4

 (//<0>

){//<24>

if      ( avi.Ticker.Conversion      ==   ac.Direct      )
        { avi.Ticker.ConversionDigits =         avi.Ticker.QuoteDigits                                                 ;
          avd.Ticker.ConversionAsk    =         avd.Ticker.QuoteAsk                                                    ;
          avd.Ticker.ConversionBid    =         avd.Ticker.QuoteBid                                                    ;
          avd.Ticker.RealLeverage     =         avd.Ticker.QuoteAsk * avd.Ticker.NominalLot / avd.Ticker.NominalMargin ; }

else if ( avi.Ticker.Conversion      ==   ac.DirectCross )
        { avi.Ticker.ConversionDigits =         MarketInfo ( avs.Ticker.ConversionSymbol    , MODE_DIGITS )            ;
          avd.Ticker.ConversionAsk    =         MarketInfo ( avs.Ticker.ConversionSymbol    , MODE_ASK    )            ;
          avd.Ticker.ConversionBid    =         MarketInfo ( avs.Ticker.ConversionSymbol    , MODE_BID    )            ;
          avd.Ticker.RealLeverage     = ( avd.Ticker.ConversionAsk + avd.Ticker.ConversionBid ) / 2
                                        * avd.Ticker.NominalLot    / avd.Ticker.NominalMargin                          ; }

else if ( avi.Ticker.Conversion      ==   ac.Inverse     )
        { avi.Ticker.ConversionDigits =   8   - avi.Ticker.QuoteDigits                                                 ;
          avd.Ticker.ConversionAsk    =   1.0 / avd.Ticker.QuoteBid                                                    ;
          avd.Ticker.ConversionBid    =   1.0 / avd.Ticker.QuoteAsk                                                    ;
          avd.Ticker.RealLeverage     =                              avd.Ticker.NominalLot  / avd.Ticker.NominalMargin ; }

else    { avi.Ticker.ConversionDigits =   8   - MarketInfo ( avs.Ticker.ConversionSymbol    , MODE_DIGITS )            ;
          avd.Ticker.ConversionAsk    =   1.0 / MarketInfo ( avs.Ticker.ConversionSymbol    , MODE_BID    )            ;
          avd.Ticker.ConversionBid    =   1.0 / MarketInfo ( avs.Ticker.ConversionSymbol    , MODE_ASK    )            ;
          avd.Ticker.RealLeverage     = ( avd.Ticker.ConversionAsk + avd.Ticker.ConversionBid ) / 2
                                        * avd.Ticker.NominalLot    / avd.Ticker.NominalMargin                          ; }

}//</method 24>

... 
Best regards,
Ais.
 
Hello.
Another method of operation volume computing is in https://www.mql5.com/ru/forum/111267.
Best regards,
Ais.
 

Ich denke, die einfachste Methode, um die benötigte Marge für ein Lot zu ermitteln, ist


MarketInfo(Symbol(),MODE_MARGINREQUIRED);


Ich verwende normalerweise die folgende Formel, um Lots zu berechnen:

double OneLotMargin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double FreeMargin = AccountFreeMargin();
double lotMM = FreeMargin/OneLotMargin*Risk/100;
double LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
lotMM = NormalizeDouble(lotMM/LotStep,0)*LotStep;

Sie haben jedoch gefragt, wie man die Menge der Lots berechnet, die einen festen Margin-Betrag verwenden, z.B. 200$, in diesem Fall sollte die Formel geändert werden in:

double OneLotMargin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double MarginAmount = 200; //this means we want to use 200$ for trade
double lotMM = MarginAmount/OneLotMargin;
double LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
lotMM = NormalizeDouble(lotMM/LotStep,0)*LotStep;

 
Hello.
Note, that "minimal lot" and "lot step" may differ.
For example, "minimal lot" may be 0.10, "lot step" may be 0.01.
In this case, simple calculation methods may produce incorrect operation volume, for example, 0.05.
Best regards,
Ais.
 
Ais wrote >>
Hello.
Another method of operation volume computing is in 'Ищу функцию вычисления размера лота.'.
Best regards,
Ais.

Ais
wrote
>>
Hello.
Note, that "minimal lot" and "lot step" may differ.
For example, "minimal lot" may be 0.10, "lot step" may be 0.01.
In this case, simple calculation methods may produce incorrect operation volume, for example, 0.05.
Best regards,
Ais.

Ich benutze den Code, den Sie unter "Ищу функцию вычисления размера лота." erwähnt haben. Ich danke Ihnen.

ICH HABE EINE FRAGE ZU DIESEM CODE: Erzeugt er immer eine geradzahlige Losgröße (z.B. 6,66 und nicht 6,67).

Das ist gut, wenn es so ist. Ich verstehe nur nicht, warum das so ist.

Der beigefügte Code ist in einem Skriptdateiformat, so dass Sie den Code in ein neues Skript einfügen und sofort ausführen können.

Dateien:
 
Hello.
Correct code must be able to produce any valid result.
Examples.




Best regards,
Ais.