리소스 로딩... 로딩...

변동성 트렌드 추적 전략

저자:차오장, 날짜: 2024-02-18 10:07:29
태그:

img

전반적인 설명

이 전략은 가격 추세와 과잉 구매/ 과잉 판매 상황을 결정하기 위해 웨이브 트렌드 지표를 사용합니다. 그것은 신호를 필터하기 위해 RSI 지표를 결합하고 과잉 구매/ 과잉 판매 수준에서 트렌드 추적 방법을 채택하여 역 트렌드 거래를합니다.

전략 논리

이 전략은 가격 트렌드 방향을 결정하기 위해 웨이브 트렌드 지표를 사용합니다. 웨이브 트렌드 지표는 레인보우 지표에 기반하여 개선되었습니다. 하이킨-아시 이동 평균과 가격의 절대 값 사이의 차이를 계산하여 가격 트렌드 방향을 판단합니다. 과소매 / 과소매 상황을 결정하기 위해 RSI 지표를 결합하여 거래 신호를 생성합니다.

구체적으로, 전략의 웨이브 트렌드 공식은:

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

에사는 계산된 하이킨-아시 이동 평균이며, d는 하이킨-아시 이동 평균과 가격의 절대 값의 차이의 평균입니다. ci는 가격 변동성을 반영하는 이른바 적응 범위입니다. wt는 가격 트렌드 방향을 결정하는 ci의 이동 평균이며 장기 및 단기 주요 지표입니다.

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. 웨이브 트렌드 지표는 정확하고 신뢰할 수 있는 가격 트렌드 방향을 결정할 수 있습니다.
  2. RSI 필터는 불필요한 거래를 피하고 승률을 향상시킬 수 있습니다.
  3. 트렌드 추적 방법은 가격 트렌드를 파악하는 수익을 극대화 할 수 있습니다.
  4. 전략 아이디어는 간단하고 명확하며, 매개 변수들은 다양한 제품과 시장에 적응할 수 있습니다.
  5. 라이브 트레이딩에서 구현하고 테스트하는 것이 쉽습니다. 더 많은 최적화를 위해 좋습니다.

위험 분석

또한 몇 가지 위험이 있습니다.

  1. 웨이브트렌드와 RSI 모두 약간의 지연이 있고 가격 반전 지점을 놓칠 수 있습니다.
  2. 필터에도 불구하고 부적절한 시장에서는 여전히 잘못된 신호가 발생할 수 있습니다.
  3. 단일 손실을 통제하기 위한 효과적인 스톱 로스 방법의 부재
  4. 합리적인 매개 변수 조정은 특성과 거래 빈도에 맞아야 합니다.

해결책:

  1. 신호 정확성을 높이기 위해 조합 최적화를 위한 지표를 추가합니다.
  2. 단일 손실을 통제하기 위해 스톱 로스 전략을 추가합니다.
  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()

더 많은