MT5ではRSIを表示するプログラムはありますが、RSIの値を返すプログラムはなかったので、作成しました。
どっちかというと練習的な要素の割合が強いです。
今回のRSIの値を返すプログラム(関数)は配列と期間を引数として持ち、それをもとにdouble型で計算結果を返すだけの非常にシンプルな仕様になっています。
ですが、【配列】を渡すことによってRSI値を返すことができるので、価格だけでなく、どのような数値でもRSIを計算できるところがメリットです。
完成したコード
double getRSI(double &arr[],
int period)
{
double a_total=0,
b_total=0,
a_ave=0,
b_ave=0;
int count=0;
for(int i=1; i<period; i++)
{
if(arr[i-1]<arr[i])
{
a_total+=arr[i]-arr[i-1];
count++;
}
else
b_total+=arr[i-1]-arr[i];
}
if(a_total!=0)
a_ave=a_total/count;
if(b_total!=0)
b_ave=b_total/(period-count);
return a_ave/(a_ave+b_ave)*100;
}
めちゃくちゃシンプルです。笑
コードの解説
9行目のfor文について
この部分では一本前の価格より上昇していれば、陽線
一本前の価格より下降していれば、陰線と判断し、
陽線の値幅と陰線の値幅の合計を計算しています。
計算した結果はa_total(陽線合計)とb_total(陰線合計)
に代入しています。
また、陽線の合計数をcountに格納しています。
陰線の合計数を入れていないのは、期間から陽線の合計数を引くことにより、陰線の合計数を求めることができるからです。
19行目及び21行目のIF文について
ここはcountの数が0じゃなかった場合に陽線の平均値を計算する部分です。
0での除算はエラーを発生させてしまいますので、フィルターという意味も込めています。
また、21行目も同様ですが、陰線の平均を計算しています。
23行目の戻り値について
ここはRSIの公式に則って戻り値を計算し、返しています。
それだけなんですが一応紹介しておきます。
使用にあたっての注意点
- 配列はdouble型で使用する。
- 配列がない場合エラーが発生する。(0で割る)という処理が起きる。
- 配列の長さがRSI期間の長さより短いとき正しい計算結果が表示されない。
です。もちろんですが、配列の数は13なのにも関わらず期間が14であれば計算は可能ですが、正しい計算結果は表示されません。
まとめ
RSI、配列関係で困っている方の一助となれば幸いです。
とりあえず使ってみたいという方は、最初のコードをコピペしてもらえればすぐに使用できます。
配列の作成の仕方については近々記事を作成していこうと思います。
コメント