• カテゴリー別アーカイブ 「メタトレーダーではじめるFXシステムトレードプログラミング」
  • MT5ヘッジ口座用ライブラリ

    皆さん、こんにちは。

    前回の記事でもちょっと触れましたが、MT5のヘッジオプション機能が正式にリリースされました。MT5でも、MT4のようにオーダー毎にポジションが建てられるようになったようです。

    以下が日本語のリリース記事です。(タイトルは意味不明ですが・・・)

    MetaTrader 5取引プラットフォームはヘッジを獲得しました

    記事によると、これでMT5への移行は問題ない、と言わんばかりの書き方ですね。しかし、ポジションの扱いは見た目上、MT4と同じにはなりましたが、肝心のプログラミングの部分は相変わらず、互換性のないままです。これでMT5への移行が進むとは考えにくいです。

    ところで、拙著の『メタトレーダーではじめるFXシステムトレードプログラミング』は、MT4とMT5で同じソースプログラムが使えますよ、という本だったのですが、そういう需要がなかったせいか、あまり売れてはいないようです。

    ただ、私がEA作成用に利用しているのがこのライブラリなので、今回、MT5のヘッジ口座で使えるようなライブラリを作成してみました。

    ライブラリは、拡張子がmqhのヘッダファイルとして作成されています。解凍してできたファイルをMT5のデータフォルダの「MQL5\Include\MyLib」の下にコピーしてください。一応、黄色本のサンプルプログラム一式がインストールされていることが前提です。

    ヘッジ口座用のEAを作成するには、プログラムの最初に「#define HedgeAccount」を追加するだけです。下のように「#include」の前に記述します。

    この状態でコンパイルすると、ヘッジ口座用のライブラリを組み込んで実行ファイルが作成されます。EAの使い方はこれまでと同じです。「StartHistory」「RetrieveHistory」といった余計な変数がなくなったので、逆に見やすくなったかと思います。

    なお、ライブラリ関数の仕様は、黄色本に掲載したライブラリ関数と同じです。詳しい使い方については、黄色本を参照していただきたいと思います。但し、例によって本ライブラリを使用したことにより生じるいかなる損害に対しても著者は責任を負いません。自己責任でのご利用をお願いいたします。



  • MT4ヘッダファイルのバグについて

    皆さん、こんにちは。今回は復刻ではなく、オリジナルの記事です。

    黄色本の読者の方からのご質問で判明しました、MT4のヘッダファイルのバグについてご報告します。

    黄色本のサンプルプログラムは、MT5とのソース互換性を保つために、MT4でもテクニカル指標にクラスライブラリを使っていたのですが、そこにトラップがありました。

    問題となるテクニカル指標はボリンジャーバンドです。通常、ボリンジャーバンドはiBands()という関数で取得するのですが、この関数の仕様がbuild600以降だと思うのですが、若干変わっています。

    以前は標準偏差の倍率を表すパラメータ「deviation」がint型で定義されていたのですが、最近はMT5に合わせてdouble型になっています。

    対応するクラスライブラリのヘッダファイルは、データフォルダの下の

    MQL4\Include\Indicators\Trend.mqh

    ですが、199行目に

    と書かれています。これをよく見ると、標準偏差の倍率を表すm_deviationがわざわざ(int)でキャスト(整数に型変換)されています。その結果、deviationが整数以外の場合、小数部分が切り捨てられてしまい、結果が変わってしまうという不具合が発生したようです。

    これを解決するには、下のように(int)を消すだけでOKです。ただ、MT4が提供するファイルを修正してもアップデートでまた戻ってしまう可能性もありますが・・・

    実はMT4のクラスライブラリは他にもおかしなところがあり、正式に対応しているわけではないのだと思います(ドキュメントも整備されていないし)。MT4のMT5化も何か中途半端で、相変わらずMQ社ののやり方は謎が多いですね。今のところ、MT5のことは考えない方がいいような気がしてます。



  • Kindle版の無料サンプルについて

    皆さん、こんにちは。

    最近、黄色本のKindle版が出たようなので、ご案内します。

    このサイトの左側のサイドバーにリンクを貼ってあります。そちらからご利用ください。

    ところで、今回、拙著のKindle版についてわかったことがあるので、ついでに報告しておきます。

    Kindle版はどれもそうなのかもしれませんが、無料サンプルをダウンロードすることができます。実は著書のKindle版って見たとこがなかったので、無料サンプル全部、ダウンロードしてみました。

    無料サンプルって冒頭の10ページくらいだろうと思っていたのですが、実際に見てみると、結構多かったです。Kindle版はページという概念がないのですが、紙の書籍に対応させると、次のようなページ数が無料サンプルとして提供されていました。

    黄色本:38ページ
    二刀流本:186ページ
    実践本:157ページ
    入門本:152ページ

    何ページまで無料で提供するかなんて、著者は全く関与していないので、おそらく出版社の意向なんでしょう。出版社によって結構差があります。

    最新の黄色本はラトルズさんですが、無料サンプルは、8分の1くらいです。

    ところが、その他のパンローリングさんの本は、無料サンプルをパラパラ見ていくと、どこまでも続くよ、これ買ったのかなと勘違いするくらいでした。実際、150ページ以上とほぼ3分の1のページ数が無料サンプルになっているのです。結構後半はレファレンスになっていたりするので、実質、本文の半分近くは無料で読めるんですね。びっくりしました。

    で、無料サンプルを見てよかったら、本を買ってください!と言いたいところですが、残念ながら最新の黄色本以外は、メタトレーダーやプログラミングに関する情報が古くなっています。いまだに時々質問を受けるのですが、その多くがメタトレーダーの仕様が変わってしまったためだったりします。

    改訂版を、というご要望もいただくのですが、今のところ、出版社からのオファーはありません。こうメタトレーダーのアップデートが頻繁に続くようでは、やはり紙の書籍では対応できません。以前の編集者さんからも電子書籍の方を勧められているくらいです。

    ということで、今後、もし改訂版を出すことがあれば、電子書籍になるかと思います。現在調査中ですので、何か決まりましたらご報告します。

    といっても、電子版なら、編集、出版まで全部一人でやるつもりなので、締切に迫られない分、いつになってもできないということになるかもしれません。気長にお待ちください。



  • EA実行中にテクニカル指標のパラメータを変えるには?

    移動平均やRSIなどのテクニカル指標には、期間や倍率などのパラメータが付き物です。

    システムの開発過程では、これらのパラメータの値を色々と変えてバックテストを繰り返すことがありますが、実際にEAとして運用する際には、各パラメータの値は固定することがほとんどです。

    今回の記事では、EAの実行中にテクニカル指標のパラメータを変化させることを考えてみます。

    パラメータの値を変える目的は色々あるでしょうが、ここでは、次のようなケースを想定します。

    パラメータの値を色々と変えてバックテストした結果、下の図のように評価値の高い範囲がある程度広がっているケース

    TesterOptgraphReport2015.05.09.1

    この図では20がベストですが、バックテストで最適な値が別の期間でも最適である保証はありません。その前後の値も候補として残しておきたいところです。

    もちろん、EAをたくさん起動できるのであれば、パラメータをそれぞれ変えて動かせばよいでしょう。しかし、たくさんのEAを動かせない場合や、パラメータの組み合わせの数が多すぎる場合には、すべての候補値を試すことはできません。

    そこで、EAの実行中にパラメータの値が定期的に変わるシステムで代用できないかと考えました。

    EAのサンプルとして、よくある2本の移動平均の交差によるシステムを取り上げてみます。

    仕掛けのプログラムは、黄色本78ページの「Include\MyLib\EntryMA2Cross.mqh」というヘッダファイルを参考にします。

    このプログラムでは、短期移動平均の期間「FastMAPeriod」を20、長期移動平均の期間「SlowMAPeriod」を40に固定してあります。

    これを、「FastMAPeriod」の値が19から21、「SlowMAPeriod」の値が34から36の中からランダムに選ばれるように変えてみます。

    変更する箇所は、テクニカル指標を初期化する条件です。

    今回は一定時間毎にパラメータを変化できるよう、テクニカル指標を設定した日時を記憶する変数「MACreateTime」を用意します。そして、これが0の場合か、直近の設定日時から一定時間経過した場合にテクニカル指標を初期化するようにします。

    そして、テクニカル指標の設定の際に、「FastMAPeriod」、「SlowMAPeriod」をMathRand()関数で算出してCreate()関数に渡します。

    これらの修正を加えた仕掛け関数EntrySignal()を次に示します。

    このプログラムでは、TimeCurrent()関数で現在の日時を求め、それが「MACreateTime」より一定時間(1週間の場合、60*60*24*7秒)大きくなったときにテクニカル指標の再設定を行っています。

    あと、決まった範囲の乱数の作り方は、MathRand()%3で、0,1,2のいずれかの数を返すので、それに一番小さい候補値19を足すだけです。これで19,20,21のいずれかの数がパラメータとしてセットされます。

    このファイルを「EntryMA2CrossRand.mqh」とすると、全体のEAのプログラムは次のようになります。

    ここでひとつ注意することは、乱数の初期化です。

    MathRand()で生成される乱数は、でたらめな並びで現れるように見えますが、実際には非常に長い周期の数列です。なので、乱数をスタートさせる位置が同じなら、同じ乱数列が出てきます。

    それを防ぐために、乱数のスタート位置を変える必要があります。そのための関数がMathSrand()です。引数に毎回違う数値が入るようにすれば、乱数のスタート位置を毎回変えることができます

    ここでは、システム起動時からの経過時間をmsで返す関数GetTickCount()を使っています。MathSrand()をEAの最初、つまり、OnInit()関数中に記述しておけばOKです。

    このEAを実行すると、1週間毎にパラメータの値がランダムに変化していくことになります。

    ただし、このEAをストラテジーテスターでバックテストすると、毎回違う結果が出てくることになります。評価が難しいかもしれませんが、テストする期間を変えても極端に悪いケースが出てこなければ、まあ合格といったところではないでしょうか。


  • MT4のチャートをメールで送るには?

    皆さん、こんにちは。

    私はあまり使わないのですが、価格やテクニカル指標の変化、トレードの結果などをメールで知らせたいという人は多いようです。その際に、チャートのスクリーンショットを一緒にメールで送りたい場合どうすればよいか、というご質問をいただきました。

    まず、チャートのスクリーンショットですが、MQL4にMT4のチャートのスクリーンショットをファイルとして保存するWindowScreenShot()という関数があります。

    これは、引数を6個取りますが、プログラムを挿入したチャートのスクリーンショットをそのまま取る場合は、後半3個は省略可能です。

    必要な引数は、ファイル名、画像の横幅(ピクセル)、画像の縦幅(ピクセル)の三つです。例えば、640×480のサイズの「chart.gif」というファイルとして保存したい場合、

    と書けばOKです。このファイルはMT4のデータフォルダの下の「MQL4\Files」のサブフォルダに保存されます。

    次にこのファイルを添付メールとして送る方法です。

    MQL4にはSendMail()というメール送信する関数が組み込まれています。ただし、SendMail()はテキストファイルを送る機能しかないので、これを使って添付ファイルを送るには、画像ファイルをテキストに変換するなど面倒な処理が必要となります。

    そこで、今回は外部ソフトを使って対応することにしてみます。色々と調べたところ、フリーソフトの「smail」というのが利用しやすいようです。すでにこの手のtipsとしてブログ記事になっているものもあるので、これが無難なところだと思います。

    smailを使うには、ソフトのインストールおよび、設定が別途必要となります。ソフト自体は以下のページからダウンロードできます。

    http://dip.picolix.jp/disp2.html

    現在の最新バージョンは、「smail-v4.18.zip」です。

    これをダウンロードして解凍すると、いくつかファイルが出てきます。このソフトは特にインストールの作業は必要ありません。実行に必要なファイルは、「smail.exe」と「smail.ini」なので、この二つのファイルを適当なフォルダの下にコピーするだけです。

    ここでは、「C:\smail」 の下にコピーしておきます。

    smailを実行すると、下のような初期設定画面が表示されます。

    Image1

    ここで、SMTPサーバの部分を設定します。設定の仕方については、お使いのプロバイダのサポートや、smailに付属の設定参考資料などをご参照ください。

    正常に設定されたかどうかは、コマンドプロンプトから次のようなコマンドを実行します。

    smail 送信先アドレス -hメールサーバ -f発信元アドレス -sメール件名 -Tメール内容

    smailをダウンロードしたページに具体例が記載されているので、そちらを参考にしてください。とりあえず、これでメールが正常に送れることを確認しておきましょう。

    smailの設定が完了すれば、いよいよMT4のプログラムとなります。ここでは、動作確認のためにスクリプトとして作成してみます。

    OnStart()関数では、「メールの件名」、「メールの内容」、「添付ファイル名」をそれぞれstring変数に代入します。そして、WindowScreenShot()でチャートのスクリーンショットをファイルとして保存します。

    その後、独自に定義したMySendMail()関数に、メールの件名、メールの内容、添付ファイルを指定して呼び出せば、チャート画像を添付ファイルとしたメールが送られるというわけです。

    MySendMail()関数では、smailのコマンド名、メールサーバ、発信元アドレス、送信先アドレスを指定して、先ほどコマンドプロンプトで動作確認したのと同じようなコマンドを実行します。添付ファイルについては、「-a」オプションに指定するだけなので簡単です。

    ただし、smailのような外部プログラム実行には、ShellExecuteW()という関数を通す必要があります。これはMQL4の関数ではなく、Windowsに入っている shell32.dll というライブラリ中の関数です。このあたりの詳しいことは省略しますが、プログラムの始めの#import のところでShellExecuteW()が使えるよう設定されていると思ってください。

    なお、外部DLLを使うということで、MT4の設定が必要となります。以下のようにMT4の[ツール]メニューの[オプション]ー[エキスパートアドバイザー]のタブの画面で、「DLLの使用を許可する」にチェックを入れておいてください。

    Image3

    このスクリプトをチャートに挿入すれば、そのチャートの画像ファイルをメールに添付して送ることができます。あとは、EAに組み込むなど色々と試してみてください。