이 전략은 가격 추세와 과잉 구매/ 과잉 판매 상황을 결정하기 위해 웨이브 트렌드 지표를 사용합니다. 그것은 신호를 필터하기 위해 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 이상일 때, 그것은 짧게하기 위해 과소매됩니다.
이 전략의 장점은 다음과 같습니다.
또한 몇 가지 위험이 있습니다.
해결책:
이 전략은 다음과 같은 방향으로 최적화 될 수 있습니다.
신호의 정확성을 향상시키기 위해 판단 지표를 변경하거나 추가하십시오. 예를 들어 MACD, KD 등.
다양한 제품을 조정하기 위해 매개 변수 설정을 최적화하십시오. 예를 들어 매끄러운 기간을 조정하십시오.
단일 손실을 제어하기 위해 추적 스톱 손실 전략을 추가하십시오. 예를 들어, 백분율 스톱 손실, 후속 스톱 손실 등.
다른 피라미드 전략을 고려하십시오. 예를 들어, 고정된 양 대신 마틴게일.
판단의 정확성을 높이기 위해 적응 범위 매개 변수를 최적화합니다.
이 전략의 전체적인 아이디어는 가격 추세를 결정하고 소음을 효과적으로 필터하기 위해 변동성 지표를 사용하여 명확합니다. 전략을 더 견고하게 만들기 위해 여러 측면에서 최적화 할 여지가 있습니다. 매개 변수 조정을 통해 다른 제품에 적응 할 수 있으며 추가 라이브 테스트가 가치가 있습니다.
/*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()