• カテゴリー別アーカイブ 「FXメタトレーダー4&5プログラミング」
  • 読者からの質問に対する回答

    パンローリングのブログから質問が寄せられていたのですが、返信メールが届かなかったようなので、こちらでお答えします。

    「FXメタトレーダー4&5一挙両得プログラミング」(本書)に掲載されていたプログラムを入力しても動かないという内容です。

    本書に掲載されているプログラムをそのまま入力されるのは避けた方がいいかと思います。理由としては、

    • 間違えて入力してしまう。
    • プログラムを書籍に組み入れる際に編集者が改行するなど手を加えてしまい、そのままでは正しく動かない場合がある。

    などがあります。

    とりあえず、プログラムを試したい場合は、本の内容を直接入力するのではなく、出版社のサイトに公開されているプログラムをダウンロードして、それをMT4やMT5にコピーすることをお勧めします。

    なお、本書の43ページにインストールに関する説明がありますので、参考にしてください。



  • MQL4、MQL5でのカスタム指標プログラムの書き方色々

    皆さん、こんにちは。

    MT4 build610どうですか?
    やはり混乱を招いているからか、今回のアップデートに関するブログ記事を色々なところで見かけました。
    私個人としては、これまで使っていたプログラムがそのまま動いたので、build610にアップデートしました。
    ただ、これまで使っていたプログラムが動作しないとか、動作が不安定であれば、アップデートすべきではありません。
    デモ口座などで十分にテストした方がいいでしょう。
    ところで、build600になってからMQL4の仕様が変わったため、カスタム指標やEAも色々な書き方ができるようになってしまいました。
    今回は、一例として簡単なカスタム指標プログラムについてみてみます。
    MT4 build509以前のいわゆる「old MQL4」では、終値を線で結ぶだけのカスタム指標プログラムは次のように書けました。

    build600以降でも、このプログラムはコンパイル、実行できます。
    ただし、メタエディタの新規作成からプログラムを作ると、OnInit()とか、OnCalculate()に変わってしまいます。
    これらの関数はMQL5での特別な関数なのですが、MQL4でもそれを使わせたいということでしょう。
    ここで、単に init()→OnInit()start()→OnCalculate()に変えると、コードは次のようになります。

    このプログラムもbuild600以降であれば、コンパイル、実行できます。
    でも、OnCalculate()関数を使うのであれば、MQL5ライクな書き方をすることもできます。

    Bars→rates_total
    IndicatorCounted()→prev_calculated
    Close[i]→close[i]

    と置き換えてみます。
    あと、

    if(limit == 0) limit = 1;

    を追加します。すると、次のようなプログラムになります。
    なお、この文を追加する理由については「FXメタトレーダー4&5一挙両得プログラミング」の93ページ以降をご参照ください。

    これでMQL5にも近づいたので、MT5でも使えるでしょうか?
    そこで、mq5ファイルにコピーしてMT5のメタエディタでコンパイルしてみると、一つwarningが出るものの一応、実行ファイルができます。
    しかし、これをチャートに挿入しても何も表示されません。やっぱりダメなんです。
    MT5で動作させるためには、さらに#propertyを追加、ArraySetAsSeries()でBuf[]、close[]を時系列配列にしなくてはいけません。
    これらの修正を加えると、MT5で動作するプログラムは次のようになります。
    この修正の説明についても、「FXメタトレーダー4&5一挙両得プログラミング」の93ページ以降をご参照ください。

    やはり、簡単なカスタム指標プログラムでも、New MQL4とMQL5との間には互換性はないということです。
    このようにMQL4では色々な書き方ができるようになったのですが、実のところ、MT4のままならOld MQL4で十分でしょうし、MT5に移行するのなら、最初からMQL5でプログラムを作ればいいと、個人的には思います。



  • MT4 build600以降のための「MQL5プログラミングの基礎」

    MT4 build600のアップデート以降、日替わりのようにアップデートが続いてどうなることかと思いましたが、今のところbuild610で落ち着いたようです。
    build600系では、MQL4の仕様が変わってしまいました。
    変わったと言っても、従来のMQL4にMQL5の仕様の一部が追加されたので、本書 「FXメタトレーダー4&5一挙両得プログラミング」の63ページ以降の「2-2 MQL5プログラミングの基礎」の節が参考になるかと思います。
    この節は、MQL4からMQL5になって変わった部分をまとめたものですが、ちょうど新MQL4で追加された部分に対応しています。
    MQL4でプログラミングするのであれば、特に追加された機能を使う必要はないのですが、MT4のままMQL5に慣れさせようというMQ社の思うつぼにはまりたい人は是非どうぞw。
    ただ、基本的には旧MQL4との互換性を保ったまま機能が追加されているので、MQL5とは異なる部分もあります。
    その一つはOpen[],Close[],High[],Low[]などバーの四本値の値を格納した定義済み配列です。Bid, Askなどの売値、買値を表す定義済み変数もそうです。
    これらの定義済み配列、変数はMQL5ではなくなっています。
    しかし、これをなくすと互換性がなくなってしまうため、新MQL4では従来通り使えるようになっています。
    もう一つはプログラムで最初に実行されるstrat()や、init(), deinit()関数などの特別な関数です。
    MQL5ではこれらの特別な関数は、OnStart(), OnCalculate(), OnTrade(), OnInit(), OnDeinit()などと関数名が変わってしまいました。
    新MQL4では、MQL5の特別な関数にも対応していますが、旧MQL4のstart()なども同じように使うことができます。これも互換性を保つためでしょう。
    このように新MQL4は、旧MQL4との互換性を保ちつつ、MQL5の機能を追加していっています。
    ただ、本書で紹介していない細かい点で厳密な互換性が保たれていない部分があるので、build600になってプログラムの修正が必要なケースも多々あるようです。
    新MQL4は、MQL4とMQL5の混在する中途半端な仕様になってしまっているので、MQ社にとってはあくまでMQL5へのつなぎと考えているのでしょうが、うまくつないでいけるのかどうか疑問なところです。
    Bid, AskやOpen[],Close[]などが、宣言やデータコピーなどの必要なく、思ったところですぐに使えるというのは、初心者にとってはわかりやすい仕様だったと思います。
    MQL4にMQL5の仕様を追加するくらいなら、MQL5にMQL4の仕様を追加した方が移行しやすいと思うのですが、今後、どう迷走していくか見物です。



  • MT4 build600以降での本書の使い方

    本書「FXメタトレーダー4&5一挙両得プログラミング」、略して「二刀流本?」ですが、最近のアマゾンのレビューによると、MT4 build600のアップデートにタイムリーだという評価がありました。
    これはちょっと予想外だったのですが、アップデートで追加された機能がMT5やMQL5のものだったので、図らずもMT4build600の新機能の説明になった部分もあったようです。
    今回のMT4アップデートの動きは、本書の執筆時にはわかっていたのですが、リリース時期や詳細については不明だったので、本書では全く触れていません。
    ただ出版したばかりで、修正することはできないので、今後、MT4 build600以降でも本書が使えるよう、対応する部分について補足説明していきたいと思います。
    ちなみに当方で確認した範囲では、本書のサンプルプログラム(MQL4版)は、MT4のbuild 600以降でも問題なく、コンパイル、実行できます。
    実際、このくらいの単純なプログラムであれば互換性は保たれているわけです。メタクォーツ社も、MT4の利用者の多くは、この程度のプログラムしか作らないと高をくくっていたのではないでしょうかね?



  • MT4のアップデートについて

    皆さん、こんにちは。
    MT4をご利用の方は、業者からの案内などによりご存じかと思いますが、先日、MT4の大幅なアップデートがありました。
    しばらくMT4 Build509が利用されていましたが、現在、Build602になっています。
    今お使いのMT4は、業者によってはまだアップデートされていないものもあるかと思います。具体的なアップデートのタイミングについては、お使いの業者にお問い合わせください。
    ところで、「FXメタトレーダー4&5プログラミング」の内容は、MT4のBuild509を対象としているため、今回のアップデートで内容が異なってしまった箇所が出てきました。
    注意した方がよいのは、MQL4プログラムのフォルダ構成です。
    本書の36ページから38ページで、MQL4のフォルダ構成の説明がありますが、新しいBuildでは、ここの部分が変更となっています。
    どう変更になったかというと、簡単に言うと、38ページから41ページで説明しているMQL5のフォルダ構成と同じになったのです。
    従って、その部分の「MT5」,「MQL5」,「mq5」,「ex5」などの部分をそれぞれ「MT4」,「MQL4」,「mq4」,「ex4」と読み替えてもらえればOKです。
    これまでは、プログラムフォルダの場所は、MT4をインストールしたフォルダから辿っていかなくてはいけませんでしたが、新しいBuildでは、インストールしたフォルダを覚えておく必要はなくなりました。
    MT5と同じようにメニューから直接開くことができます。
    メニューの「ファイル」から「データフォルダを開く」を選択すると、データフォルダが開きます。その下の「MQL4」というサブフォルダの下にプログラムファイルが保存されるようになっています。
    20140206.png
    なお、日本語版だとファイルメニューが二つあるのですが、左側が本物で、右側は「表示」メニューの間違いだと思います。
    (日本語版のメニュー対応リストの不具合でしょう)
    本書のサンプルプログラムに関しては、新しいBuildでもコンパイル、実行はできます。特にプログラムを修正する必要はありません。
    ただ、実際には、新しいBuildでは、プログラミング言語であるMQL4が拡張されています。
    配列や外部ライブラリを利用しているプログラムでは多少修正が必要になる場合もあるようです。
    このMQL4の拡張では、MQL5の機能や関数が追加されたのですが、個人的にはせっかくのシンプルな仕様が複雑になってしまった感じがします。
    そもそもMQL4とMQL5とでは基本的なポリシーが違うのに、それをミックスしてしまっては、混乱するだけでしょう。
    メタクオーツ社の”迷走”としか思えないアップデートはこれからも続くと思われます。
    今回のMQL4の拡張でも、EAの作成に欠かせないトレード関数やテクニカル指標関数については、本書で解説した通り、全く互換性がないままです。
    実際、ポジションの管理方法がMT4とMT5で決定的に異なるので、その仕様を統一しない限り、そのままでは同じロジックのEAを作ることはできないでしょう。
    現状で、MT4とMT5とで同じロジックのEAを作るには、本書をご参考になることをお勧めします。
    (ただ、出版以来、何の問い合わせもないので、きっとそういう必要のある人はほとんどいないのでしょうが・・・)