post

RSIに移動平均線を適用させる

なれRSIはギザギザしたラインなので意外に見にくかったりしませんか?もし、RSIに移動平均線がついていたら便利ではないでしょうか?

などと書いてみましたが、実際ストキャスティクスではKラインに対してDラインで滑らかにしています。DラインはKラインの移動平均線なんですよね。だからおかしな考え方ではないと思います。まあ、ゴールデンクロス、デッドクロスが売買タイミングになるかどうかはわかりませんが。

同じようにビルWilliamsの%Rオシレーターも同じように移動平均線をつけてみてはいかがでしょう?

RSIに移動平均線をつけた

RSIに移動平均線をつけた(クリックするともとの大きさで見られます)

プログラムはこちらからダウンロードしてください。

RSIに移動平均線を適用(プログラムソース)

ナレーションでSラインとか言ってしまいました(笑)

post

一番カンタンな移動平均線

では、実際のプログラムを作ってみましょう。今回は移動平均線を作る・・・というか、すでにあるテクニカル指標関数の使い方を説明します。既存のインジケーターの改造をするにはこれが一番手っ取り早いです。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に最初から入っている移動平均線と比べてみてください。当然同じ値になっているはずです。データウィンドウで確認します。

このような要領で、既存のインジケーターの改造から始めましょう。