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

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

Kindle版「メタトレーダー入門」(Build600以降の新MT4を学ぶ)

2017-02-23 22:42:20 | 投資

MetaTrader 4(MT4)がMetaTrader 5(MT5)と一部互換性を持つ新MT4に衣替えしてから約2年が経過しました。謂わば、(旧)MT4とMT5のハイブリッドともいえる新MT4も現在ではではBuild 1045まで更新され、互換性にもほとんど問題は見られず、何事もなかったように作動しています。

ところがMT4の辞書でもあるMQL4 Referenceを見ると、旧MT4で慣れ親しんだ関数名が存在しないことに気付きます。最も基本的なint start()やint init()でさえ説明から外されているのです。MetaQuotes社の方針は明らか、MT4はいずれMT5に統一されるのでしょう。

互換性は保たれるとはいえ、新MT4には多くのMT5の要素が採用されています。将来に備えて新MT4の仕様でプログラムを書きたいというのは、多くのMT4トレーダー達の偽らざるところでしょう。

そういうわけで、シニアーにはちょっと抵抗感もある電子書籍ですが、思い切って豊嶋久道著Kindle版「メタトレーダー入門」を購入してみました。

紙本である前著「メタトレーダー入門」及び「メタトレーダー実践プログラミング」を勉強された方なら1時間もあれば読み飛ばすことができる内容です。Build 600未満の旧MT4にMT5のどの部分が合体して新MT4となったのか、言い換えれば、新MT4とMT5の境目はどうなっているのか等の素朴な疑問には丁寧に答えてくれています。では、全くの初級者がこの教本を読んでインディケーターや自動売買プログラム(EA)が書けるようになれるのかと訊かれれば、現状では否と答えるしかありません。

理由としては;
1)int start()やint init()等2~3の特殊関数で事足りた旧MT4に対して、新MT4には10種以上の特殊関数が用意されていて、使い分けが必要となるが、それらの説明がほとんどない。(OnCalculate()、OnTick() etc.)また、新たに加わったデータ型の解説もなされていない。
2)索引が用意されていない。
3)プログラム例が前著に比べるとほとんどないといってよい。
4)オブジェクト関数については全く触れられていない。
5)ところどころ旧著以降に刊行された著作を参照することで説明を省略しているが、初学者には読んでも理解できない内容であり、適切とは思えない。
6)そもそもプログラミング言語に初めて接する読者には、変数・配列・if文・for文による繰り返し計算の方法等基本的な知識が必要であり、旧著ではそれらに対して必要最低限の解説がなされていた。基本的な知識をベースに実際のプログラムの書き方を1行1行数ページに亘って解説を重ねられていた。最初に取り上げられた移動平均線(MA)の指標プログラムでは、実に10ページ近くを費やして完成までのプロセスを辿っていた。初学者もなんとか必死で食らいついて行けたのである。

結論的には、前著の紙本「メタトレーダー入門」の域には到底到達していないというほかはありません。今回の電子書籍による刊行は今後頻繁に改訂をなされることを予想したやむを得ない措置であることは理解できますが、それならば是非旧著と同レベルまでアップグレードされるか、旧著である2紙本の続編を期待したいところです。

これからMT4を学びたい方へ

今回、e-bookとして刊行されたKindle版「メタトレーダー入門」は決してお勧めできません。当面は既刊の2紙本で実力を蓄えられることが重要であると考えます。旧MT4はほぼ完璧に新MT4と互換性が保たれていること、また、私見ですが、一旦旧MT4をマスターしてしまえば、新MT4を学ぶことはそんなに困難ではありません。

新MT4でMT5の要素を多く取り入れたのは指標作成プログラムとオブジェクト関数を使ったプログラムです。一方、EA作成プログラムで多用するトレード関数(OrderSend()、OrderClose() etc.)は旧MT4のトレード関数をそのまま引き継いでおり、EA(自動売買プログラム)作成を指向する多くのトレーダーにとって、現状では新MT4の知識はあまり必要でないことも確かです。

そういうことで、これからMT4の勉強を始める方は迷うことなく、紙本「メタトレーダー入門」と「メタトレーダー実践プログラミング」からスタートしてください。また、旧MT4をマスターした方にとっても、電子書籍版はあまり有用ではありません。内容は旧紙本入門編以下のレベルですし、大きく進展したObject関数の言及すらないありさまです。続刊を待たれるべきと考えます。


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ではなかろうか。