• カテゴリー別アーカイブ 「FXメタトレーダー実践プログラミング」
  • 実践本のサンプルプログラム

    皆さん、こんにちは。

    出版してから既に6年以上経った実践本「FXメタトレーダー実践プログラミング」ですが、いまだに時々質問をいただきます。

    最近多いのが、ライブラリファイルの「MyLib.mq4」をコンパイルするとエラーが出るけど大丈夫か?というものです。

    実際、コンパイルすると「sign mismatch」というメッセージが何か所か出ます。ただし、これはエラーメッセージではなく、警告メッセージです。一応、コンパイルはできて、実行ファイルも作成されているはずです。通常の実行には、特に問題はないと思います。

    ちなみに警告メッセージが出ているのは、次の if 文が書かれているところです。

    「sign mismatch」の意味は、比較している左辺と右辺のデータ型の符号の扱いがあっていない、ということです。つまり、データ型としてはどちらも整数型で同じなのですが、左辺の「GetTickCount()」の戻り値の型が「uint」型(符号なし整数)なのに対して、右辺の「MyOrderWaitingTime」が「int」型(符号付き整数)と、符号の有無で型があっていないということなのです。

    旧MQL4では、整数型は「int」型しかなかったので問題なかったのですが、MT4 build600以降の新MQL4では、整数型が「int」「uint」などC言語と同じように増えたので、こんなメッセージが出るようになったのです。

    ということで、このメッセージを消すためには、型を揃えればよいので、17行目の「MyOrderWaitingTime」の宣言文で、型が「uint」になるように

    と修正します。また問題の if 文中に出てくる「starttime」の宣言文も同じく

    のように「uint」に修正すればOKです。

    以上の修正を行ったサンプルプログラム一式を上げておきますので、下のリンクからダウンロードしてください。

    ただ、実践本のプログラミングは、旧MQL4をベースにしているので、現在のMT4で動かすプログラムとしては、あまり推奨できません。新MQL4のプログラミングは、「新MT4対応 FXメタトレーダープログラミング入門」で解説しているので、そちらに移行されることをお勧めします。



  • 実践本訂正

    「FXメタトレーダー実践プログラミング」で訂正です。

    200ページにOrderDelete()の使い方を説明した次のコードがあります。

    このなかでOrderDelete()が2回出てきますが、OrderDelete()は待機注文をキャンセルする関数なので、注文タイプを判別して実行している後者の方が正しいものです。前者は編集の過程で消し忘れたものだと思います。

    これも最近読者の方のご指摘でわかったものです。もう出版して6年も経つのに今頃間違いに気づくとはお恥ずかしい限りです。

    しばらく増刷の予定もないので修正できないのですが、最近購入された方は、この記事で修正点をご確認ください。次のコードが正しいものです。

    メタトレーダーの入門本や実践本も、まだご覧になっている方もおられるようなのですが、情報が古くなってしまい、ちょっとお薦めできません。改訂したいところなのですが、紙の本だとまたすぐに古くなってしまうため、次回は電子版を予定しています。



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

    皆さん、こんにちは。

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

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

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

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

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

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

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

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

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

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

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

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

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



  • Wingdingsフォントで表示できない絵文字がある

    みなさん、こんにちは。

    先日、出版社より「FXメタトレーダー実践プログラミング」の増刷の連絡がありました。あの本もMT4のbuild600以降には対応していないので、修正したかったのですが、修正する時間がないということで、そのまま増刷になりました。紙の本だと、いったん出版してしまうと、なかなか修正は難しいです。今後は電子版も検討したいと思っています。

    ところで表題の件ですが、本書147ページにテキストのオブジェクトをチャートの決まった位置に表示させるプログラムがあります。ShowMTF0.mq4というプログラムで、下の図のようにチャートの隅に文字列と矢印の記号が表示されます。

     image1

    この矢印の記号も実は文字の一種で、ラベルオブジェクトというテキストを表示させるオブジェクトを作成して、フォントをWingdingsにしたものです。

    ObjectCreate(“Label3”, OBJ_LABEL, 0, 0, 0);
    ObjectSet(“Label3”, OBJPROP_CORNER, 3);
    ObjectSet(“Label3”, OBJPROP_XDISTANCE, 33);
    ObjectSet(“Label3”, OBJPROP_YDISTANCE, 1);
    ObjectSetText(“Label3”, CharToStr(221), 16, “Wingdings”, Blue);

    通常は、ObjectSetText()の2番目の引数に表示させたい文字列を指定するのですが、特定のコードに対応する文字を表示させたい場合、CharToStr()という関数を使って、表示させたいコード番号を入れることもできます。

    Wingdingsというフォントは、コードの終わりの方に矢印の記号があるのですが、224番以降のコードを指定すると、対応する絵文字が表示されません。こんな感じになってしまいます。

    Image2

    先日、読者の方から何とかならないものかという質問をいただいたので、ちょっと調べてみました。

    224は16進数でE0なので、当初はE0~FFで始まる文字はユニコードで利用されるから表示できないのかと考えました。しかし、海外のWindows VPS上でMT4を実行した場合、正しく表示されたので、ユニコードの問題でなはく、Windowsの問題ではないかということになりました。

    英語版WindowsだとOKで、日本語版WindowsだとNGということなので、こんな感じじゃないかと推測してます。

    E0~FFのコードは、欧米ではアルファベットに色々な記号が付いた文字を表すために1バイト単独として利用されています。しかし、日本語では、1バイト単独としては使われておらず、2バイト文字の一部として使われています。そのために、日本語Windowsだと強制的に2バイトに変えられてしまって、違う絵文字が二つ表示されてしまったのではないか、ということです。この辺はあまり詳しくないので違ってるかもしれません。

    ちなみにラベルオブジェクトでなく、アローオブジェクトとして作成すれば、224番以降の絵文字も表示可能です。

    ObjectCreate(“Label3”, OBJ_ARROW, 0, 0, 0);
    ObjectSet(“Label3”,OBJPROP_ARROWCODE, 224);
    ObjectSet(“Label3”,OBJPROP_TIME1, Time[1]);
    ObjectSet(“Label3”,OBJPROP_PRICE1, Close[1]);

    ただし、この場合はチャートの任意の座標ではなく、時刻―価格座標の位置にしか表示できないので、チャート上の決まった場所に表示させるのは難しいかもしれません。

    他には、表示させたい絵文字をbmpなどのイメージファイルとして作っておけば、ビットマップラベルというオブジェクトで、チャート上の任意の座標に表示させるということができると思います。ただし、ビットマップラベルはMT4のbuild600以降に導入された機能なので、MQL5の関数を使う必要があります。プログラムについては、別の機会に紹介します。



  • 実践本のサンプルプログラムをMT4 build600系で使う

    みなさん、こんにちは。

    最近、実践本(FXメタトレーダー実践プログラミング)の読者の方から質問がありました。

    サンプルプログラムがMT4 build600系で動かないというものでした。

    基本的に本書に掲載のプログラムはMT4 build600以降にも対応しています。

    ただし、本書のサンプルプログラムの多くでは、MyLib.ex4というライブラリファイルを利用するようになっています。

    このライブラリファイルは、本書独自のもので、MyLib.mq4というソースプログラムをコンパイルしてできるものです。

    MT4 build600系にアップデートすると、MT4に付属のライブラリは再コンパイルされて新しいものになるのですが、ユーザーが作成したものは、ソースプログラムを更新しないと再コンパイルされないようです。

    ですから、MyLib.mq4は、手動で再コンパイルさせる必要があります。

    やり方は簡単です。メタエディターで、「MQL4\Libraries\MyLib.mq4」を開き、そのファイルをコンパイルするだけです。

    サンプルプログラムが動作しない原因がMyLib.ex4によるものであれば、これで動くようになるはずです。