• 共通ライブラリまでの道のり

    今回、『メタトレーダー4&5共通ライブラリによるEA開発入門』(新メタトレ二刀流本)を出版したことを記念(?)して、メタトレーダーに振り回されてきた独自ライブラリ開発の歴史を振り返ってみます。

    • 2005年7月
      MetaTrader 4(MT4) リリース

    • 2008年1月
      FXメタトレーダー入門』出版

    • 2009年10月
      FXメタトレーダー実践プログラミング』出版
      オーダー系のライブラリを作成。オーダー時にエラー処理などを追加した関数をいくつかライブラリ化。コンパイルしたライブラリファイルと、関数プロトタイプ宣言を書いたヘッダファイルをセットで使う形。この方式はライブラリが複数のフォルダにまたがり、初心者が混乱するので、今回限り。

    • 2010年6月
      MetaTrader 5(MT5) リリース

    • 2013年12月
      FXメタトレーダー4&5一挙両得プログラミング』出版
      このとき、MT4は旧MQL4、MT5はネッティング口座のみで、全く互換性なし。ライブラリをMQL4用とMQL5用で別々に作成。MQL5でMQL4と同じポジション管理ができるように、仮想ポジションのライブラリを作成。それに合わせてMQL4もポジションごとにオーダー、ポジション情報取得関数をライブラリ化。ただし、今回はヘッダファイルのみ。

    • 2014年2月
      MT4 build 600 アップデート
      MQL4がMQL5に近づき、新MQL4となる。

    • 2014年12月
      メタトレーダーではじめるFXシステムトレードプログラミング』出版
      MQL4が新MQL4になって、テクニカル指標関数のクラスライブラリがMQL4、MQL5の両方で使えるようになったので、MQL4とMQL5でソースプログラムを共通にできるライブラリを作成。ライブラリ自体は、前回と同様、オーダーとポジション情報取得関数をヘッダファイルに。MQL5用のライブラリには、MQL4のみで対応している関数を追加。仕掛けシグナル、手仕舞いシグナルごとにヘッダファイルを作って、インクルードファイルを切り替えるという方式を「TempleteEA」としてを実験的に採用したが、結局この本でしか使わなかった。

    • 2015年11月
      新MT4対応 FXメタトレーダープログラミング入門』出版
      『FXメタトレーダー入門』の大幅改訂版(初めてのkindle版)

    • 2016年3月
      MT5がヘッジング口座に対応

    • 2017年3月
      新MT4対応ライブラリによるメタトレーダーEA実践プログラミング』出版
      前回のライブラリをMQL4用だけ抽出して、一つのヘッダファイルとして作成。シグナルを引数とするオーダー関数を追加。この本ではMT5については触れなかったが、MT5がヘッジング口座に対応したので、MQL5用のライブラリも同時に作ってあり、今回の共通ライブラリの原型はできていた。

    • 2019年11月
      メタトレーダー4&5共通ライブラリによるEA開発入門』出版
      前回のライブラリに、テクニカル指標関数の書式をMQL4に揃えるためのライブラリ(MQL5用)と、MT5のタイムフレームを使うためのライブラリ(MQL4)を追加して、今回の共通ライブラリを作成。



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

    現在、「MQL4/MQL5共通EAライブラリを使ってMT5で開発したEAをそのままMT4で動かす(仮・長すぎる)」みたいな本をkindle本として執筆中です。

    それでライブラリを見直していたところ、一つ不具合を見つけたので、修正版をアップしておきます。

    その不具合とは、本ライブラリをMT5で利用する際に、チャート上のバーの数とタイムフレームによっては、過去の4本値が正常に取得できないというものです。

    新しいライブラリファイルは、以下からダウンロードできます。

    他にもいくつか変更点はあるのですが、詳しい説明については、kndle本の完成をお待ちください(いつになることやら)。

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



  • MQL4/MQL5共通EAライブラリを使って月毎の損益を算出する

    MT5のストラテジーテスターでは、月毎の損益がグラフで表示されて便利なのですが、その損益のデータそのものをEAのプログラム中で参照することができません。

    ところでMT5では、OnTester()という関数を定義しておくと、バックテスト終了時にその関数を実行してバックテストの各種データを取得したり、適当に計算させたりした結果を「OnTester結果」として表示してくれます。(最適化の評価基準として使う場合、MT4でも利用できます。)

    これを使って月毎の損益を算出できないか、というのが今回の記事の目的です。

    そのために作ったわけではないのですが、拙作のMQL4/MQL5共通EAライブラリに次のような関数があります。

    //過去の総損益(金額)の取得
    double MyOrderTotalProfit(datetime from_date, datetime to_date, int pos_id=0)
    from_dateからto_dateまでの期間で、ポジション番号pos_idの取引の総損益を取得します。

    これを使うと、割と簡単に月毎の損益が算出できたのでご紹介します。

    まず、以下のように、共通EAライブラリを使った、とあるEAがあるとします。

    これに以下のコードを追加します。

    追加したコードを簡単に説明します。

    まず、OnInit()でEA開始時刻をStartTimeに取得しておきます。

    MonthlyProfit()関数では、EA開始時から何番目の月かを入力して、その月の損益を出力します。ここでは、最後に前述のMyOrderTotalProfit()を使うために、損益を求める期間をfrom_dateとto_dateに求めます。年と月を求めるためにちょっとした計算式がありますが、要はその月の1日から次の月の1日までを期間として設定しています。

    あとは、OnTester()関数中に月毎の損益を保存する配列profit[]を用意して、iを0から月数分変えて配列に代入します。profit[]をPrintさせているのは確認のためです。ここでは、profit[]を合計したものをreturnで返していますが、お好みに合わせて加工して使ってください。

    なおEAでは、テスト期間が終わったときのオープンポジションは強制決済されますが、上記のコードを使った月毎の損益には反映されません。合計した損益がEAの出力する総損益と異なることがあるので、注意してください。

    (追記)上のコード、そのままMT4でも動きます。バックテストのレポートにはOnTesterの結果は表示されませんが、OnTester()でPrintさせた月毎損益は操作履歴に表示されます。



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

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

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

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

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

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