2018年7月13日金曜日

[MQL4] リスク許容額からロット数を求める方法

FXで重要なのは資産管理。 1トレードで許容されるリスクは、総資産の N% 以内に収めるべし。という教えはよくききます。

これを実現するには、最大ストップロスが総資産の N% になるよう、1トレードのロット数を求めれば良いわけです。 Metatrader ではこれも自動化することが出来ます。

最大ストップロスを基準通貨の金額に換算する

値幅を基準通貨の金額に換算する方法 を用いて、 1ロット当たりの最大ストップロスを基準通貨の金額に換算します。

1
2
3
// (high - low) = 最大ストップロス(high > low)
double ticks = (high - low) / SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_SIZE);
double price_per_lot = ticks * SymbolInfoDouble(Symbol(), SYMBOL_TRADE_TICK_VALUE);

リスク許容額からロット数を求める

まず、リスク許容額(総資産の N% 等)を決定します1

このリスク許容額を先の金額(1ロット当たりの最大ストップロス)で割れば必要ロット数が求まります。

ただ、この値はそのまま使えず、lot_step の倍数になるよう正規化する必要があります。

また、求められた値が「最小ロット数より小さかった場合」と「最大ロット数より大きかった場合」も処理しておく必要があります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 最小ロット
double min_lot =  MarketInfo(Symbol(), MODE_MINLOT);
// ロット刻み
double lot_step = MarketInfo(Symbol(), MODE_LOTSTEP);
 
// リスク許容額 (risk) が基準通貨の金額で与えられているとして
// 大体のロット数を求める
double lot_tmp = risk / price_per_lot;
// ロット刻みの何倍になるか求める
int num = (int) MathRound((lot_tmp - min_lot) / lot_step  + 1);
// 正確なロット数
double lot = lot_step * num;
 
if (lot < MarketInfo(Symbol(), MODE_MINLOT)) {
    // 最小ロットより小さかった場合
    // 取引を諦めるのか、最小ロットで取引するのか等
} else if (lot > MarketInfo(Symbol(), MODE_MAXLOT)) {
    // 最大ロットよりリスクをとれる場合
    // 最大ロットで取引するのが普通だと思われ
    lot = MarketInfo(Symbol(), MODE_MAXLOT);
}

MathRound() を使うと四捨五入になってしまうので、少しでもリスクを小さくしたい場合は切り捨て関数 MathFloor() を使った方が良いかもしれません。

参考

[MQL4] 口座残高に関わる情報 6種

  1. これを決めるのもなかなか難しいわけですが、それはまた別の機会に 
?