
슈퍼 트렌드 일일 역전 전략 (Super Trend Daily Reversal Strategy) 은 슈퍼 트렌드 지표를 사용하여 시장의 흐름을 판단하고, 가격의 돌파구와 평균 실제 변동 범위의 계산 중지, 그리고 가격 변화율 지표를 사용하여 슈퍼 트렌드 신호를 필터링하는 양적 거래 전략이다. 이 전략은 일일 및 더 높은 시간 주기에서 적용되며, 디지털 통화 및 주식 등의 시장에 사용할 수 있다.
이 전략의 핵심 지표는 슈퍼 트렌드 지표 (Super Trend Indicator) 이다. 슈퍼 트렌드 지표는 평균 실제 변동 범위를 기반으로 (ATR) 시장의 경향 방향을 더 명확하게 판단 할 수 있다. 가격이 슈퍼 트렌드를 돌파 할 때 하향 신호가 되고, 하향 신호를 돌파 할 때 낙관 신호가 된다.
이 전략은 가격 변화율 지표 ((ROC) 를 사용하여 슈퍼 트렌드 지표에 대한 필터링을 지원하여 유효하지 않은 신호를 피합니다. 가격 변동이 큰 경우에만 슈퍼 트렌드 신호에 참여하거나 그렇지 않으면 참여하지 않습니다.
스톱의 경우, 이 전략은 두 가지 스톱 방식을 제공합니다: 고정 스톱 비율과 ATR 기반의 자동 축소 스톱. 고정 스톱은 간단하고 직접적이며, ATR 스톱은 시장의 변동성에 따라 스톱 범위를 조정할 수 있습니다.
진입 조건은 슈퍼 트렌드 지표의 반전이며 가격 변화 비율 지표가 필터를 통과한다. 진출 조건은 슈퍼 트렌드가 다시 반전하거나 스톱 로드 라인을 뚫었다. 이 전략은 트렌드 추적 원칙을 따르며, 각 방향에는 한 가지의 위치만 허용한다.
이 전략의 가장 큰 장점은 슈퍼 트렌드 지표를 사용하여 트렌드 방향을 판단하는 명확성과 안정성이 높으며, 일반 이동 평균에 비해 노이즈가 작다는 것입니다. 또한, 전략에 가격 변화 비율 지표를 추가하여 일부 가짜 신호를 효과적으로 필터링합니다.
ATR 자율적 손해 차단 메커니즘은 또한 이 전략이 보다 광범위한 시장 환경에 적응할 수 있도록 합니다. 변동성이 심할 때 손해 차단이 자동으로 완화되어 수익을 최대화합니다.
테스트 결과에서 볼 때, 이 전략은 황소 시장에서 우수한 성과를 냈다.
이 전략의 주요 위험은 트렌드 반전 판단에 오류가 발생하여 반전 신호를 놓치거나 불필요한 반전 신호를 생성할 수 있습니다. 이것은 일반적으로 가격이 중요한 지원 또는 저항 지역 근처에서 반복적으로 가로 정리 될 때 발생합니다.
또한, 너무 느슨한 중지 설정은 손실의 확장을 초래할 수 있습니다. ATR 중지 시장의 변동성에 따라 조정됩니다. 따라서 시장의 갑작스러운 사건에서 중지 손실이 늘어날 수 있습니다.
위와 같은 위험에 대해, ATR 계산주기를 적절히 단축하거나 ATR 중지 손실의 배수 인수를 조정할 수 있다. 또한 중요한 지지 저항 영역을 결정하는 부가적인 지표가 추가될 수 있으며, 그러한 영역이 잘못된 신호를 발산하는 것을 방지할 수 있다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
슈퍼 트렌드 지표의 매개 변수를 조정하여 ATR 주기 및 ATR 배수를 최적화하여 슈퍼 트렌드 라인을 더 부드럽게 만듭니다.
가격 변화율 지표의 파라미터를 조정하고, 사이클 및 변화율 값을 최적화하여 잘못된 신호를 줄여줍니다.
다른 손해 방지 메커니즘을 시도해 보세요. 예를 들어, 손해를 추적하거나, 고정된 손해 방지 장치의 손해 방지 범위를 최적화하십시오.
추가적인 판단 지표를 추가하여 핵심 지지 저항을 확인하고, 추세 반전 판단 오류를 피하십시오.
다양한 품종의 파라미터 설정과 효과를 테스트하여 최적의 파라미터 조합을 찾습니다.
역측정 최적화를 통해 최적의 변수 설정을 찾습니다.
슈퍼 트렌드 일선 역전 전략은 전체적으로 안정적이고 신뢰할 수 있는 트렌드 추적 전략이다. 그것은 슈퍼 트렌드 지표와 가격 변화 비율 지표와 결합하여 필터링을 통해 중장선 트렌드의 방향을 효과적으로 식별할 수 있다. ATR 자조적 손해 막기 메커니즘은 또한 대부분의 시장 환경에 적응할 수 있도록 한다. 파라미터 설정을 추가적으로 최적화하고 판단 지표를 증가시킴으로써 전략의 안정성과 수익성을 향상시킬 수 있다.
/*backtest
start: 2024-01-22 00:00:00
end: 2024-02-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy("Super Trend Daily BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)
/////////////// Time Frame ///////////////
_1 = input(false, "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)
testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)
testPeriod() => true
///////////// Super Trend /////////////
_2 = input(false, "══════ Super Trend ══════")
length = input(title="ATR Period", type=input.integer, defval=3)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=1.3)
atr = mult * atr(length)
longStop = hl2 - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = hl2 + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and close > shortStopPrev ? 1 : dir == 1 and close < longStopPrev ? -1 : dir
///////////// Rate Of Change /////////////
_3 = input(false, "══════ Rate of Change ══════")
source = close
roclength = input(30, "ROC Length", minval=1)
pcntChange = input(6, "ROC % Change", minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))
/////////////// Strategy ///////////////
long = dir == 1 and dir[1] == -1 and isMoving()
short = dir == -1 and dir[1] == 1 and isMoving()
last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])
long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)
last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])
last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])
in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal
last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1])
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1])
/////////////// Dynamic ATR Stop Losses ///////////////
_4 = input(false, "════════ Stop Loss ═══════")
SL_type = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inp = input(6.0, title='Fixed Stop Loss %') / 100
atrLkb = input(20, minval=1, title='ATR Stop Period')
atrMult = input(1.5, step=0.25, title='ATR Stop Multiplier')
atr1 = atr(atrLkb)
longStop1 = 0.0
longStop1 := short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop1[1]
shortStop1 = 0.0
shortStop1 := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop1[1]
slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na
/////////////// Execution ///////////////
if testPeriod()
strategy.entry("L", strategy.long, when=long)
strategy.entry("S", strategy.short, when=short)
strategy.exit("L SL", "L", stop = SL_type == "Fixed" ? long_sl : longStop1, when=since_longEntry > 0)
strategy.exit("S SL", "S", stop = SL_type == "Fixed" ? short_sl : shortStop1, when=since_shortEntry > 0)
/////////////// Plotting ///////////////
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(isMoving() ? dir == 1 ? color.lime : color.red : color.white , transp=80)