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() を使った方が良いかもしれません。
参考