듀얼 트랙 역전 전략


생성 날짜: 2023-11-02 16:31:50 마지막으로 수정됨: 2023-11-02 16:31:50
복사: 0 클릭수: 633
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

듀얼 트랙 역전 전략

개요

이중 레일 추적 역전 전략은 부린 벨트, 켈트너 채널 및 동력 지표의 결합으로 역전 거래 전략이다. 이 전략은 부린 벨트 및 켈트너 채널의 통합 판단을 통해 가격이 압축 영역에 들어가는 시점을 식별하고 동력 지표와 결합하여 가격의 역전 신호를 판단하여 거래 입시 및 출구 신호를 형성한다.

전략 원칙

  1. 브린 벨트에서 중간, 상단, 하단 레일을 계산한다

    • 중간 궤도에는 close의 SMA가 사용된다.
    • 위아래 궤도는 중간 궤도 더하기 조정 가능한 배수의 표준차입니다.
  2. 켈트너 통로의 중간, 상단, 하단 레일을 계산

    • 중간 궤도에는 close의 SMA가 사용된다.
    • 위아래 궤도는 중간 궤도 더하기 적당한 배수의 ATR입니다.
  3. Keltner 통로 내부에 부린 벨트를 판단

    • 부린이 윗레일이 켈트너 위레일보다 낮고, 부린이 하위레일이 켈트너 하위레일보다 높을 때, 압축에 있다고 본다.
    • 압축이 아니라
  4. 클로즈와 브린 벨트, 켈트너 통로의 중간 지점의 선형 회귀 기울기 val를 계산

    • val > 0은 클로즈가 상승하고, val < 0은 클로즈가 하락하는 것을 나타냅니다.
  5. 클로즈의 변화율 ROC와 그 EMA를 계산합니다.

    • 변화율이 조정할 수 있는 임계값에 도달했는지 판단하기
    • 만약 하락값을 넘어서면 트렌드 중이라고 할 수 있습니다.
  6. 압축할 때, val > 0이고 변화율이 임계값에 도달할 때 더 많이 합니다.

    • 대신 공백을
  7. 손해 중지 조건 설정

전략적 이점

  1. 이중 레일 시스템과 결합하여 역전 시점을 판단하여 정확도를 높여줍니다.

  2. 선형 회귀와 변화율 판단을 증가시켜 반전 가짜 신호를 방지한다.

  3. 다양한 품종에 최적화 할 수있는 조정 가능한 파라미터 설정

  4. 단편 거래 위험을 효과적으로 통제할 수 있는 스톱 로스 스톱 전략

  5. 충분한 데이터로 전략의 효과를 확인할 수 있습니다.

전략적 위험과 해결책

  1. 이중 레일 압축은 반드시 효과적인 반전을 생성하지 않는다.

    • 최적화 매개 변수, 엄격한 쌍레일 압축 조건
  2. 가짜 침입으로 잘못된 신호가 발생했습니다.

    • 선형 회귀 판단을 추가하여 트렌드 방향을 결정합니다.
  3. 단기 손실이 너무 커서 손해 중지 설정이 너무 느슨합니다.

    • 단편적 손실을 엄격하게 통제하는 스톱포인트 최적화
  4. 테스트 사이클 Datenichinhalt

    • 장기적인 효과를 확인하기 위해 더 많은 재검토 주기를 추가합니다.

전략 최적화 방향

  1. 더 많은 품종에 적응하기 위해 최적화된 파라미터 설정

  2. 기계학습 판단을 강화하기 위한 저항의 핵심점

  3. 거래량 변화와 함께 진솔성을 강화하는 것

  4. 트렌드 지속성을 판단하기 위한 시간적 분석을 추가합니다.

  5. 역동적 추적을 구현하기 위한 중지 손실 전략의 최적화

요약하다

이중 트랙 추적 역전 전략은 전반적으로 부린띠 켈트너 통로와 같은 지표를 이용한 역전 전략이다. 이 전략은 매개 변수를 통해 최적화되어 다양한 품종에 적응할 수 있으며, 어느 정도까지 돌파구의 진위성을 식별할 수 있다. 그러나 역전 거래 자체는 여전히 약간의 위험이 있으며, 판단 정확성을 향상시키기 위해 기계 학습과 같은 기술을 추가로 결합하여 더 안정적인 초과 수익을 얻을 필요가 있다.

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

//@version=4
// Credit for the initial Squeeze Momentum code to LazyBear, rate of change code is from Kiasaki
strategy("Squeeze X BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2012, "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

/////////////// Squeeeeze ///////////////
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(22, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
 
useTrueRange = input(true, title="Use TrueRange (KC)")
 
// Calculate BB
source = close
basis = sma(source, length)
dev = mult * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source - avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

///////////// Rate Of Change ///////////// 
roclength = input(30, minval=1), pcntChange = input(7, 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 = val > 0 and isMoving()
short = val < 0 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])

sl_inp = input(100.0, title='Stop Loss %') / 100
tp_inp = input(5000.0, title='Take Profit %') / 100
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp)

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[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("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
/////////////// Plotting ///////////////
bcolor = iff(val > 0, iff(val > nz(val[1]), color.lime, color.green), iff(val < nz(val[1]), color.red, color.maroon))
plot(val, color=bcolor, linewidth=4)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=70)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=50)
hline(0, color = color.white)