*

MQL5がMQL4と違う点 仕様の違いと書き方 まとめ

公開日: : MT5/MQL5 , , ,

目次/もくじ

Originally posted 2019-04-04 06:15:34.

MQL4はできるけどMQL5と言語仕様が違うと聞いて、MQL5は保留状態だった方は多いと思います。このページに来たということは、何かしらの理由でMQL5を始めてみよう、あるいは、はじめて見たけどよく分からんって方だと思います。

 

MQL4はできたのがかなり昔の話なので、「もっとこうした方が良いよね」とか「本来こうすべきだったよね」というのをMQL5では改良されています。

逆に言うと、慣例的に周知された仕様よりも厳密性や定義を重視するので、それまでの仕様を一切無視した仕様などもあります。

 

MQL5を始める前に、そうした泥沼にはまるような仕様の違いについてご紹介します。基本的にMT5をディスっているのでMT5の良いところを知りたい方はMT5がMT4よりも優れている点 一覧

 

「そもそもMT5に対応したFX業者なんて全然ねーよ」、と思っている方はこちら

MT5対応のおすすめ海外FX会社一覧

ヘッジアカウントとネッティングアカウントの大幅な差

MT5ではアカウントの種類にヘッジタイプとネッティングタイプがあります。これはFX業者に依存したもので、MT5内で変更することはできません。

そのMT5がどちらのアカウントタイプかは

で調べられます。

ネッティングアカウントの場合

一方、ネッティングタイプはオーダーを合算させる仕様の口座タイプです。例えば、両建てをした場合、ヘッジタイプではMT4のように表示されますが、ネッティングタイプでは前に持っていたポジションが決済されて終了です。

そもそも両建て、トラリピ、ナンピンはできない

また、同じ通貨ペアで同じ方向にロットを増やした場合(ピラミッティングした場合)、ヘッジタイプでは新たなオーダーとして区別されますが、ネッティングタイプの場合はオーダーが合体させられます。

つまり、ネッティングアカウントでは、ナンピン、トラリピ、ループイフダン、ピラミッティング、両建てなどの手法は一切できません

 

オーダーコメントは上書きされる

同じ通貨ペアでポジションを新規にとると、すでに保有しているポジションのチケットナンバーでロットだけ増加します。
同じように、もしEAにコメント付きでオーダーを送信させて、そのあと裁量で同じ通貨ペアのオーダーをすると、
オーダーコメントが上書きされてしまいます。

コメントでオーダーを管理するというのは、安定性に欠けるので避けるべきではありますが、
それでも複雑な開発要件の場合、どうしても使用せざるをえないことがあります。

しかし、MT5ではコメントがリアルタイムで変化する可能性があるので、
コメントを使ったプログラミングは比較的穴になる可能性があります。

(見かけ上は古いコメントが消滅したように見えますが、中では残っているようです。)

オーダーの注文の仕方

オーダーはOrderSendの関数を使いますが、もう全くの別物です。構造体を使ってオーダーを送ります。

 

オーダー決済の仕方

ネッティングアカウントの場合、決済は反対売買によって行います。そのため、もっているポジションの逆向きの同じロットの注文を送信すれば決済されます。

 

ヘッジアカウントの場合

ヘッジタイプは、ポジション、オーダーの扱いに関しては従来のMT4とまったく同じタイプのアカウントです。CTradeという標準ライブラリを使えばMQL4と同様に処理できます。

オーダーの注文

 

オーダー決済の仕方

CTradeの

もありますが、こちらの場合、そのシンボルのポジションが全部決済されてしまうので、チケットごとに決済したい場合は上の書き方の方がおすすめです。

 

MQL5ではポジション、オーダー、ディールを厳密に区別する必要がある

MT4ではあまり厳密に区別されることはありませんが、MT5ではこの3つを厳密に区別します。(ただし、MQL5の関数はぐっちゃぐちゃ)

MT5でのオーダーとは

サーバーに送信された注文の合算。予約注文(指値、逆指値)も含む。受理されなかった場合には保存されない。

MT5でのポジションとは

約定したオーダー。予約注文(未約定オーダー)は含まれない。

MT5でのディールとは

サーバーに送信された個別の注文。注文ロットが大きくてFX業者側で分割された場合には、分割されたものそれぞれがディールになる。MT5で株取引とかをした場合には重要になる。

例えば、USDJPYの指値買いディールを0.1ロットを二回出したとします。

ディールは2つ、ポジションは0、オーダーは1つです。

このオーダーが約定すると、

ディールは2つ、ポジションは一つ、オーダーは0です。

ただし、ヘッジアカウントの場合、

ディールは2つ、ポジションも2つ、オーダーは0です。(超ややこしいですね。)

詳しくはこちら

https://www.mql5.com/en/articles/211

 

ポジションの識別処理が全然違う

MT4では何かと御世話になるOrdersTotalですが、MT5ではバグ屋さんです。
類似の関数にPositionsTotalというものができているのですが、
MQL5では約定したポジションと予約注文が分かれています。(細かいことは次回やります)

Order~ Position~系は完全に関数が分離しています。

これを知らずにMQL4と同じようにコーディングすると痛い目を見ます。

MQL4ではOrderSelect一つで済んでいたことが、MQL5では状況に応じて関数の使い分けが必要です。

じゃあ、その関数はなんなの?というと…

OrdersTotal()とOrderSelectの併用の代わりに、MQL5では6通りの使い分けが必要

OrderSelect(ticket):

引数はチケット番号。MQL4で言うところの、OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADE)です。ただし、対象はオーダー。SELECT_BY_POSとかSELECT_BY_TICKETの指定はもうありません。チケットでしか渡せません。


PositionSelectByTicket(ticket):

チケットを引数に入れると、MQL4で言うところのOrderSelectした状態になります。MQL4で言うところの、OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADE)です。ただし、対象はポジション。


PositionSelect(symbol):

引数はシンボル。MT5のネッティング口座の場合、シンボル毎にオーダーが集約されるので、シンボルを選択すればオーダーの情報が引っ張ってこれるよね、って仕組みです。

ヘッジ口座の場合は意図しないポジションも一気に処理してしまうので、これを使うと汎用性がガガガ…


HistorySelect(from_date,   to_date ):

MQL4のOrderSelect(i,SELECT_BY_POS, MODE_HISTORY)と見せかけて違います。

履歴を参照する期間をUNIXタイムで指定します。(HistoryReadPeriod()とかの名前の方が良かったんじゃないの?)


HistoryOrderSelect(ticket):

MQL4で言うところの、OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISOTRY)です。

呼び出せば、

HistoryOrderGetDouble(),

HistoryOrderGetInteger(),

HistoryOrderGetString()

が使えるようになります。


HistoryDealSelect(ticket):

ディールごとに履歴を参照できます。

呼び出せば、HistoryDealGetDouble(), HistoryDealGetInteger()を利用できるようになります。


HistorySelectByPosition(position_id):

position_idは、全ての新しくオープンしたポジションに割り当てられ、ポジションのライフタイムに一貫する固有の番号です。これに関してはあまり馴染みがないと思います。指定した条件のポジション履歴を参照・回収します。こいつを使うとHistoryDealsTotal() とHistoryOrdersTotal()の値が変わります。

 

でも、上の関数を従来のように使うにはチケットがわかってないと駄目だよねってことで、

チケットを取得する関数

OrderGetTicket(index):

MQL4で言うところの、OrderSelect(index,SELECT_BY_POS,MODE_TRADE)ですが、チケットを返すと同時にOrderSelectの役割も自動的に果たすので、OrderTicket()とOrderSelectの合体版のようなやつです。(逆にこいつのあとでOrderSelectするとバグります。)  注:約定済みのポジションは範囲外なので、予約注文のみを返します。


PositionGetTicket(index):

ポジションの数以下の数値を引数に入れると、そのポジションのチケットを返します。


PositionGetSymbol(index):

持っているポジションの数以下の数値を引数に入れると、そのポジションのシンボルを返します。返すのはチケットではありませんが、PositionSelect(symbol)と組み合わせて使えます。


HistoryOrderGetTicket(index):

履歴のチケットを返します。使うには事前にHistorySelectで期間を指定しておく必要があります。


HistoryDealGetTicket(index):

履歴のディールのチケットを返します。

 

オーダー情報に関するサンプルコード

有効のオーダー情報が欲しい場合のコード

 

履歴のオーダー情報が欲しい場合のコード

 

 

履歴のディール情報が欲しい場合のコード

 

 

時系列予約変数・関数がない

Open[],Close[],iOpen(),iClose()がない

MQL4では始値、終値、高値、安値を取得する関数がありましたが、
MQL5ではありません。

「いや、でも名前が変わっても似たような関数があるんでしょ?」
と思うのが普通だと思います。

それがないんですね~

MQL5では、
自分で配列を宣言して、配列の向きを変えて、配列に値を入れないと
始値~安値を取得できない!

さすがにバージョンアップで実装されたようです。逆にオリジナル関数で代用していた人の場合、定義済みの関数としてバグを吐き出すので、ほんと大変ですよね。

 

 

その他

ところどころ良くなっているところはもちろんあるのですが、
その他にも
・MT5を複数インストールフォルダにコピーするとEAの紐づけがバグる
・特定の条件でコンパイルしてもEAが初期化されないバグ
・そもそも対応業者が少ない
・ヒストリーデータがいじれない(import,export)
・旧式のOrderSendの廃止->構造体に
・コンパイルしたときにエラーが一番上に来ない
・決済後のトレードのコメントを表示できない

 

チャートにセットした実行中のEAのパラメータは変えられない

【追記】バージョンアップで変えられるようになった疑惑あり

MT4ではEAが稼働しているチャート上で右クリックを押せばパラメータを変更できましたが、MT5では変更できません。(変更できないなら、あたかも変更できるように見せかけるUIやめてほしいものです)

 

実行中のEAのパラメータを変更するには一度EAを停止するか、新規にEAをチャートにセットしなければなりません。

 

そのため、ちょっとだけパラメータを変更したい場合でも、リセットされた状態からすべて設定しなおさなければなりません。

 

つまり、MT4では「とりあえずEAをセットしてもらってから、後でパラメータを変更してもらう」ということができましたが、MT5ではなるべく最初の時点ですべてのパラメータをきっちり入力できるようにコーディングする必要があります。

 

 

インジケーターバッファの最大が512

MT4のインジケーターはバッファが最大8なので、どんなに頑張ってもシグナルに関連する数値は8までしか出すことができませんでした。

しかし、MT5ではバッファが512なので、サブウィンドウ上で8以上のラインを表示させることも可能です。

 

MQL5ではBarsが使えない

MQL4ではBars, MQL5ではChartGetInteger(Chart_ID,CHART_VISIBLE_BARS)。→バージョンアップでMQL4由来の配列も使えるようになりました。

 

オブジェクトの扱い

MQL5では、関数の引数のチャートIDの省略が不可になりました。

 

MQL5にはMarketInfoがない

MQL4ではMarketInfo(),

MQL5では返値の型に応じて関数を使い分けます。

AccountInfoInteger()~AccountInfoDouble()

 

MQL5ではIsDemoの返値の順番が違う

MQL4では0-ライブ 1-デモか、

MQL5では0-デモ、1-コンテスト、2-ライブ、

いや、数字の順番は一緒にしてくれよ・・・

AccountInfoInteger(ACCOUNT_TRADE_MODE)で取り出します。

 

MQL5のこれまでのざっくりした変遷

MQL5の発表。ただし、MQL4との互換性なしということで誰も使わない。(MQL4の関数がない)

あまりに使われないのでMQL4をMQL5にちょっとずつ似せる

MQL4の関数も一部使えるようになる。(オリジナル関数を作っていたコードはコンパイルでエラーを吐き出すようになる)

公式が互換関数(標準ライブラリ)を実装する。

ヘッジアカウントとネッティングアカウントの2タイプに分かれる。

【現状】

・同じMT5なのにそれぞれの口座タイプに合わせたEAを作らなければいけなくなる。

・古いMQL5のコードは書き直しをしないとエラーでコンパイルできない。

 

レート取得の対応

MQL4MQL5内容

SymbolInfoDouble(Symbol(),SYMBOL_ASK);

でも可

Barsは変わりなし
SymbolInfoDouble(Symbol(),SYMBOL_BID)でよくね? 

さすがに批判殺到で、

iClose(Symbol(),Period(),shift)が使えるようになりました。

Digitsは_Digitsです。

アンダーバーを忘れずに

バージョンアップでiHigh(Symbol(),Period(),shift)が使えるようになりました。
MQL4と同じようにiLow()が使えます。
MQL4と同じようにiOpen()が使えます。

Pointは_Pointです。

アンダーバーを忘れずに。

iTime()が使えます。
iVolumeが使えます。

アカウント情報の対応

ここら辺の関数はMQL4からMQL5への移植には変換が必要ですが、

MQL5からMQL4に移植する際にはMQL4でMQL5の関数が認識されるのですんなり変換できます。

MQL4MQL5内容
返値がdoubleなのでAccountInfoDoublを使います。
現在アカウントのクレジット値を返します。
現在アカウントが登録されている会社名を返します。
現在アカウントの通貨名を返します。
現在アカウントの同等値を返します。純資産計算はトレーディングサーバーの設定に依存します。
現在アカウントのフリーマージン値を返します。
現在アカウントの現在価格で指定したポジションがオープンになってから残っているフリーマージン値を返します。
現在アカウントに許可されているオープンポジションののフリーマージン計算モード
現在アカウントのレバレッジを返します。
現在アカウントのマージン値を返します。
現在アカウント名を返します。
現在アカウント数を返します。
現在アカウントのプロフィット値を返します。
接続サーバー名を返します。
ストップアウトレベル値を返します。
ストップアウトレベルの計算モードを返します。

 

この投稿は役に立ちましたか? 役に立った 役に立たなかった 2 人中 2 人がこの 投稿 は役に立ったと言っています。

Message

メールアドレスが公開されることはありません。

CAPTCHA


 
  • fxfx.work

    (↑広告です。このサイトの管理者の運営ではありません)

     


  • 横瀬兼元(ペンネーム)です。

    プロフィール
    商材を買わせようとする偽者がいるらしいのでご注意ください。
    ツイッター始めました(イマサラー)
    https://twitter.com/FxantennaC
    (埋め込みするとページ表示が極端に遅くなるので、リンクでご容赦を) 4000文字未満のトピックや話題はツイッターで発信しています。
  • fxfx.work

    (↑広告です。このサイトの管理者の運営ではありません)

Translate »
ページトップへ