RSIとMAのクロスオーバーのトレンドフォロー戦略


作成日: 2024-02-20 15:31:15 最終変更日: 2024-02-20 15:31:15
コピー: 1 クリック数: 850
1
フォロー
1617
フォロワー

RSIとMAのクロスオーバーのトレンドフォロー戦略

概要

この策略は,RSI指標と2つの異なる周期のMA平均線の交差によって,市場のトレンドとエントリ入場のタイミングを判断する.この策略は,RSIが26周期平均線より高い場合にのみ多出し,RSIが26周期平均線より低い場合に空きを取って,リスクを制御する.

戦略原則

この策略は,12周期と26周期の2つのMA平均線を使用する. 12周期の快線で26周期の慢線を横切ると,市場が上昇傾向に入ると考えられる. 快線の下の慢線を横切ると,市場が下降傾向に入ると考えられる. 策略は,平均線が金交差時に多行し,死交差時に空行する.

同時に,戦略は,RSI指標を導入し,超買い超売り領域を判断する.RSIが自身の26周期平均線より高い場合にのみ,平均線が金交差時に多額のポジションを開く.RSIが自身の26周期平均線より低い場合にのみ,平均線が死亡交差時に空のポジションを開く.これは,市場が超買いまたは超売りされている場合に,強引なポジションを開くことを避け,リスクを制御する.

優位分析

この戦略は,平均線とRSI指標を組み合わせてトレンド判断と入場タイミングを有効に追跡することができる. RSI指標をフィルター条件として導入することで,ポジション開設回数を減らすことができ,震動状況で被套を避けることができる. 止まり場を設定せずに,トレンドを十分に追跡してより高い収益を達成することができる.

リスク分析

止損が設定されていないため,判断が間違っていたら,損失が拡大する可能性があります.市場が大幅な空飛ぶ場合でも,大きな損失を引き起こす可能性があります.また,RSIフィルター条件が正しく設定されていない場合でも,入場の良い機会を逃す可能性があります.

最大の損失を制御するためにストップを設定することを考えることができます. RSIのパラメータを適切に調整して,より良いフィルタリング条件を探すことができます. 市場の変動が大きい場合は,平均線のパラメータを適切に調整して,より遅い平均線を使用してトレンドを判断することができます.

最適化の方向

この戦略は以下の点で最適化できます.

  1. 異なる周期のMA平均線組合せをテストし,現在の市場状況の特徴に最も適合する平均線パラメータを探します.

  2. RSIの異なる周期パラメータ,異なるフィルター条件をテストし,入場タイミングを最適化する.

  3. 他の指標やフィルター条件を加え,システムの安定性を高める.例えば,追加量能指標,取引量指標など,トレンド判断に関連する指標.

  4. トレンドを追跡しながらリスクを制御するストップ戦略を最適化します. ストップトラッキングストップ,パーセンテージストップ,ダイナミックストップなどのストップ戦略をテストできます.

要約する

この戦略は,全体的に比較的シンプルで直接的で,均線交差判断によってトレンドを判断し,RSIは強引な開場を避け,トレンドを追跡することで,よりよい収益を達成することができる.パラメータの最適化,その他の指標の追加などの方法によって,この戦略をさらに完善し,複雑な変動する市場環境に適したものにすることができる.

ストラテジーソースコード
/*backtest
start: 2023-02-13 00:00:00
end: 2024-02-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2

strategy(title = "EMA Cross Strategy", shorttitle = "EMA Cross",calc_on_order_fills=true,calc_on_every_tick =true, initial_capital=21000,commission_value=.25,overlay = true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100)
StartYear = input(2018, "Backtest Start Year")
StartMonth = input(1, "Backtest Start Month")
StartDay = input(1, "Backtest Start Day")
UseStopLoss = input(false,"UseStopLoss")
//rsiLong = true
rsi1 = rsi(close, 14)

window() => true

stopLoss = input(20, title = "Stop loss percentage(0.1%)")
//stopLoss = input(200, title = "Stop loss percentage(0.1%)")

maFastSource   = input(defval = open, title = "Fast MA Source")
maFastLength   = input(defval = 12, title = "Fast MA Period", minval = 1)
// long ma
maSlowSource   = input(defval = open, title = "Slow MA Source")
maSlowLength   = input(defval = 26, title = "Slow MA Period", minval = 1)

maFast = ema(maFastSource, maFastLength)
maSlow = ema(maSlowSource, maSlowLength)

//12 and 26=9%; 3 and8=2%; 26 and 55=2%; when selling on a cross under
//maFastRSI = ema(rsi1, 12)
//maSlowRSI = ema(rsi1, 26)

fast = plot(maFast, title = "Fast MA", color = #7a8598, linewidth = 2, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #e08937, linewidth = 2, style = line, transp = 50)


longEMA = crossover(maFast, maSlow)
exitLong = crossunder(maFast, maSlow) // 5% in 2018
//exitLong = crossunder(close, maFast) // 15% in 2018
//exitLong = crossunder(rsi1, maFastRSI) // 13%

shortEMA = crossover(maSlow, maFast)
exitShort = crossover(maFast, maSlow)

//if (rsi1 < ema(rsi1,7))
//rsiLong = false

//if (longEMA and (rsi1 >= highest(rsi1,10)))
//if (longEMA)
if (longEMA and (rsi1 > ema(rsi1,26)))  //RSI ema values optimal from 19 to 35
    strategy.entry("LongId", strategy.long, when=window())

//strategy.close_all(when = rsi1 > 60) // 80=26%, 90=n/a, 70=15%, 60=16% long only
//strategy.close_all(when = (shortEMA and (rsi1 <= ema(rsi1,26)))) //10% gain in 2018 long only
//strategy.close_all(when = (rsi1 <= ema(rsi1,120))) //26=17% 14=2% 42=15%
//strategy.close_all(when = (shortEMA)) // 5% gain in 2018 long only
//strategy.close_all(when = exitLong) 

//if (shortEMA and not(rsiLong))
//if (shortEMA)
if (shortEMA and (rsi1 <= ema(rsi1,26)))
    strategy.entry("ShortId", strategy.short, when=window())

if (UseStopLoss)
    strategy.exit("StopLoss", "LongId", loss = close * stopLoss / 1000 / syminfo.mintick)
    strategy.exit("StopLoss", "ShortId", loss = close * stopLoss / 1000 / syminfo.mintick)