• 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始めたので、特にそう思いますね。



  • Python関連の記事

    皆さん、こんにちは。

    しばらくこちらのブログ記事が止まってしまいましたが、Pythonに関する記事がメタトレーダーの内容から外れてきたので、別のサイトに投稿していました。

    興味のある方は以下のサイトをご覧ください。

    http://qiita.com/toyolab/items

    今後も、純粋にPythonのプログラミングに関する記事は上のサイトに投稿していきます。ただ、メタトレーダーやMQLは、プログラミングの世界では特殊な部類に入るようなので、引き続きこちらのサイトで書いていきたいと思います。

    今後ともよろしくお願いいたします。



  • MT5のテクニカル指標関数をPythonで書いたよ

    皆さん、こんにちは。

    Pythonでシストレの続きを色々と考えていたのですが、あんまり簡単に書けなかったので、テクニカル指標のレパートリーを増やしてました。

    テクニカル指標は、計算がシンプルなものが多いので、Pythonプログラミングのいい練習材料になります。とりあえず、MT5に組み込まれているテクニカル指標関数の一部をPythonで書いてみたので、以下のサイトに置いておきます。

    https://github.com/toyolab/MT5IndicatorsPy

    テクニカル指標は解釈が色々あるので、MetaQuotesのサイトにあるテクニカル指標の説明では正確な計算ができないものも多かったです。詳しいことはMT5にインストールされているインジケータのサンプルプログラムを参考にしました。なので、関数の仕様もMT5に似たようなものにしました。

    ただし、アルゴリズムのまま実装しただけので、エラー処理など行っていません。ご参考まで。



  • Pythonでシストレのバックテスト

    Pythonでテクニカル指標が作れたので、こんどはシストレやってみました。

    と言っても、自動売買はできないので、バックテストまでですが。

    売買システムも、もっとも基本的な移動平均の交差システムです。完成したバーを使ってシグナルを出すものなので、4本値のヒストリカルデータだけでバックテストしてみました。

    詳しくは以下のリンクをご覧ください。

    Pythonでシストレのバックテスト by Jupyter notebook