로트 크기는 어떻게 계산합니까?

 

내 미니 계정의 마진이 $10,000이고 다음 거래에서 2%의 위험을 감수하고 싶다고 가정해 보겠습니다.

[나는 이것이 "위험"에 대한 제한된 견해라는 것을 알고 있습니다. 나는 stopLoss 핍이나 이익 목표 등에 관심이 없습니다.]

MetaTrader를 사용하여 브로커로부터 다음과 같은 미니 계정 정보를 얻습니다.

계정 레버리지 = 계정 레버리지 (); // 값 = 200
modeLotSize = MarketInfo("EURUSDm", MODE_LOTSIZE); // 값 = 10000
modeLotStep = MarketInfo("EURUSDm", MODE_LOTSTEP); // 값 = .01
modeMinLot = MarketInfo("EURUSDm", MODE_MINLOT) ); // 값 = .01

질문: $200의 로트 크기는 어떻게 계산합니까? (최소 사이즈 로트의 비용을 아는 것이 유용할 것입니다. 이 경우 최소 사이즈 로트는 .01입니다.)

질문: 로트 크기 계산 공식은 모든 통화 쌍에 대해 동일합니까?

미리 감사드립니다.

 

문제가 완전히 정의되지 않았습니다. 2%의 위험을 감수하고 싶다면 손절매 수준 또는 거래량과 같은 변수 중 하나를 수정해야 합니다. 로트 크기를 계산하는 것에 대해 묻는 것이기 때문에 고정을 원하지는 않지만 그렇지 않다고 말하더라도 손절매에 관심을 가져야 합니다. 손절매가 없는 경우 2%의 위험을 감수한다는 것은 고정 로트 크기(예: 1.0)를 취하고 현재 손실이 개시 증거금의 2%에 도달할 때까지 기다리는 것을 의미합니다. 여기서 보시는 것처럼 로트 크기를 계산할 필요가 없습니다.


손절매 수준이 뷰에 들어가면 계산은 간단합니다.


이중 tradeVolume = AccountFreeMargin () * 위험/100 / ( StopLossPoints * MarketInfo( Symbol(), MODE_TICKVALUE ) );


즉, 특정 거래에 대한 스톱로스 수준이 주어지면 스톱로스를 취하면 항상 초기 증거금의 지정된 비율을 잃게 됩니다.


또한 결과 값을 MODE_LOTSTEP으로 정규화하고 MODE_MINLOT 및 MODE_MAXLOT로 제한하고 싶을 것입니다.

 
bstone wrote >>

문제가 완전히 정의되지 않았습니다. 2%의 위험을 감수하고 싶다면 손절매 수준 또는 거래량과 같은 변수 중 하나를 수정해야 합니다. 로트 크기를 계산하는 것에 대해 묻는 것이기 때문에 고정을 원하지는 않지만 그렇지 않다고 말하더라도 손절매에 관심을 가져야 합니다. 손절매가 없는 경우 2%의 위험을 감수한다는 것은 고정 로트 크기(예: 1.0)를 취하고 현재 손실이 개시 증거금의 2%에 도달할 때까지 기다리는 것을 의미합니다. 여기서 보시는 것처럼 로트 크기를 계산할 필요가 없습니다.


손절매 수준이 뷰에 들어가면 계산은 간단합니다.

이중 tradeVolume = AccountFreeMargin() * 위험/100 / ( StopLossPoints * MarketInfo( Symbol(), MODE_TICKVALUE ) );


즉, 특정 거래에 대한 스톱로스 수준이 주어지면 스톱로스를 취하면 항상 초기 증거금의 지정된 비율을 잃게 됩니다.

또한 결과 값을 MODE_LOTSTEP으로 정규화하고 MODE_MINLOT 및 MODE_MAXLOT로 제한하고 싶을 것입니다.

이것은 미니 계정에서 6.66의 답을 생성합니다. 거의 맞는 것 같습니까?

이중 위험3 = 2.0;
stopLossPips = 30;
이중 orderLotSize3 = AccountFreeMargin() * Risk3/100 / ( stopLossPips * MarketInfo( Symbol(), MODE_TICKVALUE ) );
orderLotSize3 = orderLotSize3 - MathMod( orderLotSize3, 2*MarketInfo( Symbol(), MODE_LOTSTEP ) );
orderLotSize3 = NormalizeDouble(orderLotSize3, 2);

 

MODE_TICKVALUE가 1.0인 경우에만 이상하게 보입니다(그러나 미니 계정의 속성 에 따라 다름). 해당 상품과 귀하의 미니 계정에 대한 MODE_TICKVALUE는 무엇입니까? EURUSD, 표준 계정 및 1:100 레버리지의 경우 2% 위험 및 30pp 스탑에 대해 0.66랏의 거래량을 제공하는 $10입니다.

 
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.
 

한 로트에 필요한 마진을 얻는 가장 쉬운 방법은


MarketInfo (Symbol(),MODE_MARGINREQUIRED);


나는 보통 다음 공식을 사용하여 로트를 계산합니다.

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;

그러나 예를 들어 200$와 같이 고정 마진을 사용하는 랏의 양을 계산하는 방법에 대해 질문하셨습니다. 이 경우 아래 공식을 다음과 같이 변경해야 합니다.

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

아이스가 쓴 >>
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.

'Ищу функцию вычисления размера лота'에서 언급한 코드를 사용하고 있습니다. . 고맙습니다.

이 코드에 대해 한 가지 질문이 있습니다. 항상 짝수 로트 크기를 생성합니까(예: 6.67이 아니라 6.66).

그렇다면 좋습니다. 왜 그러는지 이해가 안됩니다.

첨부된 코드는 스크립트 파일 형식이므로 코드를 새 스크립트에 붙여넣고 즉시 실행할 수 있습니다.

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




Best regards,
Ais.
사유: