Block EAは、メタトレーダーのMT4とMT5とでEAのソースコードを共通化させるライブラリを使うことを前提としているので、基本はEAプログラミング用です。
ただ、メタトレーダーでは、EAのほかにカスタム指標やスクリプトのプログラミングもできるようになっています。
スクリプトは1回実行させるだけのプログラムなので難しくはないのですが、カスタム指標はメタトレーダー独自の作法があり、それがMT4とMT5とで違っていたりして、なかなか難しいところがあります。
さらにカスタム指標は、凝りだすとキリがないほどできることが多いです。MT4とMT5でできることすべてに対応させるのは大変です。
そこで今回は、作成可能なカスタム指標をかなり絞って対応することにしました。基本的には、以下のCodeBaseの「カスタム指標コード集」のページに掲載されているものを作れるようにしました。
では、Block EAの画面で説明していきます。
カスタム指標特有のブロックは、MQL関数のツールボックスの「カスタム指標」のカテゴリーに配置しています。
ただ、これらを一つずつ組んでいくのは面倒なので、とりあえず、テンプレートを見てください。
カスタム指標のコードを知っている人であれば、どう対応しているかはすぐにわかると思います。
「カスタム指標セットアップ」のブロックが、#propertyから始まる一連のプリプロセッサ命令、「初期化関数」のブロックがOnInit()関数、「指標計算関数」のブロックがOnCalculate()関数にそれぞれ対応しています。
この3つのブロックをワークスペースにドラッグするとカスタム指標のプログラムとなります。
MQLコード表示させると、以下のようになります。
#include "LibMQL4.mqh"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_type1 DRAW_LINE
#property indicator_color1 0x0000ff
#property indicator_width1 1
#property indicator_style1 STYLE_SOLID
double Buf[];
int OnInit()
{
SetIndexBuffer(0, Buf);
ArraySetAsSeries(Buf, true);
SetIndexLabel(0, "MyIndicator");
SetIndexDrawBegin(0, 0);
return(INIT_SUCCEEDED);
}
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open2[],
const double &high[],
const double &low[],
const double &close2[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
ArraySetAsSeries(close2, true);
int limit = (rates_total - prev_calculated);
limit = (MathMin(limit, (rates_total - 0)));
for (int i = 0; i <= limit - 1; i++) {
Buf[i] = (close2[i]);
if (((Buf[i]) == (EMPTY_VALUE))) return 0;
}
return (rates_total - 1);
}
コメント等入れていないのでわかりにくいかもしれませんが、単に終値を結ぶだけのプログラムです。
MT4、MT5共通のコードとなっているので、mq4ファイルの保存、mq5ファイルの保存を選ぶと、同じ内容で拡張子だけが違うファイルとして保存されます。
これをMT4、MT5のデータフォルダのMQL4\Indicators、MQL5\Indicatorsのフォルダにコピーしてコンパイルすると実行ファイルになります。