• カテゴリー別アーカイブ 「新MT4対応ライブラリによるメタトレーダーEA実践プログラミング」
  • 「新MT4対応ライブラリによるメタトレーダーEA実践プログラミング」更新しました

    皆さん、こんにちは。

    『新MT4対応 FXメタトレーダープログラミング入門』に引き続き、『新MT4対応ライブラリによるメタトレーダーEA実践プログラミング』も更新を行いました。

    一応、MT4 Build 1090対応ということで更新を行いましたが、本書の場合、初版で対象にしていたMT4のビルドから画面回りはあまり変わっていないことと、EAのプログラムで修正の必要な部分はなかったことより、内容的にはほとんど変わっていません。何カ所か言い回しを変えた程度です。

    ただ、Build 1090と関係なく追加した部分が、2カ所あります。

    一つは本書ライブラリに連続勝敗数と損益を取得するMyOrderConsecutiveWins()、MyOrderConsecutiveProfit()という関数を追加した点です。

    もう一つは、別途ライブラリの差し替えと数行のコードの変更で本書サンプルプログラムがMT5で動作可能であるという記述を追加した点です。ただし、具体的な変更方法は本書には記載せず、あくまで本ブログで紹介した以下の記事へのリンクのみです。

    MQL4/MQL5共通EAライブラリ(180128版)

    本日以降、新規に購入された方には更新版が配信されています。既に購入済みの方で、更新版が必要な方は、お手数ですが以下の記事をご参考にしてアマゾンまでご連絡ください。

    Kindle電子書籍の改訂版を入手してみた」(青木宣明のブログ)

    なお、更新版では、最初の免責事項のページと最後の著者紹介のページに、MT4 Build 1090対応と記載されています。ご確認ください。



  • MQL4/MQL5共通EAライブラリ(180128版)

    新メタトレ実践本用のMQL4/MQL5共通EAライブラリを更新しました。ライブラリファイルは、以下からダウンロードできます。

    基本的な使い方は変わっていません。以下の記事をご参考にしてください。

    ライブラリ関数の変更点、追加点は以下の通りです。

    1. LibMQL4.mqhの各テクニカル指標関数で、timeframeが0のときに、プログラム実行途中で時間枠を変更してもテクニカル指標の時間枠が変更されないという不具合を修正しました。
    2. LibMQL4.mqhにiBarShift()関数を追加しました。これはMQL4の組込み関数と同じ仕様ですが、あまり効率のよい実装ではないので、多用すると時間がかかります。
    3. LibOrder4.mqhとLibOrder5.mqhに次の二つの関数を追加しました。
      //前回までの連続損益(金額)の取得
      double MyOrderConsecutiveProfit(int pos_id=0)
      //前回までの連続勝敗数の取得
      int MyOrderConsecutiveWins(int pos_id=0)
      連勝した数や連勝によって積みあがった利益を取得します。連敗の場合はマイナスの値になります。

    以上です。



  • MQL4/MQL5共通EAライブラリ(171202版)

    新メタトレ実践本用のMQL4/MQL5共通EAライブラリを更新しました。ライブラリファイルは、以下からダウンロードできます。

    今回変更したのは、MQL5でMQL4と同じ形式でテクニカル指標関数を使えるようにする LibMQL4.mqh です。オーダー系のライブラリは修正していません。

    MQL4からMQL5への対応は、ちょっと無理やりなところがあるので、MQL5で動かす際に不具合が生じることがあります。そのため、各テクニカル指標関数でエラーが生じたときに、エラーメッセージを出力させるようにしました。

    今回のライブラリの改訂で、カスタム指標プログラムをMQL4とMQL5で共通化させることができました。ただし、テクニカル指標関数を使った簡単なものだけです。

    以下のプログラムは、ボリンジャーバンドの関数を使ったカスタム指標プログラムの一例です。一応、このソースファイルのまま拡張子をmq4とmq5にすることで、それぞれMT4、MT5でコンパイル・実行させることができます。

    kindle本の新MT4入門書で解説したカスタム指標プログラムと書き方が異なるところを説明しておきます。

    MQL4では、指標の種類の指定はラインの場合不要でしたが、MQL5では必須となるので追加してあります。MQL4の過去のアップデートでも、指標の種類の指定をしないと表示が不安定になることがあったので、入れておいた方がいいでしょう。

    LibMQL4.mqh はMQL5の場合のみ必要となります。MQL4でそのファイルがなくてもエラーが出ないように、MQL5の場合のみ LibMQL4.mqh をインクルードするようにしています。

    指標バッファ用の配列を時系列配列に設定する命令で、MQL5では必須です。MQL4の場合、デフォルトで時系列配列になっているので、この行は不要です。

    指標を表示する範囲のための変数で、チャートの書き始めの部分でBandsPeriodだけずらしてあります。こうしておかないと、MQL5では何も表示されないことがあります。MQL4では、この行はなくても構いません。

    MQL5では、指標ハンドルを作成するコードと、指標を配列にコピーするコードを別タイミングで行うことを想定しているようですが、本ライブラリでは同じタイミングで行っています。そのためか、プログラムをチャートに挿入した直後で指標値が計算されないことがあります。今回のライブラリの改訂で、指標値が計算されていない場合、EMPTY_VALUEという値を返すようにしました。このエラーを無視してしまうと、最新のバーにしか指標が表示されないことがあるので、指標値が計算できていない場合、指標を表示できていないということで、0を返すようにしています。MQL4では不要です。

    とりあえず、単純にテクニカル指標関数のみを使うカスタム指標プログラムは、以上の点に注意することで、MQL4/MQL5でコードを共通にすることができます。

    あと、よくある書き方として、表示用の指標バッファとは別に計算用の指標バッファを使うケースがあります。ただ、この場合、MQL4とMQL5でコードの書き方が決定的に違うので、今のところコード共通化の対応はできません。ご了承ください。


    *追記*(2017-12-04)
    48行目で、limitをlimitとrates_total-BandsPeriodの小さい方に設定し直す命令は、プログラムをチャートに挿入した直後(limit=rates_totalになっているとき)にチャートの開始位置をずらすためのものなので、次のように書いてもOKです。

    厳密には、チャートの最初からBandsPeriod-1だけずらせばよいので、

    あるいは、

    でもOKです。

     



  • 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個よりも多くなる場合には、この値を大きくしてください。

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