ロット管理クラスの作成|MQL入門(12回目)

2018年11月19日

詰み上げたコイン

今回はロットを管理するクラスを作成します。

ハイレバ検証125%→???|ハイレバある意味凄すぎる」で遊んだ時に、無駄にロットを上げて口座が飛びましたので、その対策です。

と言ってもハイレベルなロット管理をするわけではなく、あくまでも余剰証拠金から適切なロットを割り出すような方法を取ります。

第11回目までを確認いただいている前提で進めますので、まだ見ていない方は先にご確認いただければと思います。

初心者でも分かる!MT4/MT5のプログラミング入門|MQL入門(1回目)

組み込み関数と自作関数を理解する|MQL入門(7回目)

MT4/MT5独自の処理を理解する|MQL入門(8回目)

テクニカル指標をマスターする|MQL入門(9回目)

MT4/MT5でオブジェクト指向入門|MQL入門(10回目)

トレード前の状況を確認するクラスの作成|MQL入門(11回目)

コンセプト

今回は余剰証拠金からロットを計算する方式にしますが、今後新たなロット計算方法追加しても既存機能に影響を与えないように作ります。

カプセル化により、外からのアクセスは1つの関数(メソッド)を呼べば適切なロット数を取得できるようにします。

オブジェクト指向3本柱の残り2つ(継承とポリモーフィズム)を駆使することで、より変更に強く作ることができますが、学習するのはまだ先の話なのでもう少々お待ちください。

プログラムの作成

プログラミング

準備

第11回目と同様の方法でクラスを作成しましょう。

名前は「OrgManagementLot」としました。

プログラム全体

今回は関数(メソッド)もprivate宣言にしました。

外部から余計なオブジェクトにはアクセスできませんが、計算されたロットを取得したければ「getCalculateLot」を呼び出せばよいです。

※基本的にMT4でもMT5でも動くように書いていますが、OrderCalcMarginはMT4にありませんので別のものを使用する必要があります。

108行目~114行目の部分でMT4とMT5のコントロールをしています。

使い方

テスト用のmq4/mq5を作成しましょう。

OnInit内でクラスをインスタンス化します。

OnDeinitでインスタンス化したクラスを削除しているのは、MT4では削除しないとメモリリークになるからです。(MT5は問題なさそうですが念のためです。)

新しい部分のみ説明します。

#include <Org/OrgManagementLot.mqh>
作成したクラスを読み込みます。

OrgManagementLot *mlot;
mlot=new OrgManagementLot(_Symbol, 0);
クラスをインスタンス化します。

末尾に付けている「0」は、ロットの計算方法がレバレッジで計算するモードという意味です。

現時点では「0」しかないのですが、今後を考えて引数に追加しました。

input int leverage = 100;
レバレッジを外から変更できるようにinputで宣言しました。
mlot.getCalculateLot(initial.getFreeMargin(), leverage)
上記で、ロット計算方法に応じたロット数が返ってきます。

プログラムの実行

1時間足でレバレッジ120倍に設定してテストしました。

余剰証拠金が変動するごとに、計算されるロットの値が変動しているので問題なさそうです。

MT5のバックテスト実行結果確認

もともとこのクラスは、「ハイレバ検証125%→???|ハイレバある意味凄すぎる」でハイレバ遊びをした時に、自己判断でレバレッジを200倍にして口座が飛んだため、その対策に作成しました。

せっかくなので、その時に使っていたプログラムをレバレッジ制御を入れてバックテストしてみましょう。

まずはレバレッジ200倍設定です。

MT5でレバレッジ200倍確認

実戦では最後の日のみレバレッジ200倍にしたので多少数字は異なるのですが、面白いことにしっかり同じ日に破綻しています。。。

次に当初のレバレッジ100倍程度をキープした設定で実行してみます。

MT5でレバレッジ100倍確認

かなり危ない局面がありますが、しっかり生き残っています。

キープしていれば口座は破綻していなかったことがわかりました。

レバレッジの倍数は外から変更できるようにしてあります。

つまり、バックテストでレバレッジの値を変更しながら検証していけば、どの程度までなら破綻しない想定なのかもわかるということです。

次の検証ではこのロット管理ロジックを入れて遊んでみようと思います。

実は今まではロット管理は計算ミスが怖くて固定ロットでやってきたのですが・・・とんでもない誤りでした。。。

運用中にロットを手動で変えることは、裁量トレードやっているのと同じです。

そもそもロットを変更したらどうなるかテストをしていないので。。。

私は裁量トレードが下手過ぎるにも拘わらず、まさにやってはいけないこと(裁量)をやっていたということが分かりました。

ロット管理は売買ロジック以上に重要と実感しました。

今後はより高度なロット管理ロジックも搭載しながら、クラスを拡張していこうと思います。

最後に

MQL入門の話からは少しぶれてきましたが、クラスについて理解していくにはこのように実戦を通しながらやるのが一番です。

MQLではOnTick(ティックごとに呼び出される)が絡むので、クラスをいまいち効率よく使えず私も苦労しているのですが、徐々に慣れていければと思います。