この戦略は,RSI指標と異なる期間の2つの移動平均値 (MA) のクロスオーバーによって市場動向とエントリーシグナルを決定する.RSIが26期間のMAを超える場合にのみロングになり,RSIがリスクを制御するために以下になるとショートする.
この戦略は12期と26期の2つのMAを使用する.12期間の速いMAが26期間の遅いMAを超えると,上向きの傾向を示し,その逆である.この戦略は2つのMAのゴールデンクロスオーバーで長く,デッドクロスオーバーで短くなります.
RSIインジケーターは,過剰購入/過剰販売ゾーンを決定するためにも使用されます.RSIが26期MAよりも高くなったときのみ,戦略はゴールデンクロスオーバーでロングポジションを開きます.そしてRSIが低いときのみ,死亡クロスオーバーでショートポジションを開きます.これは過剰購入/過剰販売状況に対する強制入場を避け,リスクを制御します.
MAsとRSIを組み合わせてトレンドとタイミング分析を行うことで,この戦略はトレンドを効果的に追跡することができます.RSIフィルターは取引頻度を削減し,変動する市場でウィップソウを避けます.ストップロスを使用しないことは,より高いリターンのための完全なトレンドに従うことを可能にします.
ストップ損失がなければ,誤ったシグナルで損失が増幅される可能性があります.大きなギャップ動きも大きな損失につながる可能性があります.また,正しく設定されていないRSIフィルターは,良いエントリー信号が欠落する可能性があります.
最大損失を制御するためにストップロスを使用することを検討します.より良いフィルターのためにRSIパラメータを細かく調整します.不安定な市場では,傾向を判断するために遅いMAを使用します.
戦略は以下の点で改善できる:
異なる期間のMAコンボをテストし,現在の市場状況に最も適したパラメータを見つけます.
RSI期間とフィルターロジックを最適化して より良いエントリータイミングを設定します
システム安定性を高めるため 音量などの他の指標を追加します
トレイルストップ,パーセントストップ,ダイナミックストップなど,トレンドフォローとリスクコントロールをバランスさせるストップロスの戦略を最適化する.
この戦略は比較的シンプルで,トレンドとRSIを決定するためにMAクロスオーバーを使用し,強要入力を避けるため,良いリターンのトレンドを追跡する.パラメータ調整や複雑な市場環境に適合する他のフィルターを追加することで,さらなる改善が可能である.
/*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)