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

2018年11月18日

大量の歯車

クラスについての知識を深めるために、トレード前の状況を確認するクラスを作成します。

トレードルールの判定前に「余剰証拠金は十分か?」、「スプレッドは許容範囲内か?」など、毎回実施したい処理があると思います。

それらのチェック処理を1つのクラスにまとめて、簡単に呼び出せるようにします。

MT5を使って説明しますが、MT4でも同じプログラムで動作するのでどちらで使っても問題ありません。

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

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

MT4/MT5のコメントと変数について|MQL入門(2回目)

MT4/MT5で数値の計算をしてみる|MQL入門(3回目)

条件分岐をマスターする|MQL入門(4回目)

ループ処理をマスターする|MQL入門(5回目)

配列を使いこなす|MQL入門(6回目)

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

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

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

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

トレード前に何を確認するか

チェック処理は「エントリーとエグジットの両方にかけるチェック」と、「エントリーにのみかけるチェック」に分かれます。

それぞれのチェック内容を見ていきましょう。

エントリーとエグジットの両方にかけるチェック

新しいバーの始めか?

ローソク足が作成されたタイミングで一度のみ実行するようにします。

エントリーにのみかけるチェック

以下のようなチェック処理を「エントリーとエグジットの両方」に掛けてしまうと、例えば余剰証拠金が一定以下になった場合に既に保持していたポジションをクローズすることができなくなります。

余剰証拠金は十分か?

inputで外部から余剰証拠金の制限値を入力し、制限値以下の場合はエントリーしません。

例:余剰証拠金が100万円を割ったらエントリーしない。

スプレッドは想定内か?

inputで外部からスプレッドの制限値を入力し、制限値以下の場合はエントリーしません。

例:スプレッドが20より大きい場合はエントリーしない。

指定した時間内か?

inputで外部からエントリー可能時間の範囲を入力し、範囲外の場合はエントリーしません。

例:3時~8時(7時59分)以外はエントリーしない。

[追加]

指定した曜日か?

エントリー可能とした曜日以外はエントリーしません。

例:月曜日はエントリーしない。水曜日はエントリーしない。

その他

スワップはマイナスか?

マイナススワップの判定のみ行います。

例:買い/売りスワップがマイナスの場合は買い/売りエントリーしない。

プログラムの作成

作成前準備

今回は共通のクラスを作成するので、いつものように「mq4/mq5」ファイルを作るのではなく「mqh」を作成します。

MetaEditorを開いて、「Include」部分で右クリックし「新しいフォルダ」を作成してください。

MQL5に新しいフォルダを作成する

作成したフォルダに好きな名前を付けてください。

私はOriginalの短縮で「Org」というフォルダ名にしました。

次に作成したフォルダを右クリックして、「新しいファイル」を選択します。

新しいファイルを作成

「新しいクラス」をチェックして、「次へ」をクリックします。

MQL5ウィザード(何を新規作成するか)

クラス名を入力して、「完了」をクリックします。

私は「OrgCheckInitial」という名前にしましたが、他の名前でも問題ありません。

MQL5ウィザード(クラスの基本情報)

プログラミング

private、publicの説明

privateやpublicはアクセス修飾子と呼ばれ、変数や関数(メソッド)などのアクセスを制御するものです。

3行目の「private」のブロックは、9行目までの変数や関数にはこのクラス内からしかアクセスできないという意味です。

11行目の「public」のブロックは、29行目までの変数や関数に外部からでもアクセスできるという意味です。

privateはオブジェクト指向の3本柱の1つである、「カプセル化」の実現によく利用されます。

カプセル化(カプセルか、encapsulation)とは、オブジェクト指向を構成する概念の一つ。オブジェクト内部のデータを隠蔽したり(データ隠蔽)、オブジェクトの振る舞いを隠蔽したり、オブジェクトの実際の型を隠蔽したりすることをいう。データ隠蔽と勘違いされやすいが、データ隠蔽はカプセル化の具体例の1つにすぎず、同一のものではない。

出典: フリー百科事典『ウィキペディア(Wikipedia)』

カプセル化は、簡単にではありますが「不要なものにアクセスさせないこと」、「これくれ!と言ったら中身を意識せず貰えること」という理解で良いと思います。

このようなことを意識しながらプログラムを組んだ方が良いということですね。

プログラム全体

以下がプログラムの全体になりますので、コピーしてコンパイルしてください。

今回はコメントを英語にしてみましたが、英語が得意ではないので不備があるかもしれません。

使い方

第10回目までに作成してきた手順で通常通りEAを作成します。

#includeの後ろに<>を書くと、Includeフォルダの配下という意味になります。

したがって6行目は、先ほど作成した「Include下のOrg下のOrgCheckInitial.mqh」を読み込むという意味になります。

7行目でクラスの変数を定義して、OnInit()内でインスタンス化しています。7行目で先に変数を定義したのはこのプログラム全体でInitialクラスを利用できるようにするためです。

インスタンス化を忘れてしまった方は、第10回をもう一度確認してみてください。

テスト用に作成したプログラムは以下となります。

これで準備は整いました。

[追加]

曜日判定を追加したので、追加分のプログラムも作成しました。

使い方は、トレードしたくない曜日を列挙していけばいいだけです。

上記テストプログラムでは、月曜日と水曜日はトレードしない設定にしました。

プログラムの実行

4時間足の全ティックでバックテストを実行します。

[バーの初回のみ起動していること]
左の枠・・・バーの初回(4時間に1セット)のみ動いていることが分かります。

[チェック処理にかからないパターン]
右上の枠・・・0時台の処理は問題なく「買い注文成功」まで到達しました。

[時間制限]
右下の枠・・・時間制限で0時~3時59分の間のみトレードを許容しているので、0時台以外のトレードは全て注文失敗で正しいです。

時間制限を確認するログ

[スプレッドの確認]

スプレッドが10を超えた時は注文失敗になるので、正しい動きです。

spread is wrong valueと表示されています。

スプレッドの状況を確認するログ

[余剰証拠金の確認]

テストの口座資金を4999にしてテストしました。

Lack of surplus marginと表示され、注文失敗なので正しい動きです。

余剰証拠金の確認ログ

最後に

今回は実用性のあるプログラムの提供を重視しました。

作成したクラスが少しでも皆様の参考になれば幸いです。

プログラムの詳細な説明はしませんでしたが、少しずつクラスに慣れていくのが目的なので、まだ完全には理解できていなくても大丈夫です。

クラスの用途が「トレード前の状況を確認する」という曖昧なものだったので、より分かりづらかったかもしれません。

久しぶりにMQL5でしっかり気味に書きましたが、殆どがそのままMQL4でもコンパイルできたので割と互換性があるのかなと思いました。

そうなってくると、やはり「MT4を辞めてMT5を使う理由」で考えたことが正解だったのではないかと思います。

MT5は以下の業者で利用可能です。