では、実際のプログラムを作ってみましょう。今回は移動平均線を作る・・・というか、すでにあるテクニカル指標関数の使い方を説明します。既存のインジケーターの改造をするにはこれが一番手っ取り早いです。mq4(MT4)にもありましたが、ちょっと使い方が違うところがあります。
ソースファイルはこちらからダウンロードしてください(右クリックで保存)。
https://1klab.com/mt5/wp-content/uploads/2018/01/MA_Vol1.mq5
ーーーーーーーーーーーーーーーーーーーーーーー
#property indicator_buffers 1 ・・・指標計算に使用されるバッファ数
#property indicator_plots 1 ・・・画面に描画されるものの数
#property indicator_type1 DRAW_LINE ・・・描画されるものの種類(移動平均線なのでLINE)
#property indicator_color1 clrDeepPink ・・・描画される線の色
#property indicator_width1 2 ・・・描画される線の太さ
int hMA; ・・・ハンドル→これがMT5(mql5)のキモ
double buf[]; ・・・バッファ(この値が描画される)
input ENUM_MA_METHOD InpMAMethod=MODE_SMA; ・・・移動平均線種別
input ENUM_APPLIED_PRICE InpMAApply=PRICE_CLOSE; ・・・適用価格
input int InpMaPeriod=20; ・・・期間
ーーーーーーーーーーーーーーーーーーーーーー
mql5で特に変わったのが#property indicator_plotsのところとハンドルの概念です。詳しくは
https://www.mql5.com/ja/docs/basis/preprosessor/compilation
を参照してください
続いてOnInit関数です。OnInit関数は、インジケーターが起動したとき最初に呼ばれる関数です。
ーーーーーーーーーーーーーーーーーーーーーーー
//移動平均線のテクニカル指標関数に接続
hMA=iMA(NULL,0,InpMaPeriod,0,InpMAMethod,InpMAApply);
//正しいインデックス作成と適切な配列とを関連付ける
SetIndexBuffer(0,buf,INDICATOR_DATA);
//データウィンドウに表示する指標グラフィカルシリーズの名称
PlotIndexSetString(0,PLOT_LABEL,”MA Vol.1(“+string(InpMaPeriod)+”)”);
ーーーーーーーーーーーーーーーーーーーーーーー
mql5ではこの方法でテクニカル指標関数に接続します。詳しくは
https://www.mql5.com/ja/docs/indicators
を参照してください。続いてOnCalculateですOnCalculateはローソク足が動くたびに呼ばれる関数です。
ーーーーーーーーーーーーーーーーーーーーーーー
//— データが全て計算されたかをチェックする
if(BarsCalculated(hMA)<rates_total)
return(0);
int to_copy;
//最初はprev_calulated==0なので、すべてのデータがコピーされる
to_copy=rates_total-prev_calculated;
//一度計算されるとrates_total==prev_calculatedになるので、最新のバーだけ計算するようにする
if(to_copy==0)
to_copy++;
// 指標バッファのコピー
if(CopyBuffer(hMA,0,0,to_copy,buf)<=0)
return(0);
ーーーーーーーーーーーーーーーーーーーーーーー
最後にハンドルを開放します。この関数は自動で生成されないので自分で作る必要があります。
void OnDeinit(const int reason)
{
IndicatorRelease(hMA);
}
コンパイルして実際に動かしてみましょう。おそらく最初は
こんな風に変数名がそのままでているかと思います。これだと混乱する可能性もあるので、コメントを入れます。コメントはC++と同じ要領です。そうすると
このようにわかりやすくなります。同じ期間、同じ種別、同じ適用価格でMT5に最初から入っている移動平均線と比べてみてください。当然同じ値になっているはずです。データウィンドウで確認します。
このような要領で、既存のインジケーターの改造から始めましょう。