• カテゴリー別アーカイブ 「新MT4対応ライブラリによるメタトレーダーEA実践プログラミング」
  • MQL4/MQL5共通EAライブラリ(171116版)

    新メタトレ実践本用のMQL4/MQL5共通EAライブラリを更新しました。

    iCustom()を使ったEAのプログラムがMT4とMT5で共通化できるようになりました。ライブラリファイルは、以下からダウンロードできます。

    使い方ですが、例えば、MT4、MT5にそれぞれ「HLBand」というカスタム指標が入っているとします。一定期間の高値と安値を結んだよくある指標です。簡単のため、期間をパラメータとし、モードが0で高値ライン、モードが1で安値ラインを返すものとします。

    長期のHLバンドをブレイクしたときにエントリー、短期のHLバンドをブレイクしたときにエグジットという典型的なブレイクアウトシステムのEAプログラムは、このライブラリを使うと次のように書けます。

    ここでiCustom()は、MQL4標準の書式で呼び出しています。このソースファイルが修正なしにMT5でコンパイルでき、EAとして実行できるようになったというのが、今回のライブラリの更新点です。

    ただiCustom()は、MQL5にも同じ関数があり、それぞれ可変長の引数を取るので、そのままオーバーライドすることができませんでした。ライブラリを見てもらうとわかると思いますが、iCustom()をiMyCustom()に読み替えて、iMyCustom()をパラメータが0個から8個まで個別に作成しています。

    なので、これを使うためには、以下の制約があります。

    1. カスタム指標のパラメータの数が8個まで
    2. カスタム指標のパラメータがint,doubleの数値のみ

    その他の注意事項は、過去の記事をご参照ください。

     



  • LibEA.mqhの仕様と使用上の注意

    前の記事で、MT4とMT5で同じソースのEAがコンパイル、実行できるというライブラリを紹介しました。

    そのライブラリ、LibEA.mqhというヘッダファイルですが、当然ながら、これをインクルードすれば、どんなEAでもMT4とMT5で動くというものではありません。

    ソースを共通化させるには、そのためのルールが必要です。MQL4の関数をそのまま使ってしまうと、それをMQL5に対応させるのは大変です。独自にライブラリ関数を作るのは、MQL4とMQL5との違いを吸収させるためです。詳しくは、「新MT4対応ライブラリによるメタトレーダーEA実践プログラミング」(新メタトレ実践本)をご参照ください。

    EAをプログラミングするにあたり、MQL4とMQL5とで、互換性に注意する必要があるのは、大きく以下の二つです。

    • 実際に発注するオーダー系の関数
    • 売買シグナル生成に利用するチャートの4本値とテクニカル指標関数

    オーダー系の関数の共通化


    オーダー系の関数は、MQL4では、ポジションオープンにOrderSend()、ポジションクローズにOrderClose()と別関数を使うのですが、MQL5ではOrderSend()だけしか使いません。

    この違いを吸収するために、MQL4とMQL5とで同じ名前の関数を用意します。例えば、ポジションオープンにMyOrderSend()、ポジションクローズにMyOrderClose()といった具合です。そして、それぞれの関数にMQL4、MQL5用のオーダー関数を書いておきます。

    オーダー系の関数は、MQL4用をLibOrder4.mqh、MQL5用をLibOrder5.mqhとして用意しておき、LibEA.mqhの中で、MQL4用にコンパイルする場合、LibOrder4.mqhをインクルードし、MQL5用にコンパイルする場合、LibOrder5.mqhをインクルードするようにします。

    こんな感じに書いておくと、拡張子がmq4のEAをコンパイルする場合、MQL4用に、拡張子がmq5のEAをコンパイルする場合、MQL5用に勝手にインクルードファイルを変えてくれるわけです。

    このようにオーダー系の関数は、MQL4とMQL5とで1対1に対応させられるので、共通化させるのはそう難しくはありません。

    チャートの4本値の共通化


    MQL4では、チャート上の値である売値、買値、4本値が、Bid, Ask, Open[], Low[], High[], Close[]のような定義済み変数として自動的に格納されています。

    しかし、MQL5では、これらの定義済み変数がありません。そこで、これらの変数をライブラリ中で宣言して、実行中に更新していくというコードを追加する必要があります。

    詳しいことは省略しますが、それをまとめて実行するためにOnTick()関数の最初にUpdatePosition()という関数を実行させるようにしました。つまり、OnTick()中に毎回、UpdatePosition()を書けばいいのですが、EAに共通のコードは極力EAには記述しないで、ライブラリにまとめようというのが、本書の方針なので、OnTick()関数をLibEA.mqh中に入れてしまいました。

    ここで、Tick()という関数を呼び出していますが、これの本体をEAに書いておくようにしました。なお、

    のようにライブラリをインクルードする前に「UseOnTick」を定義しておけば、EA中にOnTick()を書くことができるようになっています。

    テクニカル指標関数の共通化


    最後に問題となるのが、テクニカル指標関数です。テクニカル指標関数の呼び方はMQL4とMQL5とで大きく異なります。

    MQL4では、テクニカル指標の値が必要なところで、

    と関数を直接呼び出せばいいのですが、MQL5では、利用するテクニカル指標を宣言、テクニカル指標の値をバッファにコピー、バッファから必要な指標値を取り出す、と3段階の手順が必要となります。

    このままでは、オーダー系関数のように1対1に対応させることはできません。

    ラトルズから出版した黄色本のライブラリでは、MQL5の標準クラスライブラリが新MQL4でも使えることから、テクニカル指標クラスを使う方法で、MQL4とMQL5を共通化させました。

    しかし、今回の新メタトレ実践本では、MQL4用にはiMA()やiRSI()といった関数を直接使っているので、同じ書式のままMQL5でも使えるようにライブラリの方を工夫しました。

    MQL5でもiMA()とかiRSI()というMQL4と同じ名前の関数はあります。ただし、引数の数や戻り値の型が違うので、MQL4の関数と同じ書式で定義しても区別することができます。

    そこで、MQL4で使える29個のテクニカル指標関数に対して、何段階か必要な手順を、一度の呼び出しで実行できるような関数をLibMQL4.mqhというヘッダファイルに作っておきます。但し、iCustom()と、iMAOnArray()など配列に適用させるテクニカル指標には対応していません。

    あと、使い方で注意する点は、パラメータの異なる同じテクニカル指標の扱いです。

    MQL4では、テクニカル指標関数を呼び出すときにパラメータを指定するので、同じテクニカル指標関数でも、パラメータを自由に変えることができます。

    しかし、MQL5では、パラメータを決めて宣言するので、パラメータを変える度にテクニカル指標を宣言し直さなくてはいけません。ただ、テクニカル指標を作ったり、削除したりを繰り返すと、実行時間が相当遅くなってしまうので、このライブラリでは、パラメータが変わっても前のテクニカル指標は残しておいて、新にテクニカル指標を宣言するという方法にしました。

    同じテクニカル指標で何個の異なるパラメータに対応させるかは、

    の定数で指定します。パラメータの種類が8個よりも多くなる場合には、この値を大きくしてください。

    他にもいろいろありますが、ライブラリの仕様は今後変更になることもありますので、細かい点については省略します。



  • 新メタトレ実践本用のMQL4/MQL5共通ライブラリ(β版)

    皆さん、こんにちは。

    「新MT4対応ライブラリによるメタトレーダーEA実践プログラミング」(新メタトレ実践本)は、タイトルの通りMT4用の本なのですが、実は、MT5用のライブラリも作っておりまして、ライブラリを差し替えることで、MT5でも動くEAが作れたりするのです。

    MT5がもうちょっと流行れば、またkndle本にまとめたいとは思いますが、とりあえず、新メタトレ実践本の読者の方のために、サンプルプログラムを若干修正することでMT5でも動作するEAのライブラリを公開します。ただし、MT4とMT5でソースプログラムを共通にするにはいくつか制限があり、今後、仕様が変更になる可能性もあるので、β版としておきます。各自の責任でご利用ください。

    では、使い方です。まず、以下のファイルをダウンロードして本書のサンプルプログラムの入っているフォルダに展開してください。

    サンプルプログラムと同じフォルダには、「LibEA4.mqh」というヘッダファイルが入っていると思いますが、ダウンロードしたファイルを、これの代わりに使います。

    「LibEA.mqh」が共通のヘッダファイルで、MQL4の場合、「LibOrder4.mqh」をインクルードし、MQL5の場合、「LibOrder5.mqh」と「LibMQL4.mqh」をインクルードします。

    例えば、次のようなサンプルプログラムがあるとします。

    このままだと、MT4でしか動きませんが、2行目と8行目を次のように修正します。

    つまり、「LibEA4.mqh」を「LibEA.mqh」に変えて、「OnTick()」を「Tick()」に変えるだけです。この修正はすべてのサンプルプログラムに共通です。

    このファイルは、MT4で同じように動きます。そして、このファイルの拡張子を「mq4」から「mq5」に変えるだけで、MT5でコンパイル、実行させることができます。

    ソースプログラムを共通にする仕組みや、制限事項については、別記事で解説します。

     



  • kindle実践本のサンプルプログラムがMT4 Build1080でコンパイルできない理由

    先日発売しました『新MT4対応ライブラリによるメタトレーダーEA実践プログラミング』ですが、そのサンプルプログラムでコンパイルエラーが出て、コンパイルできない場合があります。

    ただし、これはMT4のBuildに依存するもので、Build1065以前のMT4では問題ありません。現在のところ判明しているのは、Build1080のMT4のみです。

    具体的には、コンパイル時に

    ‘i’ – variable already defined    LibEA4.mqh    67    15

    というエラーが表示されます。

    これは、本書ライブラリ「LibEA4.mqh」で発生しているエラーなので、このファイルをインクルードしているすべてのサンプルプログラムでエラーとなってしまうのです。

    このエラーの原因は既に明らかになっています。エラーの発生している箇所は以下の関数です。

    この関数では、

    というコードが2か所に書かれています。同じ関数の中で変数「i」が2か所で宣言されているので、2か所目でエラーが出ていると思われる方も多いでしょう。

    しかし、このファイルの最初に、

    #property strict

    と書かれているので、仕様が若干異なります。詳しくは、

    https://docs.mql4.com/mql4changes

    に説明されていますが、この場合、変数のスコープ(有効範囲)はブロックの中となります。ここでは、for文がひとつのブロックとなるので、それぞれのfor文で宣言した変数は、そのfor文の中だけで有効となります。そのため、各for文で変数を宣言しなくてはいけないのです。

    では、なぜ、Build1080からエラーが出るようになったのかというと、「LibEA4.mqh」に記述してあるにも関わらず、「#property strict」が無視されたからです。どうやら、コンパイルするファイルに直接「#property strict」が記述されていれば、有効なのですが、インクルードする別のファイルに記述しても無視されるようです。

    おそらくこれはバグだと思われますので、現在、メタクオーツ社に問い合わせをしています。今後のアップデートでこのバグが修正される可能性もありますが、もし、これがバグではなく、インクルードファイル中の「#property strict」は無視されるという仕様に変更されたという場合、サンプルプログラムの全部を修正する必要があります。

    具体的には、すべてのサンプルプログラム「*.mq4」の始めに「#property strict」を記述することになります。これは、kindle入門書のサンプルプログラムと同じなので、ご理解いただけると思います。

    もし、Build1080でサンプルプログラムをお試しになりたい方は、とりあえず、上記のようにプログラムを修正してお使いになることをお勧めします。

    今後のメタクオーツ社の対応や、アップデートの情報については、わかり次第ご報告いたします。

    [2017/05/17 追記]
    この記事の不具合はMT4の次のアップデートで修正されると、メタクオーツ社より返信がありました。

    [2017/05/21 追記]
    MT4 Build1090では、この記事の不具合は修正されています。kindle実践本のサンプルプログラムをお試しの方は、MT4 Build1090以降をご利用ください。

     



  • 『新MT4対応ライブラリによるメタトレーダーEA実践プログラミング』発売

    先日予告していましたメタトレーダープログラミングのkindle本がアマゾンで販売開始されました。

    今回、実践プログラミングの本ということで、既出の「FXメタトレーダー実践プログラミング」の改訂版のように見えますが、単なる改訂版ではありません。

    MQL4のプログラミングの入門を終えたばかりの人を対象としていますが、プログラミングのなかでも、EAのプログラムに絞り、カスタム指標のプログラムには触れませんでした。

    いくら詳しく説明しても、MQL4のプログラムは初心者にとっては難しいと思います。そこで、本書の独自ライブラリを使うことを前提として、できるだけ簡単にプログラミングできる方法を紹介しました。

    やはり、ライブラリを使うことでプログラムを簡単にすることができるのは、EAのほうです。また、ほんとに自分でプログラムを作れるようになるには、同じようなパターンの繰り返しが必須なので、EAに絞ることにしました。

    さらに、サンプルプログラムとその説明を読んでわかった気になるのではなく、自分でEAが作れるようになることを目標としたので、これまでの本とは異なり、例題と練習問題を交互に提示する形にしました。

    例題では、売買システムの仕様と、それをプログラミングするための説明をしたうえで、サンプルプログラムを示していますが、練習問題は売買システムの仕様と簡単なヒントのみです。解答例はありますが、例題がわかっていれば説明の必要はないということで、かなり突き放した構成となっています。

    このように、EAプログラミングを自分で勉強するための練習問題集のような内容なので、そういう人を応援するという意味で、アカデミック価格として500円で提供することにしたのです。

    今回もkindle本ということで、編集、校正など自前でやりましたが、表紙デザインだけは外注しました。最終的に「かっぱデザイン。」様に依頼しましたが、担当の方がMT4を利用されており、前作のkindle本もお読みになっていたということで、こちらのイメージにマッチしたデザインを作成してくださりました。素敵な表紙デザインありがとうございました!