06:15:34.MQL4はできるけどMQL5と言語仕様が違うと聞いて、MQL5は保留状態だった方は多いと思います。このページに来たということは、何かしらの理由でMQL5を始めてみよう、あるいは、はじめて見たけどよく分からんって方だと思います。MQL4はできたのがかなり昔の話なので、「もっとこうした方が良いよね」とか「本来こうすべきだったよね」というのをMQL5では改良されています。逆に言うと、慣例的に周知された仕様よりも厳密性や定義を重視するので、それまでの仕様を一切無視した仕様などもあります。MQL5を始める前に、そうした泥沼にはまるような仕様の違いについてご紹介します。「そもそもMT5に対応したFX業者なんて全然ねーよ」、と思っている方はこちらMT5対応のおすすめ海外FX会社一覧ヘッジアカウントとネッティングアカウントの大幅な差MT5ではアカウントの種類にヘッジタイプとネッティングタイプがあります。これはFX業者に依存したもので、MT5内で変更することはできません。そのMT5がどちらのアカウントタイプかはAccountInfoInteger(ACCOUNT_MARGIN_MODE)1AccountInfoInteger(ACCOUNT_MARGIN_MODE)で調べられます。ネッティングタイプはオーダーを合算させる仕様の口座タイプです。両建てをした場合、ヘッジタイプではMT4のように表示されますが、ネッティングタイプでは前に持っていたポジションが決済されて終了です。そもそも両建て、トラリピ、ナンピンはできないまた、同じ通貨ペアで同じ方向にロットを増やした場合(ピラミッティングした場合)、ヘッジタイプでは新たなオーダーとして区別されますが、ネッティングタイプの場合はオーダーが合体させられます。ネッティングアカウントでは、ナンピン、トラリピ、ループイフダン、ピラミッティング、両建てなどの手法は一切できません。オーダーコメントは上書きされる同じ通貨ペアでポジションを新規にとると、すでに保有しているポジションのチケットナンバーでロットだけ増加します。同じように、もしEAにコメント付きでオーダーを送信させて、そのあと裁量で同じ通貨ペアのオーダーをすると、オーダーコメントが上書きされてしまいます。コメントでオーダーを管理するというのは、安定性に欠けるので避けるべきではありますが、それでも複雑な開発要件の場合、どうしても使用せざるをえないことがあります。MT5ではコメントがリアルタイムで変化する可能性があるので、コメントを使ったプログラミングは比較的穴になる可能性があります。(見かけ上は古いコメントが消滅したように見えますが、中では残っているようです。)オーダーの注文の仕方オーダーはOrderSendの関数を使いますが、もう全くの別物です。構造体を使ってオーダーを送ります。ORDER_FILLING_IOC;OrderSend(CRequest,CResult);オーダー決済の仕方ネッティングアカウントの場合、決済は反対売買によって行います。そのため、もっているポジションの逆向きの同じロットの注文を送信すれば決済されます。ヘッジアカウントの場合ヘッジタイプは、ポジション、オーダーの扱いに関しては従来のMT4とまったく同じタイプのアカウントです。CTradeという標準ライブラリを使えばMQL4と同様に処理できます。MT5に標準搭載されているのでダウンロードする必要はありません。MT5に標準搭載されているのでダウンロードする必要はありません。偏差値)もありますが、こちらの場合、そのシンボルのポジションが全部決済されてしまうので、チケットごとに決済したい場合は上の書き方の方がおすすめです。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では約定したポジションと予約注文が分かれています。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のネッティング口座の場合、シンボル毎にオーダーが集約されるので、シンボルを選択すればオーダーの情報が引っ張ってこれるよね、って仕組みです。MODE_HISTORY)と見せかけて違います。履歴を参照する期間をUNIXタイムで指定します。(HistoryReadPeriod()とかの名前の方が良かったんじゃないの?)HistoryOrderSelect(ticket):MQL4で言うところの、OrderSelect(ticket,SELECT_BY_TICKET,MODE_HISOTRY)です。呼び出せば、HistoryOrderGetDouble(),HistoryOrderGetInteger(),HistoryOrderGetString()が使えるようになります。HistoryDealSelect(ticket):ディールごとに履歴を参照できます。HistoryDealGetInteger()を利用できるようになります。HistorySelectByPosition(position_id):position_idは、全ての新しくオープンしたポジションに割り当てられ、ポジションのライフタイムに一貫する固有の番号です。これに関してはあまり馴染みがないと思います。指定した条件のポジション履歴を参照・回収します。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):履歴のディールのチケットを返します。取得する関数がありましたが、MQL5ではありません。「いや、でも名前が変わっても似たような関数があるんでしょ?」と思うのが普通だと思います。自分で配列を宣言して、配列の向きを変えて、配列に値を入れないと始値~安値を取得できない!さすがにバージョンアップで実装されたようです。逆にオリジナル関数で代用していた人の場合、定義済みの関数としてバグを吐き出すので、ほんと大変ですよね。その他ところどころ良くなっているところはもちろんあるのですが、その他にも・MT5を複数インストールフォルダにコピーするとEAの紐づけがバグる・特定の条件でコンパイルしてもEAが初期化されないバグ・そもそも対応業者が少ない・ヒストリーデータがいじれない(import,export)・旧式のOrderSendの廃止->構造体に・コンパイルしたときにエラーが一番上に来ない・決済後のトレードのコメントを表示できないチャートにセットした実行中のEAのパラメータは変えられない【追記】バージョンアップで変えられるようになった疑惑ありMT4ではEAが稼働しているチャート上で右クリックを押せばパラメータを変更できましたが、MT5では変更できません。(変更できないなら、あたかも変更できるように見せかけるUIやめてほしいものです)実行中のEAのパラメータを変更するには一度EAを停止するか、新規にEAをチャートにセットしなければなりません。そのため、ちょっとだけパラメータを変更したい場合でも、リセットされた状態からすべて設定しなおさなければなりません。MT4では「とりあえずEAをセットしてもらってから、後でパラメータを変更してもらう」ということができましたが、MT5ではなるべく最初の時点ですべてのパラメータをきっちり入力できるようにコーディングする必要があります。インジケーターバッファの最大が512MT4のインジケーターはバッファが最大8なので、どんなに頑張ってもシグナルに関連する数値は8までしか出すことができませんでした。MT5ではバッファが512なので、サブウィンドウ上で8以上のラインを表示させることも可能です。MQL5ではChartGetInteger(Chart_ID,CHART_VISIBLE_BARS)。→バージョンアップでMQL4由来の配列も使えるようになりました。オブジェクトの扱いMQL5では、関数の引数のチャートIDの省略が不可になりました。MQL5にはMarketInfoがないMQL4ではMarketInfo(),MQL5では返値の型に応じて関数を使い分けます。1-デモか、MQL5では0-デモ、1-コンテスト、2-ライブ、いや、数字の順番は一緒にしてくれよ・・・AccountInfoInteger(ACCOUNT_TRADE_MODE)で取り出します。MQL5のこれまでのざっくりした変遷MQL5の発表。MQL4との互換性なしということで誰も使わない。(MQL4の関数がない)↓あまりに使われないのでMQL4をMQL5にちょっとずつ似せる↓MQL4の関数も一部使えるようになる。公式が互換関数(標準ライブラリ)を実装する。じMT5なのにそれぞれの口座タイプに合わせたEAを作らなければいけなくなる。・古いMQL5のコードは書き直しをしないとエラーでコンパイルできない。class="number">0</span>,count,Close);さすがに批判殺到で、iClose(Symbol(),Period(),shift)が使えるようになりました。class="functions">Digits</span>=_Digits;Digitsは_Digitsです。class="number">0</span>,count,High);バージョンアップでiHigh(Symbol(),Period(),shift)が使えるようになりました。class="number">0</span>,count,Low);MQL4と同じようにiLow()が使えます。class="number">0</span>,count,Open);MQL4と同じようにiOpen()が使えます。class="functions">Point</span>=_Point;Pointは_Pointです。アンダーバーを忘れずに。class="number">0</span>,count,Time);iTime()が使えます。class="number">0</span>,count,Volume);iVolumeが使えます。アカウント情報の対応ここら辺の関数はMQL4からMQL5への移植には変換が必要ですが、MQL5からMQL4に移植する際にはMQL4でMQL5の関数が認識されるのですんなり変換できます。class="keyword">ACCOUNT_BALANCE</span>)返値がdoubleなのでAccountInfoDoublを使います。class="keyword">ACCOUNT_CREDIT</span>)現在アカウントのクレジット値を返します。class="keyword">ACCOUNT_COMPANY</span>)現在アカウントが登録されている会社名を返します。class="keyword">ACCOUNT_CURRENCY</span>)現在アカウントの通貨名を返します。class="keyword">ACCOUNT_EQUITY</span>)現在アカウントの同等値を返します。純資産計算はトレーディングサーバーの設定に依存します。class="keyword">ACCOUNT_FREEMARGIN</span>)現在アカウントのフリーマージン値を返します。現在アカウントの現在価格で指定したポジションがオープンになってから残っているフリーマージン値を返します。class="keyword">ACCOUNT_LEVERAGE</span>)現在アカウントのレバレッジを返します。class="keyword">ACCOUNT_MARGIN</span>)現在アカウントのマージン値を返します。class="keyword">ACCOUNT_NAME</span>)現在アカウント名を返します。class="keyword">ACCOUNT_LOGIN</span>)現在アカウント数を返します。class="keyword">ACCOUNT_PROFIT</span>)現在アカウントのプロフィット値を返します。class="keyword">ACCOUNT_SERVER</span>)接続サーバー名を返します。class="keyword">ACCOUNT_MARGIN_SO_SO</span>)ストップアウトレベル値を返します。class="keyword">ACCOUNT_MARGIN_SO_MODE</span>)ストップアウトレベルの計算モードを返します。役に立ったと言っています。コメントをキャンセルメールアドレスが公開されることはありません。コメント名前メールアドレスサイト上に表示された文字を入力してください。2020関連記事MT5のストラテジーテスターではスプレッドは変更できないという事実を知らない人が多くて、「このバックテストのスプレッドはいくつですか」という質問が来るので共有です。記事を読む(↑広告です。このサイトの管理者の運営ではありません)プロフィール横瀬兼元(ペンネーム)です。プロフィール商材を買わせようとする偽者がいるらしいのでご注意ください。Japan本サイトは、日本在住者にFX取引を勧誘することを意図したものではありません。外国為替取引はすべての投資家に適しているわけではない高水準のリスクを伴います。レバレッジは一層大きなリスクと損失の可能性を生み出します。外国為替取引を決定する前に、投資目的、経験の程度およびリスクの許容範囲を慎重に考慮してください。当初投資の一部または全部を失うことがあります。したがって損失に耐えられない資金投資をしてはなりません。外国為替取引に関連するリスクを検討し、疑義があるときは中立的な財務または税務アドバイザーに助言を求めてください。