MT4のRSIの計算式についての質問です。
MT4のRSIをJavaで計算しようと思っています。
FXは初心者なので、分かりやすくご説明して頂けるとありがたいです。
私が調べたところ2つ程計算式があるようでした。
http://www.k3.dion.ne.jp/~forex/tc/rsi.htm
私が困っているRSIの計算に似たようなことが掲載されている下記のサイトもありました。
http://d.hatena.ne.jp/fai_fx/20090720/1248018736
上記のサイトのパターンBで計算しても同じような計算結果が得られません。(RSI2)
なお、プログラムのRSIはパターンAです。
それでは、下記にJavaプログラムを記載致します。
/**
* RSIを計算します。
* @param hajimene_data 始値データ
* @param owarine_data 終値データ
* @param takane_data 高値データ
* @param yasune_data 安値データ
* @param count 現在のカウント
* @param a 「a」のRSIを作成
* @return RSIの値
*/
public static double RSI(
double[] hajimene_data, double[] owarine_data, double[] takane_data, double[] yasune_data, int count, int a) {
//値上がり幅を格納
duble neagari = 0.0;
//値下がり幅を格納
double nesagari = 0.0;
for(int i = count;i >= count - a;i--){
//値上がり
if(hajimene_data[i] < owarine_data[i]){
//値上がり幅の更新
neagari += owarine_data[i] - hajimene_data[i];
//値下がり
}else{
//値上がり幅の更新
nesagari += hajimene_data[i] - owarine_data[i];
}
}
//RSIの値を計算
return neagari / (neagari + nesagari) * 100;
}
/**
* RSIの値上がり幅、値下がり幅を計算します。
* @param hajimene_data 始値データ
* @param owarine_data 終値データ
* @param takane_data 高値データ
* @param yasune_data 安値データ
* @param count 現在のカウント
* @param a 「a」のRSIを作成
* @return RSIの値上がり幅、値下がり幅
*/
public static double[] RSI_Syokisyori(
double[] hajimene_data, double[] owarine_data, double[] takane_data, double[] yasune_data, int count, int a) {
//値上がり幅、値下がり幅を格納
double[] rsi_base = new double[2];
for(int i = count;i >= count - a;i--){
//値上がり
if(hajimene_data[i] < owarine_data[i]){
//値上がり幅の更新
rsi_base[0] += owarine_data[i] - hajimene_data[i];
//値下がり
}else{
//値上がり幅の更新
rsi_base[1] += hajimene_data[i] - owarine_data[i];
}
}
//平均を算出
//rsi_base[0] /= a;
//rsi_base[1] /= a;
//RSIの値を計算
return rsi_base;
}
/**
* RSIを計算します。
* @param hajimene_data 始値データ
* @param owarine_data 終値データ
* @param takane_data 高値データ
* @param yasune_data 安値データ
* @param count 現在のカウント
* @param a 「a」のRSIを作成
* @return RSIの値
*/
public static double RSI2
double[] hajimene_data, double[] owarine_data, double[] takane_data, double[] yasune_data,
int count, double[] RSI_Base, boolean flg, int a) {
//1日目の値上がり幅の平均を算出
double syoki_neagari = RSI_Base[0];
//1日目の値下がり幅の平均を算出
double syoki_nesagari = RSI_Base[1];
//値上がり幅を格納
double neagari = 0.0;
//値下がり幅を格納
double nesagari = 0.0;
for(int i = count;i >= count - a;i--){
//値上がり
if(hajimene_data[i] < owarine_data[i]){
//値上がり幅の更新
neagari += owarine_data[i] - hajimene_data[i];
//値下がり
}else{
//値上がり幅の更新
nesagari += hajimene_data[i] - owarine_data[i];
}
}
//RSIの値を計算
return (syoki_neagari * (a-1) + neagari) / ((syoki_neagari * (a-1) + neagari) / a + (syoki_nesagari * (a-1) + nesagari) /a);
}
なお、下記がRSI_SyokisyoriとRSI2の呼び出し元です。
//RSIフラグ
boolean RSI_flg = false;
//RSIの計算
if(count >= RSI && RSI_flg == false){
//RSIの初期計算
RSI_Base = methods.Technical.RSI_Syokisyori(hajimene_data, owarine_data, takane_data, yasune_data, count, RSI);
RSI_flg = true;
}else if(count >= RSI && RSI_flg == true){
//RSIの計算
RSI_data[count] = methods.Technical.RSI3(hajimene_data, owarine_data, takane_data, yasune_data,
count, RSI_Base, RSI_flg, RSI)
}