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

2018年11月14日

ソースコード

MT5を利用する場合、オブジェクト指向を理解できていないと様々場面でつまずいてしまいます。

昔はMT4ではオブジェクト指向でのプログラミンが書けなかったのですが、MT4とMT5はお互い寄せてきている部分があり気づけばMT4でも使えるようになっていました。

今回はオブジェクト指向の簡単な説明と、入門部分を学んでいきます。

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

初心者でも分かる!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回目)

オブジェクト指向について

オブジェクト指向とは?

オブジェクト指向(オブジェクトしこう)とは、オブジェクト同士の相互作用として、システムの振る舞いをとらえる考え方である。英語の object-oriented (直訳は、「対象物志向の」「目的重視の」という意味の形容詞) の日本語訳である。

オブジェクト指向の枠組みが持つ道具立ては、一般的で強力な記述能力を持つ。複雑なシステム記述、巨大なライブラリ(特に部品間で緊密で複雑な相互関係を持つもの)の記述においては、オブジェクト指向の考え方は必須である。

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

難しい説明ですね。

実はオブジェクト指向とは概念的なもので、人それぞれ説明が異なるのです。

試しに「オブジェクト指向とは」でgoogle検索して、上位のいくつかを確認してみてください。

 

まずは簡単に「パラメタ(変数)や関数をひとまとめにして使いやすくしたり再利用性を高めたもの。」という理解で進めていきましょう。

 

これまで学んできたように上から下にプログラムを読んでいけるようなプログラムは「手続き型」と呼ばれます。

 

理解するメリット

EAを1人で自作するような小規模開発において、オブジェクト指向で開発するメリットはあまり多くありません。

 

しかし、MT5で公開されているプログラムは殆どがオブジェクト指向で書かれていて、ある程度の理解が無いと読むことができません。

バックテストの質や最適化のスピードにおいてMT5の方が圧倒的に優秀なので、世界的にはMT5を使っていく流れにあります。

MT5に興味のある方は、「MT4を辞めてMT5を使う理由」をご確認ください。

 

その他にも、仮想通貨ではPythonやC#などを使って自動売買されることが多いですが、これらもオブジェクト指向で書けるプログラミング言語です。

 

「MT4を使っているのに、MT5のプログラムやPythonを読めて何になるんだ?」と思われるかもしれませんが、ネット上に出てくる新しい技術や面白い技術は、主流となっているプログラミング言語を使って書かれことが多いのです。

もし、自動売買において最先端の情報を得たいのならば、理解しておいて損はありません。

逆に考えれば、普通のプログラムは読めてもオブジェクト指向で書かれたプログラムを読めない人が沢山いるので、少し読めるだけでも他の人より優位性があります。

 

理解するまでの道のり

道のりはかなり長いので、最初はよくわからなくても焦らないでください。

[学ぶのに時間が掛かる理由]

  1. オブジェクト指向を使わなくても動作するプログラムを書けるから、つい「手続き型」で書いてしまう
  2. 小規模開発ではオブジェクト指向で書いた方が時間が掛かるから無駄に感じる
  3. 使っても意味をなさない場面が多い

 

それでも無理矢理オブジェクト指向でプログラミングしていくと、「あ、こういう時は役に立つし、この場合は意味なかったな。」などが見えてきます。

 

前置きがだいぶ長くなってしまいましたが、実際にプログラムを書きながら少しずつ見ていきましょう。

 

プログラムを書く

クラスを作る

クラスとはパラメタ(変数)と関数をまとめた設計図です。

このあたりから「何を言っているのか全く意味が分からねー。」ということになりますが、とにかくプログラムを書いてみましょう。

※説明のためプログラムをぶつ切りで書いていきますが、最終版を後に記載します。

 

クラス(設計図)の定義

まずは設計図の定義を書きます。

protectedやpublicはアクセス修飾子と呼ばれるものですが、後々説明していくのでここではスルーします。

注目してほしいのは、パラメタ(変数)と関数を宣言したという部分です。

 

コンストラクタ

コンストラクタとは、設計図を実体化する際に初期化するためのものです。

Trader001::Trader001部分は同じことが2回書かれているように見えますがそれぞれ意味が違います。

左側がクラス名で、右側が関数名です。

コンストラクタは特殊関数で、クラスと同じ名前を関数名として使うので、Trader001が2つ並んでしまうのです。

 

関数

テスト用に1つ関数を作ります。

Trader001::ExecutionTrade部分は、Trader001クラスのExecutionTrade関数という意味になります。

 

クラスを実体化(インスタンス化)する

クラスはあくまでも設計図で、そのままでは何も起きませんので実体化していきます。

難しすぎるので、1つ1つ説明していきます。

Trader001 *trader_1 = new Trader001(11111, “Person-A”, “XM”);

[先頭のTrader001]
今までは先頭はintやstringのような型にしてきましたが、突然Trader001となっています。

理解しづらいかもしれませんが、そのままの意味でTrader001型という意味です。

[*trader_1]
Trader001をインスタンス化してtrader_1とした。という意味です。
手前の*はインスタンス化時に必要なため付けています。
[new Trader001(xxxxx)]
newはインスタンス化する時に使います。
つまり、Trader001という設計図を実体化する。ということになります。
(xxxx)部分がコンストラクタに渡されます。

 

これから実際の処理の流れを追って行きますが、その前にプログラム全体をまとめたものを載せておきます。

 

クラス(設計図)の構成を再度把握しておきましょう。

  • クラス名:Trader001
  • パラメタ:account_no, name, broker
  • 関数:ExecutionTrade

 

実体化~利用するところまでを見ていきます。

Trader001を実体化

new Trader001(11111, “Person-A”, “XM”);

コンストラクタが呼び出される
account_noに11111が設定される
nameにPerson-Aが設定される
brokerにXMが設定される

実体化されたクラスがtrader_1に入る

trader_1のExecutionTradeを呼び出す

delete(trader_1)で使ったオブジェクトを削除

 

コンパイルして結果を確認してみましょう。

インスタンス化して実行した結果

クラスに設定されたパラメタを元に関数が動作しました。

 

クラスは設計図なので、いくらでも実体化することができます。

試しにOnInitの中身を以下のように変更して実行してみましょう。

複数インスタンス化した場合の実行結果

このようにTrader001という設計図から、各ユーザー専用のオブジェクトを実体化して利用することができます。

 

デバッグモードを使いこなす

オブジェクト指向で最初に最も戸惑うのは、プログラムが順序通り進んでいかず、あちこち参照する必要があるからです。

そこで、プログラムを1行1行実行できるデバッグモードを利用します。

確認したい行をダブルクリックしてマークしたうえで、「再生」をクリックします。

MetaEditorをデバッグモードで実行

 

再生すると以下のポップアップが出てくるので、「OK」をクリックします。

デバッグ時のポップアップ

 

マークした行でプログラムが停止したのが分かります。

ブレークポイントでの停止確認

 

次に「F11」キーを押すか、下図の赤丸部分をクリックします。

デバッグモードでのステップイン

 

そうすると、次はTrader001クラスのコンストラクタの1行目が実行されることが分かります。

デバッグモードの実行状況

 

そのままF11を何回か押して、コンストラクタの最後まで進んでいきます。

デバッグの進行状況

 

この時点でTrader001クラスの初期化が完了しています。

下図の四角枠を選択して、値を確認したい変数名を入れてみましょう。

デバッグモードで変数名を入力

 

入力すると変数の値や型が分かりますので、プログラムの動作を確認するときに大変便利です。

デバッグモードで変数入力結果

 

次はOnInitに戻り、「ExecutionTrade」が実行されます。

デバッグの進行状況

 

Trader001のExecutionTradeが実行されました。

ExecutionTradeの実行

 

その後OnInitに戻り、利用したクラスの削除が行われて処理が終了します。

オブジェクトの破棄

処理終了

 

デバッグモードを使うことで処理順序を簡単に把握することができますので、プログラムが読みづらい場合は活用していきましょう。

 

最後に

今回はオブジェクト指向の入り口であるクラスについて学んできました。

難しく感じたかもしれませんが、反復していればそのうち慣れてきます。

途中で諦めるか継続するかが理解の分かれ目になりますので、理解したいのであれば意味があってもなくても毎回クラスを作って書いてみることが大事だと思います。

 

自動売買をするという観点だけで言えば、「メタトレーダー(MT4)で自動売買するための事前準備(第1回)」で記事にした手続き型プログラミングで全く問題ありません。