변동성 추세 추적 전략 기반


생성 날짜: 2024-02-18 10:07:29 마지막으로 수정됨: 2024-02-18 10:07:29
복사: 0 클릭수: 538
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

변동성 추세 추적 전략 기반

개요

이 전략은 WaveTrend 지표를 통해 가격 트렌드와 오버 바이 오버 소드를 판단하고, RSI 지표 필터링 신호와 결합하여 트렌드 추적 방식을 사용하여 오버 바이 오버 소드 지점에서 역으로 작동한다.

전략 원칙

이 전략은 WaveTrend 지표를 사용하여 가격 트렌드 방향을 판단한다. WaveTrend 지표는 Rainbow 지표에 기반하여 Heikin-Ashi 평균선과 가격 절대값 사이의 차이를 계산하여 가격 트렌드 방향을 판단한다. RSI 지표와 결합하여 오버 바이 오버 셀 상황을 판단하여 거래 신호를 발송한다.

특히 WaveTrend의 공식은 다음과 같습니다.

esa = ema(hlc3, 10) 
d = ema(abs(hlc3 - esa), 10)
ci = (hlc3 - esa) / (0.015 * d)
wt = ema(ci, 21)

이 중, esa는 계산된 하이킨-아시 평균선, d는 하이킨-아시 평균선과 가격 절대값의 차이의 평균값이다.

RSI 지표는 과매매를 판단하는 데 사용되며, 코드에서 RSI의 계산 공식은 다음과 같습니다.

rsiup = rma(max(change(close), 0), 14) 
rsidown = rma(-min(change(close), 0), 14) 
rsi = rsidown == 0 ? 100 : rsiup == 0 ? 0 : 100 - (100 / (1 + rsiup / rsidown))

표준값은 0-100이며, 70 이상은 초고가 지역이고, 30 이하는 초판 지역이다.

이 두 지표가 결합되면, RSI가 25보다 낮으면 WaveTrend이 60보다 낮으면 오버셀 지역으로, 더 많은 신호를; RSI가 75보다 높으면, WaveTrend이 60보다 높으면 오버 바이 지역으로, 더 많은 신호를.

우위 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. WaveTrend 지표를 사용하여 가격 트렌드 방향을 정확하게 판단하십시오.
  2. RSI 지수 필터링은 불필요한 거래를 피하고 승률을 높여줍니다.
  3. 트렌드 트래킹을 사용하면 가격 트렌드에서 오는 수익을 최대화 할 수 있습니다.
  4. 전략은 명확하고 이해하기 쉽고, 매개 변수 설정은 유연하며, 다른 품종과 시장에 따라 조정할 수 있다.
  5. 전략 구현은 간단하고, 실무에서 쉽게 검증할 수 있으며, 프레임워크를 최적화할 수 있습니다.

위험 분석

이 전략에는 몇 가지 위험도 있습니다.

  1. 웨이브 트렌드 (WaveTrend) 와 RSI (RSI) 모두 지연되어 가격 반전 지점을 놓칠 수 있습니다.
  2. 필터링 조건이 있음에도 불구하고, 진동 시 오류 신호가 발생할 수 있습니다.
  3. 단편적 손실을 효과적으로 통제할 수 없는, 손실을 추적하는 전략이 아직 완성되지 않았다.
  4. 변수 설치는 품종 특성과 거래 빈도와 합리적 일치하는 것이 매우 중요합니다.

대책:

  1. 추가 판단 지표와 결합하여 최적화하여 신호 정확도를 향상시킵니다.
  2. 단독 손실을 통제하기 위해 Stop Loss 전략에 참여하십시오.
  3. 최적의 변수 조합을 찾고, 시장의 품종에 맞게 전략을 조정한다.

최적화 방향

이 전략은 다음과 같은 방향으로 최적화될 수 있습니다.

  1. 판단 지표를 교체하거나 판단 지표를 추가하여 신호의 정확도를 최적화한다. 예를 들어 MACD, KD 등의 판단 지표를 추가한다.

  2. 최적화된 파라미터 설정을 사용하여 다양한 거래 유형에 맞게 조정한다. 예를 들어, 부드러운 주기를 조정하여 최적의 파라미터 조합을 찾는다.

  3. 추적한 스톱로즈 전략에 가입하여 단독 손실을 효과적으로 제어한다. 예를 들어, 잔액 비율 스톱로즈, 이동 스톱로즈 등이다.

  4. 다른 포지션 전략을 고려하십시오. 예를 들어 마틴겔 포지션을 사용하여 원래의 고정된 양의 포지션을 대체하십시오.

  5. 적합성 간격 파라미터를 최적화하여 판단의 정확성을 높이기 위해 최적의 파라미터를 찾습니다.

요약하다

이 전략은 전체적인 생각이 명확하고, 변동력 지표를 사용하여 가격 추세를 판단하고, 노이즈 거래 신호를 효과적으로 필터링한다. 전략 최적화 공간은 넓고, 여러 측면에서 개선할 수 있어 전략이 더 안정적이고 신뢰할 수 있다. 매개 변수를 조정하여 최적화, 다른 거래 품종에 적응할 수 있으며, 더 많은 테스트 및 실무 검증의 가치가 있다.

전략 소스 코드
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's WaveTrender Strategy v1.0", shorttitle = "WaveTrender str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 10)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
showarr = input(true, defval = true, title = "Show Arrows")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//RSI
rsiup = rma(max(change(close), 0), 14)
rsidown = rma(-min(change(close), 0), 14)
rsi = rsidown == 0 ? 100 : rsiup == 0 ? 0 : 100 - (100 / (1 + rsiup / rsidown))

//WaveTrend
esa = ema(hlc3, 10)
d = ema(abs(hlc3 - esa), 10)
ci = (hlc3 - esa) / (0.015 * d)
wt = ema(ci, 21)

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
overs = rsi < 25 and wt < -60
overb = rsi > 75 and wt > 60
up1 = (strategy.position_size == 0 or close < strategy.position_avg_price) and overs and bar == -1
dn1 = (strategy.position_size == 0 or close > strategy.position_avg_price) and overb and bar == 1
exit = (strategy.position_size > 0 and overs == false) or (strategy.position_size < 0 and overb == false)

//Arrows
col = exit ? black : up1 or dn1 ? blue : na
needup = up1
needdn = dn1
needexitup = exit and strategy.position_size < 0
needexitdn = exit and strategy.position_size > 0
plotarrow(showarr and needup ? 1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needdn ? -1 : na, colorup = blue, colordown = blue, transp = 0)
plotarrow(showarr and needexitup ? 1 : na, colorup = black, colordown = black, transp = 0)
plotarrow(showarr and needexitdn ? -1 : na, colorup = black, colordown = black, transp = 0)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot)

if dn1
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot)
    
if exit
    strategy.close_all()