この戦略は,異なる期間の2つの指数関数移動平均値 (EMA) とストーカスティックRSIを活用し,中長期市場動向を把握する.主なアイデアは,EMAクロスオーバーに基づいてトレンド方向を決定することであり,ストーカスティックRSIをトレンド強さと潜在的な逆転の確認信号として使用する.トレンド開始時にポジションを開き,終わりに閉じます.
速いEMAと遅いEMAを計算する.速いEMAのデフォルトパラメータは12,遅いEMAのパラメータは25. これらは市場の特徴と取引頻度に基づいて調整することができます.
上昇傾向/下落傾向を決定する:
トレンド確認:上昇/下落の信号が表示された後,トレンドを確認するために,2つの連続した上昇/下落のキャンドルが必要です.これは誤った信号をフィルタリングするのに役立ちます.
ストカスティックRSIを補助判断として使用します.
異なる期間の2つのEMAを使用することで,戦略はトレンドキャプチャの敏感性と信頼性をよりうまくバランスできます.分析によると,12/25期間のEMA組み合わせは,中長期のトレンドに対して良好なパフォーマンスを発揮しています.
トレンド確認メカニズムは ほとんどの誤った信号を効果的にフィルタリングし 勝利率を向上させることができます
ストカスティックRSIは補助判断として機能し,初期段階でのトレンド強さを評価し,後期段階での潜在的な逆転を事前に警告します.
戦略の論理はシンプルで,パラメータは少ないので,理解し実行しやすい.また,さまざまな市場や手段に適用できます.
EMAは遅れの指標であり,トレンド逆転の開始時に重大な滑り込みを引き起こす可能性があります.
トレンドフォロー戦略は,通常,不安定な市場では劣る.この戦略は,レンジ・バインド条件に対して特定の判断がない.
ストカスティックRSIは,極端な市場変動の間,誤った信号を生成し,判断の質に影響を与えます.
固定パラメータはすべての市場条件に適応できないので,市場の特徴に基づいて動的調整が必要になります.
ATRのような変動指標を導入し, EMAパラメータを動的に調整し,異なる市場リズムに適応する.
波長帯の幅を組み合わせるような範囲限定市場に対する判断を加え,不安定な条件で頻繁な取引を避ける.
信号の信頼性を高めるため,ストカスト的RSIの上に,音量の変化などの追加の基準を組み込む.
市場の相関を考慮し,システムのリスク回復力を高めるため,多資産間の市場信号を導入します.
この戦略は,トレンドフォローとモメンタム逆転に基づいた中長期的な取引アプローチを形成するために,EMAとストーカスティックRSIの強みを効果的に活用する.EMAクロスオーバーを通じてトレンドを把握し,ストーカスティックRSIでトレンド強さを確認し,逆転の警告を行い,トレンド確認メカニズムでシグナル品質を改善する.この3つのコンポーネントが有機的に結合してシンプルで効果的な定量的な取引戦略フレームワークを作成する.その主な利点は,簡潔な論理,数少ないパラメータ,低い実装困難度,広範な適用性にある.しかし,この戦略には,大きな滑りや不安定な市場に適応できないという固有の制限もあります.将来の強化は,ダイナミックパラメータ最適化,より多くの補助基準を導入し,市場間リンクメカニズムを構築することに焦点を当てることができます.全体として,これは量的な戦略で,最適化と広範囲の応用見通しが有望です.
/*backtest start: 2023-03-02 00:00:00 end: 2024-03-07 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy('[Jacky] Trader XO Macro Trend Scanner', overlay=true) // Variables var ok = 0 var countBuy = 0 var countSell = 0 src = input(close, title='OHLC Type') i_fastEMA = input(12, title='Fast EMA') i_slowEMA = input(25, title='Slow EMA') i_defEMA = input(25, title='Consolidated EMA') // Allow the option to show single or double EMA i_bothEMAs = input(title='Show Both EMAs', defval=true) // Define EMAs v_fastEMA = ta.ema(src, i_fastEMA) v_slowEMA = ta.ema(src, i_slowEMA) v_biasEMA = ta.ema(src, i_defEMA) // Color the EMAs emaColor = v_fastEMA > v_slowEMA ? color.green : v_fastEMA < v_slowEMA ? color.red : #FF530D // Plot EMAs plot(i_bothEMAs ? na : v_biasEMA, color=emaColor, linewidth=3, title='Consolidated EMA') plot(i_bothEMAs ? v_fastEMA : na, title='Fast EMA', color=emaColor) plot(i_bothEMAs ? v_slowEMA : na, title='Slow EMA', color=emaColor) // Colour the bars buy = v_fastEMA > v_slowEMA sell = v_fastEMA < v_slowEMA if buy countBuy += 1 countBuy if buy countSell := 0 countSell if sell countSell += 1 countSell if sell countBuy := 0 countBuy buysignal = countBuy < 2 and countBuy > 0 and countSell < 1 and buy and not buy[1] sellsignal = countSell > 0 and countSell < 2 and countBuy < 1 and sell and not sell[1] barcolor(buysignal ? color.green : na) barcolor(sellsignal ? color.red : na) // Strategy backtest if (buysignal) strategy.entry("Buy", strategy.long) if (sellsignal) strategy.entry("Sell", strategy.short) // Plot Bull/Bear plotshape(buysignal, title='Bull', text='Bull', style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.black, 0), size=size.tiny) plotshape(sellsignal, title='Bear', text='Bear', style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.black, 0), size=size.tiny) bull = countBuy > 1 bear = countSell > 1 barcolor(bull ? color.green : na) barcolor(bear ? color.red : na) // Set Alerts alertcondition(ta.crossover(v_fastEMA, v_slowEMA), title='Bullish EMA Cross', message='Bullish EMA crossover') alertcondition(ta.crossunder(v_fastEMA, v_slowEMA), title='Bearish EMA Cross', message='Bearish EMA Crossover') // Stoch RSI code smoothK = input.int(3, 'K', minval=1) smoothD = input.int(3, 'D', minval=1) lengthRSI = input.int(14, 'RSI Length', minval=1) lengthStoch = input.int(14, 'Stochastic Length', minval=1) rsi1 = ta.rsi(src, lengthRSI) k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK) d = ta.sma(k, smoothD) bandno0 = input.int(80, minval=1, title='Upper Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)') bandno2 = input.int(50, minval=1, title='Middle Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)') bandno1 = input.int(20, minval=1, title='Lower Band', group='Bands (change this instead of length in Style for Stoch RSI colour to work properly)') // Alerts crossoverAlertBgColourMidOnOff = input.bool(title='Crossover Alert Background Colour (Middle Level) [ON/OFF]', group='Crossover Alerts', defval=false) crossoverAlertBgColourOBOSOnOff = input.bool(title='Crossover Alert Background Colour (OB/OS Level) [ON/OFF]', group='Crossover Alerts', defval=false) crossoverAlertBgColourGreaterThanOnOff = input.bool(title='Crossover Alert >input [ON/OFF]', group='Crossover Alerts', defval=false) crossoverAlertBgColourLessThanOnOff = input.bool(title='Crossover Alert <input [ON/OFF]', group='Crossover Alerts', defval=false) maTypeChoice = input.string('EMA', title='MA Type', group='Moving Average', options=['EMA', 'WMA', 'SMA', 'None']) maSrc = input.source(close, title='MA Source', group='Moving Average') maLen = input.int(200, minval=1, title='MA Length', group='Moving Average') maValue = if maTypeChoice == 'EMA' ta.ema(maSrc, maLen) else if maTypeChoice == 'WMA' ta.wma(maSrc, maLen) else if maTypeChoice == 'SMA' ta.sma(maSrc, maLen) else 0 crossupCHECK = maTypeChoice == 'None' or open > maValue and maTypeChoice != 'None' crossdownCHECK = maTypeChoice == 'None' or open < maValue and maTypeChoice != 'None' crossupalert = crossupCHECK and ta.crossover(k, d) and (k < bandno2 or d < bandno2) crossdownalert = crossdownCHECK and ta.crossunder(k, d) and (k > bandno2 or d > bandno2) crossupOSalert = crossupCHECK and ta.crossover(k, d) and (k < bandno1 or d < bandno1) crossdownOBalert = crossdownCHECK and ta.crossunder(k, d) and (k > bandno0 or d > bandno0) aboveBandalert = ta.crossunder(k, bandno0) belowBandalert = ta.crossover(k, bandno1) bgcolor(color=crossupalert and crossoverAlertBgColourMidOnOff ? #4CAF50 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert Background Colour (Middle Level)', transp=70) bgcolor(color=crossupOSalert and crossoverAlertBgColourOBOSOnOff ? #fbc02d : crossdownOBalert and crossoverAlertBgColourOBOSOnOff ? #000000 : na, title='Crossover Alert Background Colour (OB/OS Level)', transp=70) bgcolor(color=aboveBandalert and crossoverAlertBgColourGreaterThanOnOff ? #ff0014 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert - K > Upper level', transp=70) bgcolor(color=belowBandalert and crossoverAlertBgColourLessThanOnOff ? #4CAF50 : crossdownalert and crossoverAlertBgColourMidOnOff ? #FF0000 : na, title='Crossover Alert - K < Lower level', transp=70) alertcondition(crossupalert or crossdownalert, title='Stoch RSI Crossover', message='STOCH RSI CROSSOVER')