敷地面積はどのように計算するのですか?

 

例えば、私のミニ口座の証拠金が 10,000 ドルであり、次の取引で 2%のリスクを取りたいとします (つまり、単に 200 ドル使って <ある量> の契約を購入します)。

[これは「リスク」についての限定的な見方であることは承知しています。ストップロス・ピップスやプロフィット・ターゲットなどには興味がありません]。

メタトレーダーを使用して、私はブローカーから次のミニアカウント情報を得ます。

accountLeverage =AccountLeverage(); // 値 = 200
modeLotSize = MarketInfo("EURUSDm", MODE_LOTSIZE); // value = 10000
modeLotStep = MarketInfo("EURUSDm", MODE_LOTSTEP); // value = 0.01
modeMinLot = MarketInfo("EURUSDm", MODE_MINLOT) ); // value = 0.01

質問: $200のロットサイズはどのように計算しますか? (最小サイズのロットのコストを知ることができると便利です。この場合、最小サイズのロットは0.01です)。

質問:ロットサイズの計算式は、すべての通貨ペアで同じですか?

よろしくお願いいたします。

 

この問題は完全に定義されているわけではありません。もし2%のリスクを取りたいと言うのであれば、ストップロス・レベルか取引量という変数のいずれかを固定しなければなりません。ロットサイズの計算について質問しているのですから、ロットサイズを固定したくないということですが、そうすると、ストップロス・ピップに興味がないと言っているにもかかわらず、興味を持つ必要があります。ストップロスがない場合、2%のリスクを負うとは、固定ロットサイズ、例えば1.0を取り、現在の損失が初期証拠金の2%に達するまで待つということです。ここでは、ご覧のようにロットサイズを計算する必要はありません。


ストップロス・レベルが視界に入れば、計算は簡単です。


double tradeVolume =AccountFreeMargin() * Risk/100 / ( StopLossPoints * MarketInfo( Symbol(), MODE_TICKVALUE ) ) となります。


つまり、特定の取引でストップロス・レベルを指定すると、ストップロスが発生した場合、常に初期証拠金の指定した割合が失われることになります。


また、結果の値をMODE_LOTSTEPで正規化し、MODE_MINLOTとMODE_MAXLOTでキャップしたいと思うことでしょう。

 
bstone wrote>>

この問題は完全に定義されていません。2%のリスクを取りたいと言うのであれば、ストップロス・レベルか取引量という変数のいずれかを固定する必要があります。ロットサイズの計算について質問しているということは、ロットサイズを固定したくないということですが、そのためには、ストップロスのピップに興味がないと言っているにもかかわらず、その興味を持たなければなりません。ストップロスがない場合、2%のリスクを負うとは、固定ロットサイズ、例えば1.0を取り、現在の損失が初期証拠金の2%に達するまで待つということです。ここでは、ご覧のようにロットサイズを計算する必要はありません。


ストップロス・レベルが視界に入れば、計算は簡単です。

double tradeVolume = AccountFreeMargin() * Risk/100 / ( StopLossPoints * MarketInfo( Symbol(), MODE_TICKVALUE ) ) といった具合です。


つまり、特定の取引でストップロス・レベルを指定すると、ストップロスが発生した場合に、常に指定した割合のイニシャルマージンが失われることになります。

また、MODE_LOTSTEPによって結果の値を正規化し、MODE_MINLOTとMODE_MAXLOTでキャップしたいと思うことでしょう。

この結果、ミニアカウントで6.66という答えが得られます。 これくらいが妥当でしょうか?

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

 

Only If MODE_TICKVALUE is 1.0 which looks weird (but depends on theproperties of the mini-account) (ただし、ミニアカウントのプロパティに よります。当該商品とミニ口座の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.
 

1ロットに必要な証拠金の額を算出する最も簡単な方法は、次のとおりです。


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$の場合、Foolowingの計算式を変更する必要があります。

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.

Ищу функцию вычисления размера лота.」で ご紹介いただいたコードを使っています。ありがとうございました。

このコードについて一つ質問があります。それは常に偶数ロットサイズ(6.67ではなく6.66など)を生成するのでしょうか?

もしそうなら、それは良いことです。ただ、なぜそうなるのかがわかりません。

添付のコードはスクリプトファイル形式なので、新しいスクリプトにコードを貼り付けてすぐに実行することができます。

ファイル:
 
Hello.
Correct code must be able to produce any valid result.
Examples.




Best regards,
Ais.
理由: