RSI EMAクロスオーバー戦略

作者: リン・ハーンチャオチャン,日付: 2023年10月25日 11:46:49
タグ:

img

概要

この戦略は,指数的な移動平均 (EMA) のクロスオーバーの原則をRSI指標と組み合わせて,エントリーと出口のトレンド方向を決定します.

戦略の論理

この戦略は,異なる期間の3つの EMAライン - 急速,中,緩やかなラインを使用します.高速 EMAが中間 EMAを横切ると購入信号が生成され,高速 EMAが中間 EMAを下回ると販売信号が生成されます.

この戦略には,過剰購入および過剰販売条件を測定するためのRSI指標も含まれています.RSIは,資産の相対的な強さを示すために,期間中の平均アップ日と平均ダウン日の比率を計算します.過剰購入しきい値以上の値は過剰購入条件を示し,過剰販売しきい値以下の値は過剰販売条件を示します.

戦略の購入条件は次のとおりです

  1. 価格が高速,中等,緩やかなEMA線を超越する
  2. RSIが過売値を超えた

販売条件は次のとおりです

  1. 平均EMAを下回る急速EMA
  2. RSIが中間線を下回る

この戦略は,短期的な逆転の機会を特定するためにRSIと組み合わせた EMAクロスオーバーを使用して,トレンドフォローと平均逆転の概念の両方を利用します.

利点分析

この戦略は,EMAクロスオーバーとRSIを組み合わせて,トレンドとオーバーバイト/オーバーセールレベルの両方を測定し,偽のブレイクアウトと騒々しい取引をフィルタリングします. 3つのEMAラインを使用すると,明確なトレンドバイアスが表示されます.

RSIの設定により,戦略は有利な過買い/過売りエリアで入口と出口をタイムすることができます.

取引に入る前に 3 つの EMA ラインをすべて破る価格の要求は,ウィップソーされるのを避けるのに役立ちます.

リスク分析

すべてのバックテストされた戦略と同様に,この戦略はバックテスト過適性のリスクに直面しています. ライブ取引における市場の状況の変化により,最適化されたパラメータは不適切になることがあります.

市場差で 戦略は誤った信号を生み出し 損失を伴う可能性があります

RSIパラメータの調節が不十分であれば 機会を逃したり 誤った信号を出すことがあります

増進 の 機会

  1. 騒音を避けるため,より長い時間枠で検証を加える事を検討します.

  2. 信号を検証する為の取引に入る前に EMA ラインの再テストを待つ.

  3. 組み合わせた信号確認のためにMACD,ボリンジャー帯などの他の指標を組み込む.

  4. 機械学習を使用して 安定性パラメータを最適化します

  5. 不確実なトレンドから迅速に脱出するためにストップロスを追加することを検討します.

結論

この戦略は,短期的な逆転を活用しながらトレンドを特定するためにEMAクロスオーバーとRSIを組み合わせます.トレンドフォローと平均逆転の両方の概念を効率的に利用します.信号検証,パラメータチューニング,ストップ損失などを通じて最適化する余地があります.しかし,バックテストオーバーフィッティングを考慮し,ライブパフォーマンスを評価する必要があります.全体的に,これは学習のための有用な参照として機能しますが,ライブ市場でさらなる検証が必要です.


/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © chadsadachai

//@version=5
strategy("EMA Cross V1", overlay= true)

//rsi
length = input.int(title = "Rsi Lenght" , defval=26 , minval=1, maxval=50)
overS = input.int(title = "Rsi OVS line" , defval=30 , minval=1, maxval=40)
overB = input.int(title = "Rsi OVB line" , defval=70 , minval=1, maxval=100)
mLine = input.int(title = "Rsi Medium line" , defval=42 , minval=1, maxval=60)
price = close
vrsi = ta.rsi(price, length)
co = vrsi >= mLine and vrsi < overB 
cu = ta.crossunder(vrsi, overB)
//ema
F = input.int(title = "EMA Fast" , defval=17 , minval=1, maxval=50)
M = input.int(title = "EMA Medium" , defval=35, minval=1, maxval=100)
S = input.int(title = "EMA Slow" , defval=142, minval=1, maxval=200)
emaF = ta.ema(price , F)
emaM = ta.ema(price , M)
emaS = ta.ema(price , S)

//plot
plot(emaF , color = color.green , linewidth=1)
plot(emaM , color = color.yellow , linewidth=1)
plot(emaS , color = color.red , linewidth=1)

//Time Stamp
start = timestamp(input.int(title = "Start Year" , defval=2011 , minval=2011, maxval=2025), input.int(title = "Start Month" , defval=1 , minval=1, maxval=12), input.int(title = "Start Day" , defval=1 , minval=1, maxval=31), 0, 0)
end = timestamp(input.int(title = "End Year" , defval=2025 , minval=2011, maxval=2025), input.int(title = "End Month" , defval=1 , minval=1, maxval=12), input.int(title = "End Day" , defval=1 , minval=1, maxval=31), 0, 0)
// years = input.int(title = "Year" , defval=2018 , minval=2011, maxval=2025)
// months = input.int(title = "Month" , defval=1 , minval=1, maxval=12)
// days = input.int(title = "Day" , defval=1 , minval=1, maxval=31)

//longCondition Default
// longCondition1 = EMA_Fast >= EMA_Slow and EMA_Fast >= EMA_Medium//ta.crossover(EMA_Fast, EMA_Slow)  EMA_Fast > EMA_Slow and EMA_Medium > EMA_Slow
// longCondition3 = price >= EMA_Medium and price > EMA_Slow
// longCondition2 = vrsi >= overSold and vrsi <= overBought 

//longCondition & shortCondition ETHUSD
// 1.price > emaF > emaM > emaS
// 2.rsi overcross overS
longC1 = price > emaF and price > emaM and price > emaS 
// longC1 = ta.crossover(emaF, emaM)
longC2 = if longC1
    co
// shortC1 = EMA_Fast < EMA_Medium //and EMA_Fast < EMA_Slow and EMA_Medium < EMA_Slow //and cu
// shortC2 = overBought > vrsi //and vrsi < overBought //overSold < vrsi and vrsi < mediumLine

// exitLong Condition
// 1.price < emaF < emaM < emaS
// 2.rsi overcross mediumLine
exitLong1 = ta.crossunder(emaF, emaM) //or emaF < emaM//and price < emaM and price < emaF
exitLong2 = ta.crossunder(vrsi,mLine)
//exitLong3 = price < emaM
//strategy.entry
if time >=start and time <=end
    strategy.entry("Buy", strategy.long , when = longC1 and longC2)

// if(exitLong1 or exitLong2)
strategy.close("Buy" , when = exitLong1 or exitLong2)
    
// exitShort1 = EMA_Fast > EMA_Medium
// //exitShort2 = ta.crossover(vrsi , mediumLine) 
// exitShort2 = ta.crossunder (vrsi,mediumLine)
// strategy.close("Short" , when = exitShort1 or exitShort2)
// //shortCondition = cu


// //if (shortCondition1 and shortCondition2)
//     //strategy.entry("My Short Entry Id", strategy.short)


もっと