• カテゴリー別アーカイブ ダウンロード
  • MQL4/MQL5共通EAライブラリ(181031版)

    今週、MT5がbuild1930にアップデートされました。(現在、build1932です。)

    それに伴い、新メタトレ実践本用のMQL4/MQL5共通EAライブラリをMT5で利用する場合、テクニカル指標関数の戻り値が常にEMPTY_VALUEとなってしまう不具合が発生しました。

    そこで、その不具合を修正した対応版をアップロードします。ライブラリファイルは、以下からダウンロードできます。

    ライブラリ関数の仕様、およびライブラリの使用方法に変更はありません。以下の記事をご参考にしてください。

    なお、MT4用のライブラリには修正はありませんので、MT4でご利用の方はライブラリ更新の必要はありません。



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

    今週、MT5がbuild1860にアップデートされました。(現在、build1861です。)

    それに伴って、新メタトレ実践本用のMQL4/MQL5共通EAライブラリがそのままでは使えなくなったので、取り急ぎ対応版をアップロードします。ライブラリファイルは、以下からダウンロードできます。

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

    1. iOpen(), iLow(), iHigh(), iClose(), iTime(), iVolume(), iHighest(), iLowest(), iBarShift()の各関数がMQL5でサポートされたため、LibMQL4.mqhから削除しました。
    2. LibOrder4.mqhとLibOrder5.mqhに次の関数を追加しました。
      //過去の総損益(金額)の取得
      double MyOrderTotalProfit(datetime from_date, datetime to_date, int pos_id=0)
      from_dateからto_dateまでの期間で、ポジション番号pos_idの取引の総損益を取得します。
    3. #define UseOrderComment を記述し、以下の関数を定義することにより、各注文のコメントをマジックナンバー以外に設定できるようにしました。
      string MagicToComment(long magic)
      使用方法については、別の記事で説明します。
    4. 許容スリッページ SlippagePips を#defineでも設定できるようにしました。

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

    以上です。



  • MT5のタイムフレームをMT4で使うためのMQL4/MQL5共通EAライブラリの拡張

    MT4とMT5の違いの一つに、タイムフレームの数があります。

    MT4で対応しているタイムフレームは、M1,M5,M15,M30,H1,H4,D1,W1,MN1の9個ですが、MT5ではさらに M2,M3,M4,M6,M10,M12,M20,H2,H3,H6,M8,M12 の12個が追加されています。

    そんなにたくさんのタイムフレームをどう使い分けるのか、という疑問もありますが、ネットで調べると、MT4で対応していないタイムフレームを使おうとする記事がいくつか見つかります。全く需要がないわけでもなさそうです。

    筆者は基本的にMT5でEAを開発して、それをMT4で動かしています。そのため、どちらでも同じソースプログラムが使えるようにと、MQL4/MQL5共通EAライブラリを作りました。

    ただ、MT5で色々とタイムフレームを変えてみて、例えば、10分足がいいかなと思っても、MT4では10分足に対応していないので、そのままでは動きません。

    MT4でも、1分足データから10分足データを作って、オフラインチャートから強引にEAを動かすということもできるようですが、あまり面倒なことはしたくありません。

    今回の記事では、拙作のMQL4/MQL5共通EAライブラリに追加してインクルードするだけで、MT5のタイムフレームをMT4で使えるようにする方法を紹介します。

    まずは、「新メタトレ実践本用のMQL4/MQL5共通ライブラリ(β版)」で取り上げたEAのプログラムです。

    このEAは、ファイルの拡張子を「mq4」にすればMT4で、「mq5」にすればMT5でコンパイルし、動かすことができます。ただし、チャートに挿入したタイムフレームのテクニカル指標を使うので、MT4では対応している9種類のタイムフレームしか使えません。

    チャートのタイムフレームと関係なく、決まったタイムフレームのテクニカル指標を使いたい場合、iMomentum()関数の2番目の引数にタイムフレームの定数を代入します。例えば、10分足にしたければ、次のようにします。

    MT5は10分足に対応しているので、この変更だけで10分足のテクニカル指標を使うことができます。ただし、MT4の場合、コンパイルは通るのですが、10分足に対応していないので、iMomentum()の値は常に0になってしまい、EAとして機能しません。

    そこで、新たに作った次のヘッダファイルをインクルードしてみます。

    あと、iMmentum()関数の最初の引数「_Symbol」と、4番目の引数「PRICE_CLOSE」を削除してみます。全体のコードは次のようになります。

    変更箇所は2行のみですが、このプログラムだと、MT4、MT5両方で、10分足のテクニカル指標を使ったEAとして機能します。

    ただし、このライブラリはまだβ版ですので、今後変更になる可能性が高いです。またどんなテクニカル指標でも対応できるわけではなく、色々と制約があります。そのあたりについては、ライブラリの仕組みと関係するものですので、別の機会に解説したいと思います。



  • 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です。