こちらは MQL4 と MQL5 の決定的な違いを EA開発者の視点で非常に網羅的に解説した記事です。
MQL4 と MQL5 のみならず、「MT4 と MT5 の違い」に関しても詳細に解説しています。
現在、海外では完全にMT5が主流となっており世界中のほとんどのFX会社はMT5を導入していますし、むしろMT5しか扱っていない会社も増えてきています。正直MT4は動作スピードが遅い・レートがミリ秒まで取得できない、など時代遅れです。MT4は32bit対応ですが、MT5は64bitなのでそこを見ても明らかです。
Cをベースにした MQL4 に対して C++ をベースにした MQL5 ではより複雑・厳密になりましたが、はるかにできることの範囲が広がっています。
MQL4 とほとんど変わらない部分もありますが、決定的に異なる部分がいくつかあり、プログラマーとしてはそれらを網羅的に理解しておく必要があります。このページではそれらを網羅的に解説します。
(※ MQL4からMQL5の「移行・移植方法」を知りたい場合にはこちらの記事になります ⇒ MQL4 ⇒ MQL5 移行で勉強すべき内容の総まとめ|MQL5入門 )
Contents
【アカウントの種類】ヘッジタイプとネッティングタイプ
MT5 には口座の種類が2つあります。
- ネッティングタイプ とは両建てができない種類のアカウントであり両建てしようとすると自動的に1つのポジションに統合されてしまいます。EAを開発するにあたって非常に使いにくいです。
- ヘッジタイプ とは従来のように両建てが可能な種類の口座です。多くのFX会社はこっちなのでこれが標準だと思ってもらって大丈夫です。
これらのタイプはあらかじめFX会社によって決められています。(極まれに選べる場合があります。)
ネッティングタイプは正直めちゃくちゃ使いにくいですが、ネッティングタイプを採用している FX会社はほとんどないので(私が使ったことあるものだとFXPro や Oandaくらい)あまり気にしなくて良いと思います。ヘッジタイプ用にEAは開発しましょう。
なおコードを書く際に注意すべき点としては、トレード系の関数の中にはヘッジタイプ専用・ネッティングタイプ専用のものが一部ある、というくらいです。
【大前提】基本的に文法、ほとんどの関数は互換性がある
MQL4もMQL5も文法的にはほとんど違いはありません。また多くの関数は互換性があり、そのまま使えます。
大きく異なるのは情報の取得方法(現在レートや口座情報)とトレードの送信の方法です。
以下に MQL5 に特徴的な内容をまとめます。
MQL4 と MQL5 の決定的な違い
① MQL5はC++がベースで、オブジェクト指向である
MQL5は C++ がベースなのでオブジェクト指向の考え方が必要になります。
価格の取得や、時間、トレードの送信などはすべて「構造体」を通して行うことになります。たとえばティック情報を取得するために 「MqlTick 構造体」があらかじめ用意されており、Ask・Bid・ティックボリューム・ティック到達到達時刻などをすべてこの1つの構造体から取得可能です。
最初は少々戸惑いますが、慣れるととても便利で使いやすいと思います。
※ 構造体に関する内容はこちらの記事で詳しく解説しています ⇒ [MQL5] わかりにくい「構造体」の使い方をまとめて一気に解説!
② MQL5はHFTやスキャルピングなどの高速取引のために最適に設計されている
MQL5 は MQL4 に比べて圧倒的に処理が早いです(比べ物にならないレベル)。
実際に MT5 はHFT・アービトラージ・超高速スキャルピングなどの高度なシステムの開発のために最適なプラットフォームであり、HFT 専用のトレード関数まで存在します。またレートの到達時間も「ミリ秒」まで可能です。
※ HFT専用のトレード関数に関する解説 ⇒ 【HFT専用!?】 MQL5の OrderSend() と OrderSendAsync() の違いとは?
MT4がローソク足ベース(各Open, High, Low, Close)のトレード戦略を開発するためのプラットフォームであるのに対して、MT5はティックベース(各 ティック)のトレード戦略を開発するためのプラットフォームです。
(ティックベースのEAでなくてもMT5はすべての側面でハイスペックなのでMT5移行は多くのメリットがあります。)
したがって、MQL5 では MQL4 のようにあらかじめ Open[], High[], Low[], Close[] は定義されていません。(なお初期に利用者からの反発が多くあったので iClose() , iLow() などの関数は使えるようになりました)
③ トレード系の関数が完全に異なる
プログラマー・EA開発者が MQL5移行する際に最も苦労するのがこちらだと思います。
MQL5 では(MQL4でいうところの Order)は Order・Deal・Position に明確、厳密に区別されており、それらに関する情報の取得方法も全く異なります。
これらの区別をしっかりと理解できていないと、誤ってトレードを送信してしまうことも普通に起き得ます。(特に高頻度のシステムの場合)
注文を送信した際の処理状況が非常に厳密に分類されているので、理解するまでのハードルが高いです。
MQL4とは異なり、エントリーとエグジットの際の注文方法も一見同じなので、戸惑うと思います。
※ OrderSend 関数を解説した記事はこちら ⇒ MQL5特有の複雑な OrderSend() の使い方を完璧に解説!
※ オーダー、ディール、ポジションについての詳しい解説 ⇒ [MQL5] オーダー・ディール・ポジションの厳密な分類とは?
④ バックテストにて、実際のティックデータ(実際の ASK と BID)を使うことができる
MT4 では過去検証の際に「スプレッド」を指定する必要がありました。しかし、これは現実とはかけ離れており(スプレッドは変動し、値動きの激しいときは広がる)そのためにわざわざ Tick Data Suite を使う人さえいました。
MT5では実際に記録された ask と bid のティックデータがブローカーのサーバーに記録されているので、わざわざそんな面倒なことをする必要がありません。
ただ、「ティックデータが一部欠けている」ことが稀にあり、その場合は「every tick generation」という方法にてストラテジーテスターが「疑似ティック」を生成します。
この場合、アービトラージやティック価格をベースとしたシステムの場合の過去検証の信頼度は下がるので注意してください(ティックベースのEAでない場合、ほぼ影響はありません)。
疑似ティックの生成アルゴリズムに関しては公式サイトに載っており、読んでみると面白いと思います。
→ https://www.mql5.com/en/articles/75
⑤ 板情報が見れる
これは口座の種類によります。基本的に ECN タイプの口座であれば株のように板情報や実際の出来高・取引量(MQL5 では real volume と呼ばれていて、volume =ティックボリュームと明確に区別されている)が見れるので投機の判断に役立てることができます。
⑥ python との統合が可能
これに関してはあまり注目されることがないですが、python との統合が可能です。データを引っ張ってきてpython 側の機械学習系のライブラリを使ってトレードモデルを作る、なども容易にできます。
機械学習系のトレード戦略を作る場合には、前述の板情報を特徴量として入れることができるのは大きな利点だと思います。
⑦ その他の違い
細かい違いを上げたらきりがありませんが、以下のような違いもあります。
- PERIOD_H1 などはチャートの「分数」と一致しない。例えば MQL4では PERIOD_H1=60だが、MQL5ではPERIOD_H1=16385 が定数値となる
- バックテストの最適化の際に同じネットワークのほかのPCや、クラウド上のPCを使える(マルチスレッド)
- 最適化する目的変数を自由に決められる(自分で定義可能)
- 外部変数は input と sinput がある。sinput は最適化の際に値を変えられない
- バックテストの際にチャートをスクロールしてデータをダウンロードする必要はない
- チャート上の bar 数を unlimited にできる
- インジケーターの値を取得するには「handle 値」をやり取りする(重要)
- 経済指標カレンダーが参照でき、指標の発表の時間などがターミナルから取得可能
まとめ
「MQL4 と比較した際の、MQL5 に特徴的な内容」を本記事では簡潔にまとめました。
また下記の記事では、「MQL4 から MQL5 に移行する」際にどういった内容をどういった順番で学習していけばよいかをわかりやすく説明しています。MQL5 の習得途中の方に取って非常に有益な内容だと思いますので、ぜひ一度読んでみてください。