• 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でご利用の方はライブラリ更新の必要はありません。



  • 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のストラテジーテスターのモデルについて

    相変わらず、MT5のブレイクする兆しは感じられないGWです。皆さん、お元気ですか?

    今回の記事は、そんななかでも、MT5のバックテストについてです。

    まず、MT4のストラテジーテスターでは、モデルとして「始値のみ」、「コントロールポイント」、「全ティック」の3つが用意されています。

    確定したバーの値のみを利用するEAでは「始値のみ」、最新のバーの値を利用するEAでは「全ティック」を選ぶのが普通です。「コントロールポイント」は、一つ下のタイムフレームまで使うモデルですが、なんか中途半端な感じで、個人的にはあまり使っていません。

    一方、MT5では、ストラテジーテスターのモデルは、「始値のみ」、「1分足OHLC」、「全ティック」、「リアルティック」の4つが用意されています。もう一つ「数値計算」というのがありますが、これはバックテスト用のモデルではありません。

    これらのモデルの詳細については、メタクォーツ社の以下の記事に詳しく説明されていますので、そちらをご覧ください。

    メタトレーダー5における検証の原則
    実際ティックでの取引ストラテジーのテスト

    ここで、「始値のみ」と「全ティック」はMT4と同じなので、MT4と同じように考えればよいでしょう。「リアルティック」はMT4にはなかったもので、実際のティックの履歴を使い、テストの精度も高いのですが、ティックの履歴はそんなに長く保存されるものではないので、テストする期間が長くなると品質が下がるという問題があります。

    そこで、残った「1分足OHLC」はどうか?というのが、今回のテーマです。

    「1分足OHLC」は、その名の通り、1分足の4本値を使うモデルです。参照するデータが少ない分、「全ティック」に比べると何十分の1かの時間でテストできます。最適化など何度もテストを繰り返す場合、テスト時間は圧倒的に短くなるというメリットがあります。ただ問題なのはテスト精度です。

    「1分足OHLC」のモデルでは、価格がO-L-H-C、あるいはO-H-L-Cと4段階でしか変化しないので、LとかHの値で約定することがあります。特に逆張りのEAの場合、実際の約定価格より有利な価格で約定することになり、当然ながらテストの結果も全ティックよりよくなります。

    ただし、その結果の違いは、EAの売買ロジックに大きく依存します。

    例えば、同じEAを「1分足OHLC」と「全ティック」のモデルでバックテストしたときに、取引回数が大きく違う場合、「1分足OHLC」はあまり参考になりません。1分間に何度もトレードをするEAなので、「全ティック」、あるいは「リアルティック」を使うべきでしょう。

    もし「1分足OHLC」と「全ティック」で取引回数に大きな違いがない場合、「1分足OHLC」の結果から「全ティック」の結果を推測できる可能性があります。

    ここに、とあるEAがあり、「1分足OHLC」と「全ティック」のテスト結果が次のようになったとします。

    • 「1分足OHLC」の結果
    • 「全ティック」の結果

    これを見ると、総損益は「1分足OHLC」が13734ドルに対して、「全ティック」は6437ドルと半分以下になっています。やはり、「1分足OHLC」では、実際より有利な価格で取引されているようです。ただし、取引回数は475回と478回で大差ありません。損益の減った分が取引回数に比例していれば、「1分足OHLC」の結果から「全ティック」の結果が推測できるかもしれません。

    このEAは、EUR/USDを1取引あたり1ロットで売買させています。(13734-6437)/475=15.36より、平均すると、1取引につき15.36ドルほど損益が多く計算されていることになります。pipsで表すと、1.536pipsです。

    ただ、この値はEAの売買ロジックや業者にも依存します。ここでは詳細なデータは省略しますが、同じEAで試したところ、テスト期間によっては、1.5pipsから2.0pipsの範囲で変化するようでした。

    そこで、1取引あたり、2.0pipsほど損益を減らすようバックテストの総損益を補正してみます。そのために、テストしたいEAのプログラム中に、次のようなOnTester()という関数を作っておきます。

    これは、総損益から取引数×ロット数×20を引いて補正するものです。この結果は、バックテスト後の「OnTester結果」のところに表示されます。


    これを見ると、4233.64となっています。補正するにしても、1.5pipsから2.0pipsと幅があるので、当然ながらある程度の誤差はやむを得ません。ただ、そのEAのだいたいの良し悪しが短時間で評価できるのであれば、まあ使い道はあるのではないかと思います。

    皆さん、よいGWを。