• 次回Kindle本の案内

    取り急ぎ、次回Kindle本のカバーと目次です。
    現在、最終校正に入っていますので、来週中には出版できると思います。



  • 月替わりセール540円1月31日まで

    拙著Kindle本『新MT4対応 FXメタトレーダープログラミング入門』ですが、1月のKindle月替わりセールで4割引きの540円で販売されています。
    MT4の最新版Build1031に対応させるために、内容を更新したばかりです。
    1月31日までですので、この機会にお買い求めください。



  • 「新MT4対応 FXメタトレーダープログラミング入門」更新しました

    皆さん、こんにちは。

    1年前に出版したKindle本『新MT4対応 FXメタトレーダープログラミング入門』ですが、MT4のアップデートに伴い、内容が古くなってきたので、更新を行いました。

    修正箇所をすべて書き出すことはできませんが、基本的に、MT4 Build 1031に合わせてメニュー項目などの修正と一部画像の差し替えを行いました。

    内容としては、細かい誤植の修正が何か所かありますが、以下の部分でちょっと多めに文章の削除、追加を行いました。

    1-1  MT4のダウンロードとインストール

    現在、MetaQuotes社のサイトからMT4をダウンロードすると、MT4ではなくMT5がインストールされるようなので、その旨を追加し、MetaQuotes社のサイトからダウンロードする説明を削除しました。

    3-5  繰り返しを使ったチャート全体への プロット
    チャート全体にプロットのところで、rates_totalとprev_calculatedの説明を少し補足しました。

    本日以降、新規に購入された方には更新版が配信されています。既に購入済みの方については、アマゾンの「コンテンツと端末の管理」をご確認ください。個別に連絡は行かないと思いますが、更新版があることが表示されるか、設定で「本の自動更新」がONになっていれば、自動的に更新されるのではないかと思います。

    なお、更新版では、最初の免責事項のページと最後の著者紹介のページに、MT4 Build 1031対応と記載されています。ご確認ください。

    追記:Kindle本を更新すると、ハイライト、ブックマーク、メモなどのデータが消えてしまいますので、既存の読者全員に更新をお願いするものではありません。今回の更新では、「本の自動更新」がONになっていても、自動的には更新されません。更新しても問題がなければ、一旦、本書を端末より削除してください。その後、アマゾンの「コンテンツと端末の管理」より配信の手続きをすると、更新版が配信されると思います。

    追記の追記:アマゾンの公式見解では、書籍を端末より削除しても更新版は配信されないということです。更新版の配信を希望する場合には、アマゾンの「問い合わせフォーム」から連絡してくださいとのことです。(自分も含めて端末から削除しただけで更新版が配信された人はいるみたいなんだけど、間違った配信なの?)



  • MT4/5でチャート毎にマジックナンバーを変える

    皆さん、こんにちは。ずいぶん久しぶりの記事です。

    MT4/MT5では、EAでマジックナンバーを設定することが多いです。

    同じMT4に複数のチャートを開いてEAを動かす場合、通貨ペアが異なっていれば、特にマジックナンバーは同じでも構いません。ただし、同じ通貨ペアのチャートをいくつも開いて同じEAを動かす場合、それぞれマジックナンバーを変えておく必要があります。

    もちろん input をつけてマジックナンバー変数を宣言しておけば、EAを挿入後にマジックナンバーを個別に変えることはできます。今回はこれを自動的に行いたいという人向けの記事です。(個人的に必要だったので作ったものですが)

    使う関数は、ChartID(), ChartFirst(), ChartNext()です。

    これらの関数は、もともとMQL5の関数でしたが、新MQL4になってMQL4でも使えるようになったものです。

    ChartID()は、プログラムを挿入したチャートのIDを返す関数です。

    ChartFirst()は、MT4で開いている最初のチャートのチャートIDを返す関数です。

    ChartNext()は、前のチャートIDを引数として次のチャートのチャートIDを返す関数です。

    簡単にやるには、チャートIDをそのままマジックナンバーにすればいいですが、チャートIDはかなり大きな整数値なので、もう少し簡単なマジックナンバーに置き換えてみます。

    以下は、チャート毎に異なるマジックナンバーを返す簡単なスクリプトです。

    マジックナンバーの初期値は100としており、チャートを探す度に1ずつ増やすので、それぞれのチャートで、100、101、102・・・とマジックナンバーが変わっていきます。

    それだけなんですが、まま簡単にできたのでメモしておきます。特に調べてないので、既出かもしれませんが。



  • [MQL4/5]新しいバーができたときに1回だけ実行する

    皆さん、こんにちは。

    久しぶりにMQL4/MQL5の記事です。
    先日、拙著の読者の方から質問をいただきました。

    その質問は、新しいバーができたときに1回だけ何か実行したい場合、どうすればよいかという内容でした。

    最近の拙著で説明しているEAでは、新しいバーができたときに発注するというケースしか扱っていなかったので、売買シグナルの条件に加えて、ポジションがないという条件をつけて、1回しか発注しないようにしていました。

    今回は、例えば、新しいバーができたときにAlert()関数で何か表示させるというように、1回実行したという情報がないケースを考えてみます。

    Volume[0]を使う方法


    新しいバーができた瞬間は、Volume[0]が1になっていることを利用する方法です。これが最も簡単な方法です。

    しかし、これには問題があり、新しいバーができたときにtickが連続してしまうと、OnTick()実行時にVolume[0]が2以上になってしまい、何も実行しないまま、次のバーまで待たなくてはいけなくなることがあります。

    昔のようにtickがのんびりとしていた時代はよかったのでしょうが、最近では、tickが速いので、この方法では、新しいバーで必ず1回実行できることは保証されません。

    Barsを使う方法


    次は、定義済み変数Barsを利用する方法です。Barsはチャート上のバーの総数を表す変数なので、新しいバーができると、値が更新されます。なので、最初にBarsの値を記録しておき、その値が変わったときが新しいバーができたときと判断し、Alert()を実行するというものです。実行後は、その時点でのBarsの値を記録しておけば、次のバーが出てくるまで、Alert()が実行されることはありません。

    この方法は、MT4だと問題ないようですが、一つ心配なのは、オプションでチャートの最大バー数を少なく設定したときに、新しいバーができてもバーの総数が変わらなくなることがないかということです。

    MT4の仕様はときどき変わるので、この方法も必ず機能するという保証はないかもしれません。

    Time[0]を使う方法


    もう一つ、バーの開始時刻Time[0]を使う方法があります。考え方は、新しいバーができるまで値が変わらないというBarsと同じです。単にBarsをTime[0]におきかえます。

    この方法だと、チャートの最大バー数とは関係なく、Time[0]はバーができる毎に更新されるので、バーの最初に1回実行するということは、保証されると思います。

    MQL5の場合


    最後におまけで、MQL5の場合です。MQL5では、Volume[0]、Bars、Time[0]すべて使えません。ここでは、Time[0]に対応する方法を使ったコードを示します。

    MQL5では定義済み変数がほとんど使えないので、CopyTime()という関数を使わなくてはいけなかったり、関数の引数に配列を用意しなくてはいけなかったり、外部変数宣言して、初期値の代入をOnInit()関数で行わなくてはいけなかったり、と面倒な限りです。

    こういう状態でMT5への移行は本当に進むのでしょうかね。
    最近Python始めたので、特にそう思いますね。