移動平均線とRSIを組み合わせる考え方 — トレンドフィルターとモメンタムを両立する設計
RSI(相対力指数)は便利なオシレーターですが、強いトレンド相場では70以上・30以下に張り付いて反転シグナルを連発しやすいという弱点があります。一方、移動平均線(Moving Average, MA)はトレンド方向を判定する典型的な指標ですが、レンジ相場ではダマシのシグナルが頻発します。両者は性格が異なるため、組み合わせると互いの弱点を埋め合わせる設計が組みやすくなります。
本記事では、移動平均線とRSIを組み合わせて使うときの考え方と、cBotとして実装する際に意識したい注意点を整理します。あくまで「実装の参考」としての位置づけであり、特定の数値が成果を保証するという話ではありません。
移動平均線の役割
移動平均線は、一定期間の終値(または高値・安値)を平均し、価格の中心線を可視化する指標です。SMA(単純移動平均)、EMA(指数平滑移動平均)、WMA(加重移動平均)など複数の派生があり、cTraderにも標準搭載されています。
単独利用での代表的な見方は次の3つです。
- 価格との位置関係: 価格がMAの上にあれば上昇基調、下にあれば下降基調と捉える
- 傾き: MA自体が上向きか下向きかでトレンドの強さを観察する
- クロス: 短期MAが長期MAを上抜ける(ゴールデンクロス)/下抜ける(デッドクロス)で転換を検知する
ただし、移動平均線は 過去の平均値を取る遅行指標 です。価格が反転しても、MAの向きが変わるまでには時間差があります。また、レンジ相場ではMAの傾きが緩く、価格がMAを何度も跨ぐためダマシが頻出します。「方向感のある相場でこそ機能する」という性質を理解しておくと、運用設計の前提を間違えにくくなります。
RSIの役割
RSIは一定期間の上昇幅と下落幅のバランスを0〜100で数値化するオシレーター系インジケーターです。基礎的な仕様は別記事のRSI(相対力指数)とはにまとめていますので、必要に応じて参照してください。
単独利用では「70以上で買われすぎ」「30以下で売られすぎ」という閾値を目安に、反転候補を探す使い方が一般的です。ダイバージェンス(価格とRSIの逆行)や、50ラインの上抜け/下抜けを観察する手法もあります。
ただし、強いトレンド相場ではRSIが70以上または30以下に張り付いたまま推移しがちで、閾値を素直に解釈すると逆張りシグナルを連発してしまいます。RSI単独では「いまの相場はトレンドなのかレンジなのか」を判別できないため、別の方法でトレンドの有無を判定する仕組みが欲しくなります。
なぜこの組み合わせか
移動平均線が答えるのは「いまの相場はどちら向きか」であり、RSIが答えるのは「直近の値動きはどちらに偏っているか」です。両者は質問の粒度が違うため、役割分担が成立します。
考え方の例を挙げます。
- 価格がMAの上、かつMAが上向き → 上昇トレンドと判定
- その状態でRSIが30付近まで下げて反発 → 上昇トレンドの中の 押し目候補
- 価格がMAの下、かつMAが下向き → 下降トレンドと判定
- その状態でRSIが70付近まで上げて反落 → 下降トレンドの中の 戻り高値候補
このようにMAでトレンド方向を絞り込み、RSIで「そのトレンドに沿った逆張り戻り」だけを拾う設計にすると、強トレンド中にRSI閾値を素直に解釈してしまう典型的な失敗パターンを避けやすくなります。一般論として、ノイズフィルターとして機能することが期待できます。
注意点として、レンジ相場ではMAの傾きが小さく、フィルターとしての判定力が落ちます。MAの傾きが一定以上のときだけシグナルを採用する、ADXなどトレンド強度を測る別指標で補強する、といった設計判断が必要になることがあります。「組み合わせた瞬間にすべて解決する」わけではない点は最初から織り込んでおくと、運用上の期待値ズレを起こしにくくなります。
パラメータをどう考えるか
唯一の正解があるわけではありません。検証して自分の運用時間軸に合うものを選ぶ前提で、方向性だけ整理します。
移動平均線の期間 は、長期目線なら200、中期目線なら50、短期目線なら20が定番として参照されます。デイトレ・スキャル寄りなら短い期間、スイング寄りなら長い期間に重みを置く設計が一般的です。EMAはSMAより反応が早い反面、ノイズも拾いやすい性格があります。
RSIの期間 は標準が14です。短くすれば反応が早くなる代わりにダマシが増え、長くすれば滑らかになる代わりに転換の検知が遅れる傾向があると言われています。閾値も70/30に固定せず、銘柄や時間足によっては80/20や65/35といった調整が検討されます。
時間足の組み合わせも設計要素です。MAは上位足(H1やH4)で大局を判定し、RSIは下位足(M15やM5)でタイミングを取る、という マルチタイムフレーム 構成にすると、シグナル頻度と精度のバランスが取りやすくなります。
いずれの場合も、過去データでバックテストして、自分の運用時間帯・銘柄での挙動を確認するプロセスを省略しないことが重要です。
cBot化する際の考慮点
cTraderのcBotとして実装する場合、設計面でいくつか押さえておきたいポイントがあります。
データ取得タイミング: OnBar(確定足)で判定するのか、OnTickで判定するのかを最初に決めます。RSIや移動平均線は確定足ベースで運用するのが一般的で、OnBarのほうがシグナルが安定しやすいです。ティックベースで判定すると同一バー内でシグナルがばたつくため、確定済みバーのみを参照する設計が安全です。
計算順序の依存関係: MAとRSIは互いに独立して計算できますが、判定ロジックは両方の値が揃ってから走らせる必要があります。バー数が不足している起動直後は、LastValue が NaN を返す場合があるため、null/NaNチェックを忘れずに行います。
状態管理: ポジションを保有しているかどうか、エントリー条件と決済条件を別関数に分けるか、といった設計判断が必要です。シグナルが出続けても、すでにポジションがある銘柄では新規エントリーをスキップする、といった制御を入れる構造が一般的です。
簡単な疑似コード断片を挙げます。
// 例: 計算順序とNullチェック
var ma = Indicators.MovingAverage(Bars.ClosePrices, 50, MovingAverageType.Simple);
var rsi = Indicators.RelativeStrengthIndex(Bars.ClosePrices, 14);
double maValue = ma.Result.LastValue;
double rsiValue = rsi.Result.LastValue;
double price = Bars.ClosePrices.LastValue;
if (double.IsNaN(maValue) || double.IsNaN(rsiValue)) return;
bool uptrend = price > maValue && ma.Result.IsRising();
bool pullback = rsiValue < 35;
// uptrend && pullback を「押し目候補」として記録するなど
実装初期は、シグナル発生のたびに値をログ出力しておくと、後からチャート上の動きと突き合わせて検証しやすくなります。
実装の流れ
ロジックを cBot に落とし込むときの全体像を、入力→計算→判定→出力の流れで整理します。
- 入力: 監視する銘柄・時間足を決め、
Bars.ClosePricesから終値系列を取得する - 計算: 移動平均線とRSIを別々に計算し、それぞれの最新値・1本前の値を取得する
- 判定:
- トレンド判定: 価格とMAの位置関係、MAの傾きをチェック
- タイミング判定: トレンド方向に沿った側のRSI閾値突破を検出
- 出力: シグナル(BUY候補 / SELL候補 / WAIT)を、ログまたは外部ダッシュボードに送る
判定をエントリー実行に直結させるか、シグナル可視化までで止めるかは、設計者の運用スタイル次第です。判断材料の可視化までで止める設計は、シグナル監視ワークフローに組み込みやすく、初期段階としても扱いやすい構成です。
どう活用するか
この設計図は、目的別に活用できます。
自作派の方は、Claude Code を使った cBot 開発の構造ドキュメントとして、本記事の節構造をそのまま設計書に流用してみてください。委託派の方は、ai-programming.xyz への開発相談時に「この組み合わせのcBotを作りたい」という前提を共有しておくと、要件詰めがスムーズになります。教育派の方は、スクールでの実践課題のテーマとして、本記事の判定ロジックを自分の手で実装してみる演習に使えます。
移動平均線とRSIの組み合わせは、ロジックの組み合わせの中でも最も基礎的な部類です。ここで「役割分担」「弱点の補完」「実装上の状態管理」という考え方を身につけておくと、より複雑な組み合わせ(MA + RSI + ATR、ボリンジャーバンド + RSI など)へ拡張するときの土台になります。
本記事は一般的な情報提供を目的としています。投資助言ではありません。 取引判断はご自身の責任で行ってください。