EMA와 무작위 RSI에 기반한 다주기 트렌드 추적 거래 전략

저자:차오장, 날짜: 2024-03-08 17:32:38
태그:

基于EMA和随机RSI的多周期趋势跟踪交易策略

전략 개요

이 전략은 EMA와 무작위 RSI를 기반으로 한 다주기 트렌드 추적 트레이딩 전략으로, 두 개의 다른 주기의 지표 이동 평균 (EMA) 과 무작위 RSI를 사용하여 시장의 중장기 트렌드를 캡처합니다. 전략의 핵심 아이디어는 EMA의 교차로 트렌드 방향을 판단하는 것이며, 무작위 RSI를 트렌드 확인 및 역전 경고 신호로 결합하여 트렌드 형성 초기 입장을 지고, 트렌드 종료 후 평형을 하는 것입니다.

전략적 원칙

  1. 빠른 EMA와 느린 EMA를 계산한다. 빠른 EMA의 기본 매개 변수는 12이고 느린 EMA의 기본 매개 변수는 25이며 실제 응용에서는 시장 특성 및 거래 빈도에 따라 조정될 수 있다.

  2. 이 글의 내용은 이쪽에서 읽었습니다.

  • 빠른 EMA가 느린 EMA를 통과할 때 더 많은 신호가 생성됩니다.
  • 빠른 EMA 아래로 느린 EMA를 통과하면 비행 신호가 생성됩니다.
  1. 트렌드 확인: 보기/보기 신호가 나타나면 트렌드가 형성되는 것을 확인하기 위해 2개의 보기/보기 K 라인이 연속적으로 나타나야 한다. 이것은 가짜 신호를 필터링하는 데 도움이 된다.

  2. 무작위 RSI를 보조 판단으로 사용:

  • 무작위 RSI %K가 %D를 통과하고 %K가 20보다 낮을 때 오버셀링 신호가 발생하여 상승이 가능한 반전을 시사합니다.
  • 무작위 RSI가 %K 이하의 %D값을 통과하고 %K값이 80 이상인 경우 오버파인 신호가 발생하며, 잠재적인 하락이 뒤집어질 수 있음을 나타냅니다.
  1. 거래 전략:
  • EMA가 파견 신호를 생성하고 무작위 RSI가 파견 부위에 있지 않을 때 과잉 거래
  • EMA가 상하 신호를 발생시키고 무작위 RSI가 오버시드 부위에 있지 않을 때 빈 포지션을 개척합니다.

전략적 장점

  1. 두 개의 다른 주기의 EMA를 동시에 사용하는 것은 추세 포착의 민감성과 신뢰성을 더 잘 균형을 잡을 수 있다. 분석에 따르면 12/25 주기의 EMA 조합은 중장기 추세를 더 잘 파악한다.

  2. 트렌드 확인 메커니즘은 대부분의 가짜 신호를 효과적으로 필터링하여 전략의 승률을 높일 수 있습니다.

  3. 무작위 RSI는 보조 판단으로 트렌드 초기에서 트렌드 강도를 판단하고, 트렌드 후반에 트렌드 리버션의 가능성을 예전에 경고한다.

  4. 전략 논리는 단순하고, 파라미터가 적고, 이해와 실행에 쉽게 적용되며, 다양한 시장과 품종에 적용됩니다.

위험 분석

  1. EMA는 지각 지표이며, 트렌드 전환 초기에는 큰 슬라이드 포인트가 나타날 수 있습니다.

  2. 트렌드형 전략은 불안한 시장에서 일반적으로 나타납니다. 이 전략은 불안한 시장에 대한 전문 판단이 부족합니다.

  3. 무작위 RSI는 시장의 급격한 변동에 따라 잘못된 것으로 판단 질에 영향을 줄 수 있습니다.

  4. 고정 매개 변수는 모든 시장 상황에 적응할 수 없으며 시장 특성에 따라 동적 조정이 필요합니다.

최적화 방향

  1. ATR와 같은 변동률 지표가 도입되고, 변동률 동력에 따라 EMA 파라미터를 조정하여 다른 시장 리듬에 적응한다.

  2. 부진 시장에 대한 판단을 높이고, 예를 들어 브린 벨트 오픈 방향과 결합하여 부진 시장에서 자주 거래하는 것을 피합니다.

  3. 무작위 RSI를 기반으로 거래량 변화와 같은 더 많은 보조 판단을 통합하여 신호 신뢰성을 향상시킵니다.

  4. 시장 관련성을 고려하여 다양한 연동 신호를 도입하여 시스템의 위험 저항력을 강화합니다.

요약

이 전략은 EMA와 무작위 RSI의 장점을 최대한 활용하여 추세 추적과 동력 반전을 기반으로 한 중장기 거래 전략을 형성한다. 일평선적 트렌드 교차 포착, 무작위 RSI 확인 추세 강도 및 사전 경고 반전, 트렌드 확인 메커니즘을 통해 신호 품질을 향상시키는, 세 가지를 유기적으로 결합하여 간단하고 효과적인 정량화 거래 전략 프레임워크를 형성한다. 주요 장점은 논리 간결, 파라미터가 적고 실현 어려움이 낮고 적용 범위가 넓다. 동시에 전략은 또한 큰 미끄러움 지점이 있으며 불안정한 시장과 같은 고유한 제한적 미래에 적응할 수 없다.


/*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')





더 많은 내용