2018年7月13日金曜日

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

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

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



### 最大ストップロスを基準通貨の金額に換算する
[値幅を基準通貨の金額に換算する方法](https://strategyofc.blogspot.com/2018/07/mql4.html) を用いて、 1ロット当たりの最大ストップロスを基準通貨の金額に換算します。

```mq4
// (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ロット当たりの最大ストップロス)で割れば必要ロット数が求まります。

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

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

```mq4
// 最小ロット
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()](https://docs.mql4.com/math/mathround) を使うと四捨五入になってしまうので、少しでもリスクを小さくしたい場合は切り捨て関数 [MathFloor()](https://docs.mql4.com/math/mathfloor) を使った方が良いかもしれません。

> 参考
>
> [[MQL4] 口座残高に関わる情報 6種](https://strategyofc.blogspot.com/2018/07/mql4-6.html)