• カテゴリー別アーカイブ 「FXメタトレーダー4&5プログラミング」
  • メタトレ二刀流本のサンプルプログラムをMT5ヘッジ口座で動かす

    最近、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」のみです。次のように古いヘッダファイルの行はコメントアウトするか、削除して、新しいヘッダファイルに変更します。

    なお、ヘッダファイルをMT5のIncludeフォルダに入れて共通に使う場合、

    とします。

    2. 不要となる行(コメントアウト、あるいは削除)

    以下の行は不要となるので、コメントアウトするか、削除して結構です。

    マジックナンバーについては、EA中に記載しなくても、ライブラリで自動的に宣言されるので、それを変更してもいいです。EAで決まった値にしたければ、次のようにヘッダファイルをインクルードする前に、#defineで定義しておきます。

    Open[], Close[], High[], Low[]などの四本値の配列や、売値、買値のBid, Ask、ポジションの管理もライブラリで自動的に行われます。その代わり、OnTick()関数ではなく、Tick()関数(これもライブラリ中に定義してあります)を呼ぶように変更します。

    3. オーダー関数の変更

    オーダー関数のMyOrderSend()関数は、引数の数と順番が変更になっています。引数は、売買の種類、売買ロット数、売買価格、ポジション番号の順になっているので、次のように変更します。

    SLやTPの指定は、オーダー送信時ではなく、オーダー送信後にMyOrderModify()関数で行うようになりました。SLやTPを指定したい場合は、次のようにMyOrderSend()とMyOrderModify()に分けて記述します。

    各ライブラリ関数の詳しい仕様については、新メタトレ実践本を参照してください。

    以上の修正を施したサンプルプログラムとライブラリファイルは、以下からダウンロードできます。ただし、このサンプルプログラムを実行することにより発生した障害、損失などについて、当方は一切の責任を負いかねますので、あらかじめご了承ください。



  • 新MQL4のカスタム指標をMQL5に移植する

    皆さん、こんにちは。

    最近、MT5に関してちょっとした動きがありました。こちらのMetaQuotes社の記事です。

    MetaTrader 5にポジション計算のヘッジシステムが追加されました

    MT5はもともと同じ通貨ペアのポジションを合算して一つのポジションとして扱う方法を取っていました。これがMT4からの移行が進まない要因の一つでしたが、これを改め、MT4と同じようにオーダー毎にポジションが建てられるようにするオプションが追加されるそうです。

    まだベータ版で、正式な対応にはもう少し時間がかかるでしょうが、動向を注視したいと思います。これを早くやってくれれば、あの七面倒くさいライブラリ作らなくて済んだのに・・・

    ところで、今回の記事は上記のMT5の動きとは直接は関係ありません。新MQL4のプログラムをMQL5に移植する際の注意点についてお話しします。

    まず、『新MT4対応 FXメタトレーダープログラミング入門』に掲載しているカスタム指標のサンプルプログラムの簡単なものを見てみます。

    これは、各バーにおける4本値の平均をプロットするカスタム指標です。特に意味はありません。

    これをMQL5に移植してみましょう。まずは、ファイルの拡張子を「mq4」から「mq5」に変えてMT5のデータフォルダの「MQL5\Indicators」の下にコピーします。すると、MT5のメタエディターで開くことができるので、そのままコンパイルしてみましょう。

    すると、こんなエラーが出ます。

    ‘Open’ – undeclared identifier
    ‘High’ – undeclared identifier
    ‘Low’ – undeclared identifier
    ‘Close’ – undeclared identifier

    MQL4では、4本値の配列が「Open[]」「High[]」「Low[]」「Close[]」という配列としてあらかじめ定義してあるので、それをそのまま使えばよかったのですが、MQL5ではそれがありません。

    ここでは、OnCalculate()関数の引数となっている「open[]」「high[]」「low[]」「close[]」という配列が4本値の配列に対応しているので、「Open→open」「High→high」「Low→low」「Close→close」のように変えます。

    これをコンパイルすると、エラーはなくなりました。実行ファイルはできているので、適当なチャートに挿入して実行してみましょう。でも、何も表示されません。そこでコンパイルの画面に警告メッセージが出ているところに注意してください。

    no indicator plot defined for indicator

    指標プロットが定義されていないということのようです。実は「#property」命令がMQL4とMQL5でちょっと異なっていて、MQL5ではプロットする指標の数を「indicator_plots」で指定しなくてはなりません。またもう一つ、指標の種類も「indicator_type1」で指定する必要があります。ラインの場合、「DRAW_LINE」を使います。これらを追加すると、次のようになります。

    これをコンパイルすると、エラーも警告も出ません。そこで、これをチャートに挿入すると、ラインが表示されます。これで移植完成かと思いきや、しばらくチャートを見ていると新しいバーのラインが更新されません。

    USDJPY.mM1
    これは、指標バッファ用の配列がMQL4とMQL5で異なっているためです。MQL4では指標バッファ用配列は最初から「時系列配列」になっていますが、MQL5ではそうではなく、時系列配列にするためにArraySetAsSeries()関数を実行しなくてはなりません。これを「Buf」だけでなく、4本値配列の「open」「high」「low」「close」に適用すると、次のようになります。

    これで移植完成です。どうでしょうか?MT4からMT5への移行の道のりはまだまだ長そうな気がします。

    なお、新MQL4の詳しいことは、こちらの書籍をご参照ください。

    『新MT4対応 FXメタトレーダープログラミング入門』



  • Kindle版の無料サンプルについて

    皆さん、こんにちは。

    最近、黄色本のKindle版が出たようなので、ご案内します。

    このサイトの左側のサイドバーにリンクを貼ってあります。そちらからご利用ください。

    ところで、今回、拙著のKindle版についてわかったことがあるので、ついでに報告しておきます。

    Kindle版はどれもそうなのかもしれませんが、無料サンプルをダウンロードすることができます。実は著書のKindle版って見たとこがなかったので、無料サンプル全部、ダウンロードしてみました。

    無料サンプルって冒頭の10ページくらいだろうと思っていたのですが、実際に見てみると、結構多かったです。Kindle版はページという概念がないのですが、紙の書籍に対応させると、次のようなページ数が無料サンプルとして提供されていました。

    黄色本:38ページ
    二刀流本:186ページ
    実践本:157ページ
    入門本:152ページ

    何ページまで無料で提供するかなんて、著者は全く関与していないので、おそらく出版社の意向なんでしょう。出版社によって結構差があります。

    最新の黄色本はラトルズさんですが、無料サンプルは、8分の1くらいです。

    ところが、その他のパンローリングさんの本は、無料サンプルをパラパラ見ていくと、どこまでも続くよ、これ買ったのかなと勘違いするくらいでした。実際、150ページ以上とほぼ3分の1のページ数が無料サンプルになっているのです。結構後半はレファレンスになっていたりするので、実質、本文の半分近くは無料で読めるんですね。びっくりしました。

    で、無料サンプルを見てよかったら、本を買ってください!と言いたいところですが、残念ながら最新の黄色本以外は、メタトレーダーやプログラミングに関する情報が古くなっています。いまだに時々質問を受けるのですが、その多くがメタトレーダーの仕様が変わってしまったためだったりします。

    改訂版を、というご要望もいただくのですが、今のところ、出版社からのオファーはありません。こうメタトレーダーのアップデートが頻繁に続くようでは、やはり紙の書籍では対応できません。以前の編集者さんからも電子書籍の方を勧められているくらいです。

    ということで、今後、もし改訂版を出すことがあれば、電子書籍になるかと思います。現在調査中ですので、何か決まりましたらご報告します。

    といっても、電子版なら、編集、出版まで全部一人でやるつもりなので、締切に迫られない分、いつになってもできないということになるかもしれません。気長にお待ちください。



  • MT4のバックテストレポートの最大ドローダウンについて

    MT5は、MT4に比べてバックテストで出力されるレポートの項目が多いのが自慢(?)です。例えばこんな感じです。


    ↑MT4のレポート


    ↑MT5のレポート

    MT5では、最大ドローダウンが残高ベースと証拠金ベースと別々に算出されるようになったり、リカバリーファクター、シャープレシオなど新しい指標が増えました。ほかにも、時間毎、曜日毎、月毎の損益グラフなども表示されるようになりました。

    これらのレポート項目は、MQL5の TesterStatistics() という関数で取得できます。使用例は「FXメタトレーダー4&5プログラミング」の423ページにあります。これは、OnTester()関数中でTesterStatistics()を使ってシステムの評価値をカスタマイズする例です。

    OnTester()関数は、ストラテジーテスターの最適化の際には、その戻り値がシステムの評価値となります。ただし、最適化をせずに単にバックテストだけする場合でも、最後にOnTester()関数が実行されます。

    例えば、以下のようなコードをEAに追加してバックテストさせます。

    すると、操作ログの画面で以下のような出力が確認できます。
    Image4

    MT4も最近のアップデートでMT5化が進んでおり、OnTester()や、TesterStatistics()が使えるようになっています。そこで、MT4のEAで上記のOnTester()を追加してバックテストしてみます。

    すると、以下のように出力されました。
    Image8

    これを見ると、リカバリーファクターやシャープレシオなど、MT4のレポートに含まれていない指標は0となっています。ところが、最大ドローダウンは、残高ベースと証拠金ベースの両方が出力されています。

    では、MT4のレポートで出力されている最大ドローダウンはどっちかということですが、値を比べてみると、507.8となっているので、どうやら証拠金ベースの最大ドローダウンのようです。

    私の記憶によると、MT4のレポートで出力される最大ドローダウンは残高ベースだったはずなので、仕様が変わったのかもしれません。

    いずれにしろ、MT4のバックテストでは、レポートに出力されない最大ドローダウンについても算出されているようです。そのうち、MT5のレポートでしか出力されない項目についても、MT4で出力されるようになるかもしれません。



  • 本書オリジナルライブラリーのアップデート

    皆さん、こんにちは。

    「FXメタトレーダー4&5一挙両得プログラミング」(本書)のオリジナルライブラリーアップデートのお知らせです。

    読者の方からのご指摘で気が付いたのですが、本書のサンプルプログラムのうち、343ページ以降の「待機注文による仕掛け」に掲載されているEA(MQL4版)を、特定の業者(判明しているのはOANDA)のMT4で動かすと不具合が生じる可能性があります。

    具体的には、待機注文が約定した場合、ポジションがなくなったと判断され、さらに待機注文が入ります。そして、さらに約定を繰り返すと、オープンポジションがPOSITIONSで指定した数以上に作成されてしまいます。

    これは、OANDAのMT4で、待機注文のチケット番号と、それが約定してできたポジションのチケット番号が異なっているためです。(他のほとんどの業者では待機注文のチケット番号は約定しても変わりません)

    取り急ぎ、本書オリジナルライブラリーを修正したものを公開しますので、問題がある場合にはダウンロードして差し替えてください。

    なお、同じ待機注文を扱うEAでもMQL5版では特に問題はありません。またOANDA以外で同様な不具合は確認されていません。

    ダウンロードして解凍すると、「MyPosition.mqh」というファイルが現れるので、そのファイルをMT4のデータフォルダにコピーしてください。

    コピーするフォルダの場所は、

    MT4 build509以前の場合:

    MT4をインストールしたフォルダの下の\experts\include フォルダ

    MT4 build600以降の場合:

    メニューの[ファイル]―[データフォルダを開く]で開いたフォルダの下の\MQL4\Includeフォルダ

    です。