슈퍼 트렌드 매일 역전 전략

저자:차오장, 날짜: 2024-02-22 16:22:28
태그:

img

전반적인 설명

슈퍼 트렌드 일일 역전 전략 (Super Trend Daily Reversal Strategy) 은 슈퍼 트렌드 지표를 사용하여 시장 트렌드를 결정하고, 스톱 로스를 계산하기 위해 가격 돌파구와 평균 진정한 범위를 결합하고, 가격 변화율 지표를 사용하여 슈퍼 트렌드 신호를 필터링하는 양적 거래 전략이다. 이 전략은 일일 및 더 높은 시간 프레임에 적합하며 암호화폐 및 주식과 같은 시장에서 사용할 수 있습니다.

전략 논리

이 전략의 핵심 지표는 슈퍼 트렌드 지표이다. 슈퍼 트렌드 지표는 평균 진정한 범위 (ATR) 를 기반으로 하며 시장 트렌드의 방향을 보다 명확하게 결정할 수 있다. 슈퍼 트렌드 상부 레일의 붕괴는 짧은 신호이고, 하부 레일의 붕괴는 긴 신호이다.

이 전략은 유효하지 않은 신호를 피하기 위해 슈퍼 트렌드 지표를 필터하기 위해 가격 변화율 지표 (ROC) 를 사용합니다. 가격 변동성이 큰 경우에만 슈퍼 트렌드 신호에 참여하지 마십시오. 그렇지 않으면 참여하지 마십시오.

스톱 손실에 대해 전략은 두 가지 스톱 손실 방법을 제공합니다: 고정 스톱 손실 비율 및 ATR 기반 적응 스톱 손실. 고정 스톱 손실은 간단하고 직접적입니다. ATR 스톱 손실은 시장 변동성에 따라 스톱 손실 범위를 조정 할 수 있습니다.

진입 조건은 슈퍼 트렌드 지표의 반전이며 가격 변화율 지표가 필터를 통과합니다. 출구 조건은 슈퍼 트렌드가 다시 반전되거나 스톱 로스 라인을 뚫는 것입니다. 전략은 트렌드 추적 원칙을 준수하고 각 방향으로 하나의 위치만 허용합니다.

이점 분석

이 전략의 가장 큰 장점은 슈퍼 트렌드 지표가 일반 이동 평균에 비해 트렌드 방향을 판단하는 데 더 명확하고 안정적이며 소음이 적다는 것입니다. 또한 가격 변화율 지표는 일부 잘못된 신호를 효과적으로 필터합니다.

ATR 적응 스톱 로스 메커니즘은 또한 전략이 더 넓은 시장 환경에 적응 할 수 있도록합니다. 수익을 극대화하기 위해 변동성이 증가하면 스톱 로스는 자동으로 넓어집니다.

테스트 결과, 이 전략은 황소 시장에서 예외적으로 잘 수행됩니다. 이기는 비율은 긴 연속 수익 주기가있는 상당한 규모의 장기 트렌드에서 매우 높습니다.

위험 분석

이 전략에 직면 한 주요 위험은 트렌드 반전에 대한 잘못된 판단이며, 이는 반전 신호를 놓칠 수 있거나 불필요한 반전 신호를 생성 할 수 있습니다. 이것은 종종 가격이 기동하고 주요 지원 / 저항 영역 주위를 통합 할 때 발생합니다.

또한, 너무 넓게 설정된 스톱 손실은 더 큰 손실로 이어질 수 있습니다. ATR 스톱 손실은 시장 변동성에 따라 조정되므로 시장 이벤트 중에 스톱 손실이 넓어질 수 있습니다.

이러한 위험을 해결하기 위해, ATR 계산 기간은 적절하게 단축되거나 ATR 스톱 로스 인플리케이터를 조정할 수 있습니다. 또한 그 영역에서 잘못된 신호를 피하기 위해 주요 지지/저항 영역을 결정하기 위해 추가 지표가 추가 될 수 있습니다.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 슈퍼 트렌드 지표의 매개 변수를 조정하여 ATR 기간을 최적화하고 ATR 곱셈을 조정하여 슈퍼 트렌드 라인을 부드럽게 만듭니다.

  2. 가격 변화율 지표의 매개 변수를 조정하여 기간과 변화율의 문턱을 최적화하여 잘못된 신호를 줄이십시오.

  3. 트레일링 스톱과 같은 다른 스톱 로스 메커니즘을 시도하거나 고정 스톱의 스톱 로스 진폭을 최적화하십시오.

  4. 주요 지지/저항을 결정하고 트렌드 반전에 대한 잘못된 판단을 피하기 위해 추가 판단 지표를 추가합니다.

  5. 최적의 매개 변수 조합을 찾기 위해 다양한 제품에 대한 매개 변수 설정 및 효과를 테스트합니다.

  6. 가장 좋은 매개 변수 설정을 찾기 위해 백테스트 최적화를 수행합니다.

결론

전반적으로 슈퍼 트렌드 일일 역전 전략은 비교적 안정적이고 신뢰할 수있는 트렌드 다음 전략입니다. 그것은 중장기 트렌드의 방향을 효과적으로 식별 할 수있는 필터링을 위해 슈퍼 트렌드 지표와 가격 변화율 지표를 결합합니다. 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)

더 많은