最近、MT5の利用者も増えてきたのでしょうか、MQL5プログラミングに関するご質問をいただくようになりました。
多くは、拙著の「FXメタトレーダー4&5一挙両得プログラミング」(メタトレ二刀流本)の読者様からのものです。そのなかで、サンプルプログラムをMT5のヘッジ口座で利用したいというご要望がいくつかありました。
しかし、残念ながらメタトレ二刀流本は初版のままで、改変のタイミングがありません。
MT5のヘッジ口座用のライブラリで、当方が現在メンテしているのは、以下の記事で紹介した「新MT4対応ライブラリによるメタトレーダーEA実践プログラミング」(新メタトレ実践本)用のもののみです。
MT4とMT5で同じソースプログラムを使ってEAが作れるということから、基本的にこのライブラリをお勧めしています。ただ、MT5のプログラミングに関する出版物がほとんどない状態なので、メタトレ二刀流本をご参考にされている方も少なからずいらっしゃいます。
そこで本記事では、メタトレ二刀流本のサンプルプログラムを多少修正して、新メタトレ実践本のライブラリが利用できるようにする方法をご紹介します。
対応するサンプルプログラムは以下の12個です。
P.264 リスト3.6 MA2Cross1_EA.mq5
P.271 リスト3.8 BBCross1_EA.mq5
P.289 リスト3.10 MA2Cross1SL_EA.mq5
P.299 リスト3.12 MA2Cross1TS_EA.mq5
P.307 リスト3.14 MA3Cross1_EA.mq5
P.320 リスト3.16 BBCross1ET_EA.mq5
P.330 リスト3.18 BBCross1Trend_EA.mq5
P.338 リスト3.20 BBCross1Time_EA.mq5
P.345 リスト3.22 RIFD_EA.mq5
P.352 リスト3.24 BBCross1Limit_EA.mq5
P.362 リスト3.26 RIFD2_EA.mq5
P.370 リスト3.28 MultiSystem_EA.mq5
プログラムの修正ポイント
1. ヘッダファイルの変更
ライブラリはmqhという拡張子のヘッダファイルとして作成されています。MT5の場合、「LibEA.mqh」「LibOrder5.mqh」「LibMQL4.mqh」の3つのファイルを使います。これらのファイルをEAと同じフォルダに入れておきます。
インクルードするヘッダファイルは「LibEA.mqh」のみです。次のように古いヘッダファイルの行はコメントアウトするか、削除して、新しいヘッダファイルに変更します。
1 2 3 |
//#include <MyPosition.mqh> //#include <MyDateTime.mqh> #include "LibEA.mqh" |
なお、ヘッダファイルをMT5のIncludeフォルダに入れて共通に使う場合、
1 |
#include <LibEA.mqh> |
とします。
2. 不要となる行(コメントアウト、あるいは削除)
以下の行は不要となるので、コメントアウトするか、削除して結構です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// マジックナンバー //long Magic = 20120800; //string EAname = "BBCross1ET_EA"; // テクニカル指標の設定 //double Close[]; // 終値の配列 //double Bid, Ask; // 売値・買値 //if(!RefreshPrice(Bid, Ask)) return(false); //if(CopyClose(_Symbol, _Period, 0, MaxBars, Close) < MaxBars) return(false); // ポジションの初期化 //MyInitPosition(Magic); // ポジションの終了処理 //MyDeinitPosition(); // ポジションの更新 //MyCheckPosition(); |
マジックナンバーについては、EA中に記載しなくても、ライブラリで自動的に宣言されるので、それを変更してもいいです。EAで決まった値にしたければ、次のようにヘッダファイルをインクルードする前に、#defineで定義しておきます。
1 2 3 4 5 6 |
// マイライブラリー #define POSITIONS 1 #define MAGIC 20120800 //マジックナンバー //#include <MyPosition.mqh> //#include <MyDateTime.mqh> #include "LibEA.mqh" |
Open[], Close[], High[], Low[]などの四本値の配列や、売値、買値のBid, Ask、ポジションの管理もライブラリで自動的に行われます。その代わり、OnTick()関数ではなく、Tick()関数(これもライブラリ中に定義してあります)を呼ぶように変更します。
1 2 3 |
// ティック時実行関数 //void OnTick() void Tick() |
3. オーダー関数の変更
オーダー関数のMyOrderSend()関数は、引数の数と順番が変更になっています。引数は、売買の種類、売買ロット数、売買価格、ポジション番号の順になっているので、次のように変更します。
1 2 3 4 5 |
//MyOrderSend(0, OP_BUY, Lots, 0, 0, 0, EAname); MyOrderSend(OP_BUY, Lots, 0, 0); //MyOrderSend(0, OP_SELL, Lots, 0, 0, 0, EAname); MyOrderSend(OP_SELL, Lots, 0, 0); |
SLやTPの指定は、オーダー送信時ではなく、オーダー送信後にMyOrderModify()関数で行うようになりました。SLやTPを指定したい場合は、次のようにMyOrderSend()とMyOrderModify()に分けて記述します。
1 2 3 4 5 6 7 |
//MyOrderSend(0, OP_BUY, Lots, 0, Ask-SLpips*PipPoint, Ask+TPpips*PipPoint, EAname); MyOrderSend(OP_BUY, Lots, 0, 0); MyOrderModify(0, Ask-SLpips*PipPoint, Ask+TPpips*PipPoint, 0); //MyOrderSend(0, OP_SELL, Lots, 0, Bid+SLpips*PipPoint, Bid-TPpips*PipPoint, EAname); MyOrderSend(OP_SELL, Lots, 0, 0); MyOrderModify(0, Bid+SLpips*PipPoint, Bid-TPpips*PipPoint, 0); |
各ライブラリ関数の詳しい仕様については、新メタトレ実践本を参照してください。
以上の修正を施したサンプルプログラムとライブラリファイルは、以下からダウンロードできます。ただし、このサンプルプログラムを実行することにより発生した障害、損失などについて、当方は一切の責任を負いかねますので、あらかじめご了承ください。