最大損失額を制限するプログラムをEAに組み込む!書き方やサンプルコードあり!

ザフナーラボブログ

FX取引において最も重要なことの1つにリスクマネジメントがあります。

FX取引において最も危険な行為は、過大なレバレッジを掛けて取引し、口座残高に比して多額の損失を発生させることです。

換言すれば、FX取引におけるリスクマネジメントで最も重要なことは、「1回のトレード当たりの最大損失額を、口座残高の一定割合に限定するようにロットサイズを調整する」ことであるといえます。

そこで、1回のトレード当たりの最大損失額を、口座残高の一定割合(一般に2~3%とするのが推奨されています。)に限定するようにロットサイズを調整するためのプログラミング方法について解説します。

1.ロットサイズを算出する計算式

まず、1pips当たりの口座残高の変動額を算出します。この値は、以下の計算式により算出されます。

ロットサイズ ×1pips当たりの利益額

次に、1pips当たりの損失額を算出します。この値は、以下の計算式により算出されます。

最大損失額 ÷ 損切り価格までのpips数

1pips当たりの口座残高の変動額と、1pips当たりの損失額は等しいので、以下の計算式が成り立ちます。

ロットサイズ ×1pips当たりの利益額
= 最大損失額 ÷ 損切り価格までのpips数

上記の等式を変形すると、以下のようになります。

ロットサイズ =
(最大損失額 ÷ 損切り価格までのpips数)÷1pips当たりの利益額

なお、最大損失額は、以下の計算式により算出されます。

口座残高 × 損失割合

以上より、1回のトレード当たりの最大損失額を、口座残高の一定割合に限定するロットサイズは、以下の計算式により算出されることになります。

ロットサイズ =
((口座残高 × 損失割合)÷ 損切り価格までのpips数)
÷1pips当たりの利益額

2.関数を作成する

上記の計算式を基にして、以下のような関数(Limited_Loss()関数)を作成します。

Limited-Loss

⑴ 引 数

Limited_Loss()関数は、以下の2つの引数を持っています。

  • double Risk
    1回のトレード当たりの最大損失額を、口座残高の何%に設定するかを指定します。
  • int StopLoss
    損切り価格までのpips数を指定します。

⑵ 最大損失額の算定

最大損失額を算出するには、現在の口座純資産額を取得する必要があるので、AccountEquity()関数を使用します。

AccountEquity()とは、MQL4であらかじめ定義されている関数で、口座の純資産額を取得するものです。

AccountEquity()関数の詳細については「こちら」を参照してください。

Limited_Loss()関数では、算出した最大損失額を、変数Risk_Amountに格納しています。

⑶ 1pips当たりの利益額を算出する

1pips当たりの利益額を算出するためには、MarketInfo()関数の第2引数を「MODE_TICKVALUE」として、1ロットにおける1ティック当たりの利益額を取得します。

Limited_Loss()関数では、このようにして取得した値を、変数Tick_Valueに格納しています。

  • MarketInfo()関数の詳細については「こちら」を参照してください。

⑷ pips単位に調整する

MetaTrader4(MT4)では、ティックや損切り幅は、ポイント単位で扱われます。

したがって、提示レートが小数点以下3桁又は5桁で表示される業者において、ティックや損切り幅をpips単位で扱うためには、それらの値を10倍する、という処理を行う必要があります。

そこで、Limite_Loss()関数においては、提示レートが小数点以下3桁又は5桁で表示される業者の場合には、変数Tick_Valueと引数Stoplossに格納されている値を10倍し、その値を変数Tick_Valueと引数Stoplossに代入するようにしています。

なお、Digitsとは、MQL4であらかじめ定義されている変数で、提示レートの小数点以下の桁数を格納しているものです。

Digitsの詳細については「こちら」を参照してください。

⑸ ロットサイズを算出する

上述した計算式に従ってロットサイズを算出し、その値を変数Calculated_Lotsizeに格納します。

⑹ ロットサイズを調整する(その1)

ロットサイズの最小変動幅は、業者によって異なり、その値はMarketInfo()関数の第二引数に「MODE_LOTSTEP」と記述することによって取得することができます。

Limited_Loss()関数では、ロットサイズの最小変動幅が「0.1」の場合には、Calculated_Lotsizeに格納されている値を小数点第一位で四捨五入し、ロットサイズの最小変動幅が「0.01」の場合には、Calculated_Lotsizeに格納されている値を小数点第二位で四捨五入するようにしています。

  • MarketInfo()関数の詳細については「こちら」を参照してください。

⑺ ロットサイズを調整する(その2)

ここまでの計算によって算出されたロットサイズが、取引に使用することのできる最小ロットサイズ以下の場合には、Calculated_Lotsizeに取引に使用することのできる最小ロットサイズを格納します。

また、算出されたロットサイズが、取引に使用することのできる最大ロットサイズ以上の場合には、Calculated_Lotsizeに取引に使用することのできる最大ロットサイズを格納します。

⑻ 計算結果を返す

return()文で、最終的にCalculated_Lotsizeに格納された値を返します。