📝 概要
今回は、SMA Cross + RSI + Fibo Retracement Strategy を紹介します。
この戦略は、2本のSMAのクロスをベースにしながら、RSIとリトレースメント水準を組み合わせてエントリーを絞るストラテジーです。リトレースは以下から選べるようになっています。デフォルトは50%。
23.6%、38.2%、50%、61.8%、78.6%
つまり、単純なSMAクロスではなく、
・2本のSMAのクロスで大きな方向を見る
・直近50本の終値レンジからリトレースメント水準を計算する
・価格がその水準より上か下かを確認する
・RSIで買われすぎ、売られすぎを避ける
・決済はRSIの過熱ラインで行う
という構成になっています。
ざっくり言えば、
「SMAクロスで方向を見て、Fibo風の水準で価格位置を見て、RSIで過熱感を見る」
という戦略です。
※ただし、Fiboラインに綺麗に反発しているかではなく、押し(戻し)がFiboラインまでは来ていないよね?という確認をしてエントリーするロジックです。
バックテスト
EURNZD、4時間足でリトレースを変えたときの成績の変化を見てみましょう。
23.6%

38.2%

50%

61.8%

78.6%

🎯 作成の意図
このストラテジーの狙いは、2本のSMAのクロスを使って中長期のトレンド転換を捉えつつ、リトレースメント水準とRSIでエントリーの質を少しだけ高めることです。
SMAのクロスは、昔からよく使われる王道のトレンド判定です。
50SMAが200SMAを上抜けると、一般的にはゴールデンクロス。
50SMAが200SMAを下抜けると、一般的にはデッドクロス。
ただし、この手の移動平均クロスには弱点があります。それは、シグナルが遅れやすいことです。移動平均線は過去価格の平均なので、価格がすでにかなり動いたあとにクロスが発生することがあります。
つまり、ゴールデンクロスが出た時点で、もう結構上がっている。デッドクロスが出た時点で、もう結構下がっている。そういう場面も普通にあります。
そこで、このコードではリトレースメント水準を使っています。
直近50本の終値レンジを見て、その中の23.6%、38.2%、50%、61.8%、78.6%のどの水準をエントリー判定に使うか選べるようにしています。
ロングでは、終値がその水準より上にあることを条件にします。
ショートでは、終値がその水準より下にあることを条件にします。
これにより、SMAクロスだけではなく、価格が直近レンジのどの位置にいるのかもチェックできます。
また、RSIもフィルターとして使っています。
ロングではRSIが70未満であること。
ショートではRSIが30超えであること。
つまり、すでに買われすぎ、売られすぎの状態では入らないようにしています。
RSIは決済にも使います。
ロング保有中にRSIが70を超えたら決済。
ショート保有中にRSIが30を下回ったら決済。
エントリーでは過熱を避け、ポジションを持ったあとに過熱したら利食いする。分かりやすい設計です。
今回のバージョンで大きいのは、リトレースメント水準を選べるようにした点です。
50%固定だと、「半値より上か下か」というざっくり判定になります。一方で、38.2%や61.8%を選べるようにすると、かなり戦略の性格が変わります。
たとえば、23.6%を選ぶと、ロング条件は比較的ゆるくなりやすいです。78.6%を選ぶと、ロング条件はかなり厳しくなりやすいです。
ショートではその逆のニュアンスも出てきます。
このへんは、銘柄や時間足によって相性が大きく変わる部分です。
なお、50%はフィボナッチ・リトレースメントでよく表示される水準ですが、厳密にはフィボナッチ比率そのものではありません。
ただ、実務では半値戻しとして非常によく見られる水準です。
そのため、この戦略は「フィボナッチ比率をガチガチに使う」というより、直近レンジに対するFibo風のリトレースメント水準をエントリーフィルターとして使う戦略、と見るのが自然です。
📘 コード(戦略部分)の解説
リトレースメント設定です。
retracementPct = input.string('50%', title = 'Retracement Level', options = ['23.6%', '38.2%', '50%', '61.8%', '78.6%'])
retracementRatio = switch retracementPct
'23.6%' => 0.236
'38.2%' => 0.382
'50%' => 0.500
'61.8%' => 0.618
'78.6%' => 0.786
=> 0.500
ここで、エントリー判定に使うリトレースメント水準を選べるようにしています。
次に、直近50本の終値レンジを計算します。
highestClose50 = ta.highest(close, 50)
lowestClose50 = ta.lowest(close, 50)
highestCloseChanged = bool(ta.change(highestClose50))
lowestCloseChanged = bool(ta.change(lowestClose50))
highestClose50 は、過去50本の終値の最高値です。lowestClose50 は、過去50本の終値の最安値です。
ここで注意したいのは、高値・安値ではなく、終値を使っている点です。
ヒゲの先端ではなく、ローソク足がどこで確定したかを基準にしています。
そのため、ヒゲで一瞬だけ飛んだ価格よりも、少し落ち着いたレンジ判定になります。
次に、レンジ上限、レンジ下限、リトレースメント水準を保持する設定です。
retracementLevel := rangeHighClose - (rangeHighClose - rangeLowClose) * retracementRatio
たとえば、直近50本の終値レンジが100円から120円だったとします。
50%なら、リトレースメント水準は110円です。
38.2%なら、120円からレンジ幅20円の38.2%ぶん下げた水準なので、112.36円です。
61.8%なら、107.64円です。
つまり、同じレンジでも、選ぶ水準によってエントリー判定ラインが変わります。
ロングの場合は、終値がこのラインより上にあることを条件にします。
ショートの場合は、終値がこのラインより下にあることを条件にします。
次に、エントリー条件です。
bullishCross = ta.crossover(fastSma, slowSma)
bearishCross = ta.crossunder(fastSma, slowSma)
longCondition = inBacktestWindow and bullishCross and close > retracementLevel and rsiValue < 70
shortCondition = inBacktestWindow and bearishCross and close < retracementLevel and rsiValue > 30
ロング条件は、
・バックテスト期間内
・短期SMAが長期SMAを上抜け
・終値が選択したリトレースメント水準より上
・RSIが70未満
です。ショートは逆。
🔏コアメンバー向けソースコード
こちらからどうぞ。



コメント