最終更新: 2026年6月
Stochastic RSI(ストキャスティクスRSI)は、RSIをストキャスティクスの計算式に代入した複合インジケーターだ。1994年にトゥーシャー・シャンデとスタンリー・クロールが開発し、RSI単体よりも高感度なオシレーターとして設計された。
EAに実装する際の最大の注意点は「感度が高すぎることによるシグナルの過剰発生」だ。StochRSIはRSIを二重に平滑化してさらにストキャスティクス化するため、通常のRSIやストキャスティクスより遥かに頻繁にシグナルを生成する。フィルターを適切に設計しないと、ランダムなエントリーに近い状態になる。
Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら
Stochastic RSIの計算式
計算は2段階で行われる:
Step 1: RSIの計算
RS = 過去N期間の平均上昇幅 ÷ 過去N期間の平均下落幅
RSI(N) = 100 − (100 ÷ (1 + RS))
Step 2: RSIにストキャスティクス計算を適用
StochRSI = (RSI(現在) − Min(RSI, n期間)) ÷ (Max(RSI, n期間) − Min(RSI, n期間))
結果として0〜1(または0〜100%)の値域を持つ。
RSIとの主な違い:
| 指標 | 感度 | シグナル発生 | 適した使い方 | |------|------|-----------|------------| | RSI | 中 | 中程度 | トレンド確認・逆張り | | ストキャスティクス | 高 | 多め | 短期タイミング | | StochRSI | 非常に高 | 非常に多め | 精密なタイミング確認・フィルターと必ずセット |
StochRSIの方向転換は同じRSI期間では「RSIよりも早く」発生する。これが「高感度」の意味だが、裏返すとノイズへの反応も早いということだ。
MT4でのStochRSI設定
MT4標準のインジケーターには「Stochastics」と「RSI」が別々に存在するが、「StochRSI」として統合されたものはカスタムインジケーターとして実装する必要がある。
MT4標準インジケーターの組み合わせで代用する方法
RSI(14)チャートにさらにStochastics(5, 3, 3)をRSI値に適用する——これが概念上のStochRSIに相当するが、MT4の標準機能では直接できない。カスタムインジケーターを使うか、以下のようにEA内で計算する方法が現実的だ。
MQL4でのStochRSI実装
// MQL4(MT4用)の実装
extern int RSIPeriod = 14;
extern int StochPeriod = 14; // ストキャスティクス計算の期間
extern int SmoothK = 3; // %K平滑化
extern int SmoothD = 3; // %D平滑化
// RSI値の配列を取得してStochRSIを計算
double GetStochRSI(int shift)
{
// 直近StochPeriod本のRSI値を取得
double rsiValues[];
ArrayResize(rsiValues, StochPeriod);
for(int i = 0; i < StochPeriod; i++)
{
rsiValues[i] = iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, shift + i);
}
double minRSI = rsiValues[ArrayMinimum(rsiValues, 0, WHOLE_ARRAY)];
double maxRSI = rsiValues[ArrayMaximum(rsiValues, 0, WHOLE_ARRAY)];
double currRSI = rsiValues[0];
double rangeRSI = maxRSI - minRSI;
if(rangeRSI <= 0.0) return 0.5; // ゼロ除算回避
return (currRSI - minRSI) / rangeRSI; // 0〜1の値域
}
// %K(StochRSIの平滑化)
double GetStochRSI_K(int shift)
{
double sum = 0.0;
for(int i = 0; i < SmoothK; i++)
{
sum += GetStochRSI(shift + i);
}
return sum / SmoothK;
}
// %D(%Kの平滑化)
double GetStochRSI_D(int shift)
{
double sum = 0.0;
for(int i = 0; i < SmoothD; i++)
{
sum += GetStochRSI_K(shift + i);
}
return sum / SmoothD;
}
MQL5での実装(MT5用)
input int RSIPeriod = 14;
input int StochPeriod = 14;
input int SmoothK = 3;
input int SmoothD = 3;
int RSIHandle;
double RSIBuffer[];
int OnInit()
{
RSIHandle = iRSI(_Symbol, _Period, RSIPeriod, PRICE_CLOSE);
if(RSIHandle == INVALID_HANDLE)
{
Print("RSIハンドル取得失敗");
return INIT_FAILED;
}
ArraySetAsSeries(RSIBuffer, true);
return INIT_SUCCEEDED;
}
double GetRSIValue(int shift)
{
int totalBars = StochPeriod + SmoothK + SmoothD + shift + 10;
if(CopyBuffer(RSIHandle, 0, 0, totalBars, RSIBuffer) < totalBars)
return -1.0;
return RSIBuffer[shift];
}
// MQL5版StochRSI計算
double CalcStochRSI(int shift)
{
double rsiArr[];
ArrayResize(rsiArr, StochPeriod);
for(int i = 0; i < StochPeriod; i++)
{
rsiArr[i] = GetRSIValue(shift + i);
if(rsiArr[i] < 0) return -1.0;
}
double minVal = rsiArr[ArrayMinimum(rsiArr, 0, WHOLE_ARRAY)];
double maxVal = rsiArr[ArrayMaximum(rsiArr, 0, WHOLE_ARRAY)];
double currVal = rsiArr[0];
double range = maxVal - minVal;
if(range <= 0.0) return 0.5;
return (currVal - minVal) / range * 100.0; // 0〜100の値域
}
// %K(平滑化)
double GetStochRSI_K(int shift)
{
double sum = 0.0;
for(int i = 0; i < SmoothK; i++)
{
double val = CalcStochRSI(shift + i);
if(val < 0) return -1.0;
sum += val;
}
return sum / SmoothK;
}
// %D(シグナルライン)
double GetStochRSI_D(int shift)
{
double sum = 0.0;
for(int i = 0; i < SmoothD; i++)
{
double val = GetStochRSI_K(shift + i);
if(val < 0) return -1.0;
sum += val;
}
return sum / SmoothD;
}
void OnDeinit(const int reason)
{
IndicatorRelease(RSIHandle);
}
EAでのStochRSIシグナル設計
シグナルパターン1: 水準逆張り
// 20以下で売られ過ぎ → 買い候補
// 80以上で買われ過ぎ → 売り候補
double stochK0 = GetStochRSI_K(0);
double stochK1 = GetStochRSI_K(1);
if(stochK1 <= 20.0 && stochK0 > 20.0) { /* 買い候補 */ }
if(stochK1 >= 80.0 && stochK0 < 80.0) { /* 売り候補 */ }
シグナルパターン2: %Kと%Dのクロス
double k0 = GetStochRSI_K(0);
double d0 = GetStochRSI_D(0);
double k1 = GetStochRSI_K(1);
double d1 = GetStochRSI_D(1);
// KがDを上抜け(買いシグナル)
if(k1 < d1 && k0 >= d0 && k0 < 50.0) { /* 売られ過ぎゾーンでの買い */ }
// KがDを下抜け(売りシグナル)
if(k1 > d1 && k0 <= d0 && k0 > 50.0) { /* 買われ過ぎゾーンでの売り */ }
必須フィルター: ADXとのセット使用
StochRSIはシグナル頻度が高いため、単独使用ではレンジ相場での連続損失が起きやすい。ADXとの組み合わせが現実的に必要だ:
// ADX < 20のレンジ相場でのみStochRSI逆張りを使用
bool isRange = (GetADX() < 20.0);
if(isRange && stochRSIBuySignal)
{
// 逆張り買いエントリー
}
逆に、ADX≥25のトレンド相場では、StochRSIをエントリータイミングの確認用フィルターとして使う:
// トレンド相場: SuperTrendが緑 + StochRSIが50ラインを上抜けでエントリー
bool isTrend = (GetADX() >= 25.0);
bool stochConfirm = (GetStochRSI_K(1) < 50.0 && GetStochRSI_K(0) >= 50.0);
if(isTrend && superTrendBull && stochConfirm)
{
// トレンドフォロー買いエントリー
}
パラメータ設定のガイドライン
StochRSIのデフォルト設定(TradingViewなど):
| パラメーター | デフォルト | 説明 | |------------|----------|-----| | RSI期間 | 14 | RSI計算の基礎期間 | | ストキャスティクス期間 | 14 | StochRSI算出の参照本数 | | %K平滑 | 3 | Kラインの平滑化 | | %D平滑 | 3 | シグナルラインの平滑化 |
短期スキャルピング向けには(5, 5, 3, 3)のように期間を短縮する設定が試みられることがある。バックテストで効果を確認してから採用すること。
Claudeと会話しながらインジケータが作れるhedgrow-fxはこちら
よくある質問(FAQ)
Q: StochRSIとRSIではどちらをEAに使うべきですか? A: シグナルの頻度と安定性のバランスを考えると、初期設計では通常のRSIの方が扱いやすいです。StochRSIは高感度が必要な短期戦略や、RSIのシグナルを「早めに確認するための補助指標」として使うケースが多いです。
Q: TradingViewのStochRSIと同じ結果をMQL4/MQL5で出せますか? A: プラットフォームによってRSIの初期計算(Wilder's EMAか単純EMAか)に差異があることがあります。完全に同一にするには実装の詳細をすり合わせる必要がありますが、実用上は大きな差はありません。
Q: StochRSIが0または100の状態が続く場合はどうすればよいですか? A: RSIが一定範囲に収まり続けるとStochRSIが0または100に張り付くことがあります。この状態は「参照期間内のRSIの変動幅がほぼない」ことを意味します。この局面ではStochRSIのシグナルは信頼性が低いため、エントリーを見合わせることを推奨します。
Q: MT4の「Stochastic Oscillator」とStochRSIは別物ですか? A: 別物です。MT4標準の「Stochastic Oscillator」は価格(終値)を参照しますが、「Stochastic RSI」はRSIの値をストキャスティクス化したものです。計算のベースが価格かRSI値かという根本的な違いがあります。
著者情報
本記事は金融工学・アルゴリズム取引の実務経験を持つライターが執筆しています。
免責事項: 本記事はFXの教育・情報提供を目的としており、投資勧誘を行うものではありません。FX取引には元本割れリスクがあります。バックテスト結果は将来の運用成果を保証しません。実際の取引は自己責任で行ってください。
