• カテゴリー別アーカイブ MetaTrader5/MQL5
  • 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始めたので、特にそう思いますね。



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

    皆さん、こんにちは。

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

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

    https://github.com/toyolab/MT5IndicatorsPy

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

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



  • 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」といった余計な変数がなくなったので、逆に見やすくなったかと思います。

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



  • 新MQL4のカスタム指標をMQL5に移植する

    皆さん、こんにちは。

    最近、MT5に関してちょっとした動きがありました。こちらのMetaQuotes社の記事です。

    MetaTrader 5にポジション計算のヘッジシステムが追加されました

    MT5はもともと同じ通貨ペアのポジションを合算して一つのポジションとして扱う方法を取っていました。これがMT4からの移行が進まない要因の一つでしたが、これを改め、MT4と同じようにオーダー毎にポジションが建てられるようにするオプションが追加されるそうです。

    まだベータ版で、正式な対応にはもう少し時間がかかるでしょうが、動向を注視したいと思います。これを早くやってくれれば、あの七面倒くさいライブラリ作らなくて済んだのに・・・

    ところで、今回の記事は上記のMT5の動きとは直接は関係ありません。新MQL4のプログラムをMQL5に移植する際の注意点についてお話しします。

    まず、『新MT4対応 FXメタトレーダープログラミング入門』に掲載しているカスタム指標のサンプルプログラムの簡単なものを見てみます。

    これは、各バーにおける4本値の平均をプロットするカスタム指標です。特に意味はありません。

    これをMQL5に移植してみましょう。まずは、ファイルの拡張子を「mq4」から「mq5」に変えてMT5のデータフォルダの「MQL5\Indicators」の下にコピーします。すると、MT5のメタエディターで開くことができるので、そのままコンパイルしてみましょう。

    すると、こんなエラーが出ます。

    ‘Open’ – undeclared identifier
    ‘High’ – undeclared identifier
    ‘Low’ – undeclared identifier
    ‘Close’ – undeclared identifier

    MQL4では、4本値の配列が「Open[]」「High[]」「Low[]」「Close[]」という配列としてあらかじめ定義してあるので、それをそのまま使えばよかったのですが、MQL5ではそれがありません。

    ここでは、OnCalculate()関数の引数となっている「open[]」「high[]」「low[]」「close[]」という配列が4本値の配列に対応しているので、「Open→open」「High→high」「Low→low」「Close→close」のように変えます。

    これをコンパイルすると、エラーはなくなりました。実行ファイルはできているので、適当なチャートに挿入して実行してみましょう。でも、何も表示されません。そこでコンパイルの画面に警告メッセージが出ているところに注意してください。

    no indicator plot defined for indicator

    指標プロットが定義されていないということのようです。実は「#property」命令がMQL4とMQL5でちょっと異なっていて、MQL5ではプロットする指標の数を「indicator_plots」で指定しなくてはなりません。またもう一つ、指標の種類も「indicator_type1」で指定する必要があります。ラインの場合、「DRAW_LINE」を使います。これらを追加すると、次のようになります。

    これをコンパイルすると、エラーも警告も出ません。そこで、これをチャートに挿入すると、ラインが表示されます。これで移植完成かと思いきや、しばらくチャートを見ていると新しいバーのラインが更新されません。

    USDJPY.mM1
    これは、指標バッファ用の配列がMQL4とMQL5で異なっているためです。MQL4では指標バッファ用配列は最初から「時系列配列」になっていますが、MQL5ではそうではなく、時系列配列にするためにArraySetAsSeries()関数を実行しなくてはなりません。これを「Buf」だけでなく、4本値配列の「open」「high」「low」「close」に適用すると、次のようになります。

    これで移植完成です。どうでしょうか?MT4からMT5への移行の道のりはまだまだ長そうな気がします。

    なお、新MQL4の詳しいことは、こちらの書籍をご参照ください。

    『新MT4対応 FXメタトレーダープログラミング入門』