Parti büyüklüğünü nasıl hesaplarım?

 

Diyelim ki mini hesabımda 10.000$ marj var ve bir sonraki işlemde %2 risk almak istiyorum (yani, <bir miktar> sözleşme satın almak için 200$ kullanın).

[Bunun sınırlı bir "risk" görüşü olduğunun farkındayım. StopLoss pipleri veya kar hedefleri veya her neyse ilgilenmiyorum.]

MetaTrader'ı kullanarak brokerımdan aşağıdaki mini hesap bilgilerini alıyorum:

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

SORU: 200$ için parti büyüklüğünü nasıl hesaplarım? (Minimum büyüklükteki partinin maliyetini bilmek faydalı olacaktır. Bu durumda minimum lot büyüklüğü .01'dir).

SORU: Parti büyüklüğü hesaplama formülü tüm döviz çiftleri için aynı mı?

Şimdiden çok teşekkür ederim.

 

Sorun tam olarak tanımlanmamıştır. %2 risk almak istediğinizi söylüyorsanız, değişkenlerden birini düzeltmeniz gerekir: zararı durdurma seviyesi veya ticaret hacmi. Parti büyüklüğünü hesaplamayı sorduğunuz için, bunun düzeltilmesini istemediğiniz anlamına gelir, ancak bu, istemediğinizi söylemenize rağmen zararı durdur pipleriyle ilgilenmenizi gerektirir. Zarar durdurunuz yoksa, %2 risk almak, sabit bir lot büyüklüğü, örneğin 1.0 almak ve mevcut kayıplarınız başlangıç marjının %2'sine ulaşana kadar beklemek anlamına gelir. Burada gördüğünüz gibi parti büyüklüğünü hesaplamanıza gerek yok.


Durdurma kaybı seviyesi görünüme girdiğinde, hesaplama basittir:


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


Yani, belirli bir ticaret için bir stoploss seviyesi verildiğinde, stoploss alınırsa her zaman ilk marjınızın belirtilen yüzdesini kaybedersiniz.


Ayrıca elde edilen değeri MODE_LOTSTEP ile normalleştirmek ve MODE_MINLOT ve MODE_MAXLOT ile sınırlamak isteyeceksiniz.

 
bstone wrote >>

Sorun tam olarak tanımlanmamıştır. %2 risk almak istediğinizi söylüyorsanız, değişkenlerden birini düzeltmeniz gerekir: zararı durdurma seviyesi veya ticaret hacmi. Parti büyüklüğünü hesaplamayı sorduğunuz için, bunun düzeltilmesini istemediğiniz anlamına gelir, ancak bu, istemediğinizi söylemenize rağmen zararı durdur pipleriyle ilgilenmenizi gerektirir. Zarar durdurunuz yoksa, %2 risk almak, sabit bir lot büyüklüğü, örneğin 1.0 almak ve mevcut kayıplarınız başlangıç marjının %2'sine ulaşana kadar beklemek anlamına gelir. Burada gördüğünüz gibi parti büyüklüğünü hesaplamanıza gerek yok.


Durdurma kaybı seviyesi görünüme girdiğinde, hesaplama basittir:

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


Yani, belirli bir ticaret için bir stoploss seviyesi verildiğinde, stoploss alınırsa her zaman ilk marjınızın belirtilen yüzdesini kaybedersiniz.

Ayrıca elde edilen değeri MODE_LOTSTEP ile normalleştirmek ve MODE_MINLOT ve MODE_MAXLOT ile sınırlamak isteyeceksiniz.

Bu, mini bir hesapta 6.66'lık bir yanıt verir. Bu doğru görünüyor mu?

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

 

Sadece MODE_TICKVALUE 1.0 ise garip görünüyor (ancak mini hesabın özelliklerine bağlı). Söz konusu enstrüman ve mini hesabınız için MODE_TICKVALUE nedir? EURUSD, standart bir hesap ve 1:100 kaldıraç için, %2 risk ve 30 pp stop için 0.66 lotluk bir işlem hacmi veren 10$'dır.

 
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.
 

Bence bir lot için gereken marj miktarını elde etmenin en kolay yolu


MarketInfo (Symbol(),MODE_MARGINREQUIRED);


Partileri hesaplamak için genellikle aşağıdaki formülü kullanırım:

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;

Ancak, örneğin 200$ gibi sabit marj kullanan lot tutarlarının nasıl hesaplanacağını sordunuz, bu durumda aşağıdaki formül şu şekilde değiştirilmelidir:

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 yazdı >>
Hello.
Another method of operation volume computing is in 'Ищу функцию вычисления размера лота.' .
Best regards,
Ais.

Ais yazdı >>
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.

'Ищу функцию вычисления размера лота' adresinde bahsettiğiniz kodu kullanıyorum. . Teşekkür ederim.

BU KOD İLE İLGİLİ BİR SORUM VAR: Her zaman lotize üretiyor mu ve çift numaralanıyor mu (6,66 değil, 6,67 gibi).

Olursa iyi olur. Sadece neden olduğunu anlamıyorum.

Ekli kod bir Komut Dosyası biçimindedir, böylece kodu yeni bir komut dosyasına yapıştırabilir ve hemen çalıştırabilirsiniz.

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




Best regards,
Ais.
Neden: