トレード備忘録 & MT4/MT5インディケータ及びEAの開発

日々のトレード備忘録及びMT4/MT5に関する事項

MT4 ちょっとマニアック#includeをうまく使うとEA作成が楽になる

2017-02-20 13:19:32 | 投資

EAを作成中にいつも煩わしく感じるのは、毎度毎度同じルーチンを繰り返すこと、例えば、決済注文の部分では:

for(int i=0; i {
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) == false) break;
if(OrderMagicNumber() != MAGIC || OrderSymbol() != Symbol()) continue;
if(OrderType() == OP_BUY)
{
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,White);
break;
}
if(OrderType() == OP_SELL)
{
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
break;
}
}

等決まり文句を毎回書くことになる。コピペで簡単に移植できるとはいえ、その作業も煩わしいし、EA自体の長文化にもつながる。このようなルーチン処理はどこかのファイルに関数として保管しておいて、必要に応じて呼び出すことができれば、大変便利である。

そこで思い浮かべるのが、「FXメタトレーダー実践編」で紹介されているオリジナルライブラリーである。このファイルはincludeファイルとLibrariesファイルの二つで構成されており、MyLib.mqhはincludeファイルにあり、保管された関数の定義づけがされている。一方、LibrariesにはMyLib.mq4があって、各関数の内容が書かれている。

EAの冒頭で#include と宣言しておけば、EAを作動させるとこのMYLib.mqhが呼び出されると同時にMyLib.mq4も取り込まれて、EAと一体化して作動する仕組みである。先のOrderClose()はライブラリーの中で、MyOrderClose()として関数化されており、そのため実際にEAを作成する際には、もはやOrderSelect()以下の長ったらしい記述は不要となり、MyOrderClose(); の1行で済む。

本題はここから。

しばらくMyLib.mqhを使わせてもらったが、少し欲が出てきた。まずこのライブラリーには定義されていないが、他に自分で作成した関数も使いたいのでこのライブラリーと合体させたい。もう一つ不便なことがある。MyLib.mqhで作成したEAを他人に紹介したい場合には、EAだけではなく相手のパソコンにはこのライブラリーがインストールされている必要がある。未インストールの場合には、EAともにMyLib.mqhとMyLib.mq4のファイルも届けなければならない。

解決のためのステップ

① 自分の関数群を補完する新しいincludeファイルを作成する。
作成したファイル名を例えばWinLib.mqhとする。
② MyLib.mqhの関数群もそのまま使いたいため、MyLib.mqhの中身(書かれている関数定義の全てをコピペでWinLib.mqhに移植する。
③ 次にMyLib.mq4を開いて、その中身(関数の全て)をWinLib.mqhにコピペで移植する。(②で移植した関数定義の後にコピペ)
ここまでの操作でMyLib.mqhとMyLib.mq4の内容がすべてがWinLib.mqhにまとめて移植された。このままでは使えないので、以下の修正作業を行う。
④ WinLib.mqhの19~31行目(関数の定義部分と31行目の#import)は不要につき削除。12~18行目の定義#define MY_OPENPOSから#define MY_ALLPOSまでのMYの部分をすべてWINに変える。 (WIN_OPENPOS等)
⑤ 次にMyLib.mq4からコピペした部分の修正
全ての関数はMyOrderSend()等Myで始まる関数名になっているので、それらを全てWinOrderSend()等Winで始まる関数名にする。注文タイプもMY_OPNPOS等になっているので、こちらもWIN_OPENPOS等WINで始まるオーダータイプ名に変える。ここまで進んだら一旦コンパイルして修正箇所があれば、エラーがなくなるまで修正を続ける sign mismatchなる警告文が出ることが予想されるが、そのままでも支障はない。気なる向きは冒頭部分のint WinOrderWaitingTime = 10;にあるintの前にuを加えてuintとすれば警告文は出なくなる。
⑥ 以上により「メタトレーダー実践編」のライブラリーの内容は、そっくりWinLib.mqhとして一つのファイルに統一された。自分作成のオリジナル関数があれば、WinLib.mqhにそのまま書き加えればよい。

これで自分自身のincludeファイルWinLib.mqhの完成である。「メタトレーダー実践編」の著者豊嶋先生労作を利用させていただきながら、自作の関数も付け加えることのできる使い勝手の良いライブラリーもどきが出来上がった。MyLib.mq4にはポジションのロット数を計算する関数MyCurrentOrders()が含まれているが、オープンポジションの数を計算する関数がなかった。筆者はint ○○OpenPosCount()なる関数を作って、ポジションの個数を出すことにしている。複数回発注を可能にしたり、抑制したりすることができて便利である。

最後に最大のメリットはEAを他人に譲渡する際に現れる。WinLib.mqhを使ってソースコードを完成してコンパイルすると、機械語に変換されたプログラム(ex4)には、WinLib.mqhが全て取り込まれているのである。つまり、ソースコードでは#include と書かれているにすぎないものが、ex4にはWinLib.mqhの内容が全て取り込まれてEA内では一体となっている。もはや、EAとともにライブラリーも併せて渡すという手間は必要ではなくなった。ex4のみを譲渡すればよい。仮にmq4を渡しても無駄である。コンパイルしようとしてもincludeファイルが存在しなければ、エラーとなるのみであるからである。譲渡側にも譲受側にも文字通りWin-Winではなかろうか。