Comment calculer la taille du lot ?

 

Disons que mon mini-compte a une marge de 10 000 $, et que je veux risquer 2 % sur la prochaine transaction (c'est-à-dire utiliser simplement 200 $ pour acheter <un certain nombre> de contrats).

[Je réalise qu'il s'agit d'une vision limitée du "risque". Je ne suis pas intéressé par les pips stopLoss, ou les objectifs de profit, ou quoi que ce soit d'autre].

En utilisant MetaTrader, j'obtiens de mon courtier les mini informations de compte suivantes :

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

QUESTION : Comment calculer la taille du lot pour 200 $ ? (Il serait utile de connaître le coût d'un lot de taille minimale. Dans ce cas, la taille minimale du lot est de 0,01).

QUESTION : La formule de calcul de la taille du lot est-elle la même pour toutes les paires de devises ?

Merci beaucoup par avance.

 

Le problème n'est pas entièrement défini. Si vous dites que vous voulez risquer 2 %, vous devez fixer l'une des variables : le niveau du stop loss ou le volume de la transaction. Puisque vous demandez à calculer la taille du lot, cela signifie que vous ne voulez pas qu'elle soit fixe, mais cela vous oblige à vous intéresser aux pips du stop loss, même si vous dites que vous ne le faites pas. Si vous n'avez pas de stop loss, risquer 2% signifie prendre une taille de lot fixe, par exemple 1,0, et attendre que vos pertes actuelles atteignent 2% de la marge initiale. Vous n'avez pas besoin de calculer la taille du lot ici comme vous le voyez.


Une fois que le niveau de stop loss entre en ligne de compte, le calcul est simple :


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


C'est-à-dire que, étant donné un niveau de stop loss pour une transaction particulière, vous aurez toujours le pourcentage spécifié de votre marge initiale perdu si le stop loss est pris.


Vous voudrez également normaliser la valeur résultante par MODE_LOTSTEP et la plafonner avec MODE_MINLOT et MODE_MAXLOT.

 
bstone wrote >>

Le problème n'est pas entièrement défini. Si vous dites que vous voulez risquer 2 %, vous devez fixer l'une des variables : le niveau du stop loss ou le volume de la transaction. Puisque vous demandez à calculer la taille du lot, cela signifie que vous ne voulez pas qu'elle soit fixe, mais cela vous oblige à vous intéresser aux pips du stop loss, même si vous dites que vous ne le faites pas. Si vous n'avez pas de stop loss, risquer 2% signifie prendre une taille de lot fixe, par exemple 1,0, et attendre que vos pertes actuelles atteignent 2% de la marge initiale. Vous n'avez pas besoin de calculer la taille du lot ici comme vous le voyez.


Une fois que le niveau de stop loss entre dans la vue, le calcul est simple :

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


En d'autres termes, étant donné un niveau de perte stop pour une transaction particulière, vous aurez toujours le pourcentage spécifié de votre marge initiale perdue si la perte stop est prise.

Vous voudrez également normaliser la valeur résultante par MODE_LOTSTEP et la plafonner avec MODE_MINLOT et MODE_MAXLOT.

Cela donne une réponse de 6,66 sur un mini-compte. Cela vous semble-t-il correct ?

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) ;

 

Seulement si MODE_TICKVALUE est 1.0, ce qui semble bizarre (mais dépend des propriétés du mini-compte). Quelle est la valeur MODE_TICKVALUE pour l'instrument en question et votre mini-compte ? Pour EURUSD, un compte standard et un effet de levier de 1:100, c'est 10 $, ce qui donne un volume de transaction de 0,66 lot pour un risque de 2 % et un stop de 30 pp.

 
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.
 

Je pense que la méthode la plus simple pour obtenir le montant de la marge nécessaire pour un lot est la suivante


MarketInfo(Symbol(),MODE_MARGINREQUIRED);


J'utilise généralement la formule suivante pour calculer les lots :

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;

Cependant, vous avez demandé comment calculer le montant des lots qui utilisent un montant fixe de marge, par exemple 200$. Dans ce cas, la formule de calcul doit être modifiée comme suit :

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.

J'utilise le code que vous avez mentionné dans 'Ищу функцию вычисления размера лота.'. Merci.

J'AI UNE QUESTION À PROPOS DE CE CODE : Est-ce qu'il produit toujours une taille de lot paire (comme 6.66 et non 6.67).

C'est bien s'il le fait. Mais je ne comprends pas pourquoi il le fait.

Le code ci-joint est dans un format de fichier Script, donc vous pouvez coller le code dans un nouveau script et l'exécuter immédiatement.

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




Best regards,
Ais.