MT4/MT5に雪を降らせる

MT5のチャート

MT5で簡単なインジケーターを作成します。最後にはクリスマスバージョンのインジを提供します。(説明はMT5で行いますがMT4のインジも提供します。)

良く見かけるインジケーターのプログラムは比較的複雑なことをやっていて分かりにくくなっているので、本当にミニマムな状態で作成して仕組みを理解できればと思います。

インジの大枠

大きくは以下の3つに分かれます。それぞれの役割はプログラムの説明と一緒に後述します。

  • インジのプロパティ設定
  • チャートとインジのマッピング
  • インジの計算

プログラムと説明

インジのプロパティ設定

最初にインジのタイプを決める必要があるので、メインチャートと同じウインドウに表示するか?サブウインドウに表示するか?を選択します。

※プログラムは最後にまとめたものを記載しますので、途中でコピーなどされなくても大丈夫です。

[メインウインドウに表示する場合]

#property indicator_chart_window

MT5のメインウインドウに表示

[サブウインドウに表示する場合]

#property indicator_separate_window

MT5のサブウインドウに表示

その後、利用するインジの数やラベルのタイプを設定します。

property indicator_buffers 1
property indicator_plots 1
property indicator_label1 “Original1”
property indicator_type1 DRAW_LINE
property indicator_color1 clrWhite


チャートとインジのマッピング

配列とチャートをマッピングします。ここではあまり深く考えなくて大丈夫です。

//— indicator buffers
double Label1Buffer1[];

//— indicator buffers mapping
SetIndexBuffer(0,Label1Buffer1,INDICATOR_DATA);


インジの計算

もしインジ作成でつまずいたことがある方はこの部分でエラーになったのではないかと思いますが、ここでは本当にシンプルなところのみ記載するので心配ありません。

10行目付近のforの中でインジに表示したい値を計算して配列に格納していきます。(今回は適当に現在値×αにしました。)

ここでの注意点として、MT5のOnCalculateに渡される配列(今回はprice)は、0が最も古い値で大きくなるにつれて新しい値になっていきます。
※MT4のOnCalculateでは0が新しい値になっていて同じなっているようで・・・とても紛らわしいです。

具体的にみるとよく理解できるので9行目で説明します。

for(int i=rates_total-20;i<rates_total;i++)

rates_totalはチャートのバーの全量が入ってくるので、例えば30000などが入っています。30000-20=29980ですので、29980~30000までループするということです。

MT5の最新20本計算

想定通り最新のバー20本に対してのチャートが表示できました。

MT4と同じように新しい値が配列の若い数字に入っていて欲しいという場合は、ArraySetAsSeriesを使うことで逆にすることもできますが、その場合は利用する全てのデータを逆にする必要があります。

もし今回のプログラムでやる場合は、以下のように2つを逆転させます。

ArraySetAsSeries(Label1Buffer1,true);
ArraySetAsSeries(price,true);

一貫性があればどちらでも構わないと思うのですが、MQL5の標準インジでは使っていないようなので今回はArraySetAsSeriesを利用していません。


先ほどは練習用で20本分だけ表示したので、今度は全てのバーに適用します。

ポイントとしては、毎回チャート上のすべてのデータを再計算するわけではなく、初回のみ全て計算してその後は更新分だけ計算する仕組みにしていることです。

if(prev_calculated==0) pos=0;
else pos=prev_calculated-1;

posをforの開始条件にすることで無駄な更新がなくなります。

ここまでのプログラム全量を掲載します。

ここまででインジの基本部分は終了となります。後は自分の好きな数式などを入れて実戦で試していくのが良いかと思います。



クリスマスバージョン

今日はクリスマスなので何の役にも立たないインジを提供します。MT5のEURUSDのH1で動作確認しました。他でも動きますが多少は比率をいじる必要があるかもしれません。

昔のファミコンのようなアナログ感が個人的にはツボでした。

[MT5版]

以下の画面のように1秒単位で雪が移動します。通常OnCalculateはTick配信が無いと呼び出されないのですが、OnTimerからOnCalculateを呼び出すことで配信が無い状態でも動くようになっています。逆に配信があると更新速度が速くなってしまいそうですね。

MT5のチャート

[MT4版]



最後に

インジ作成も遊び心があると楽しいですね。

MT4/MT5の両方で動くようにも書けるのかもしれませんが、現時点では勉強不足で対応しきれていません。(今後の課題です。。。)

MT5の利用は以下の業者を利用するかMQL5Communityからダウンロードしてください。