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)