
이중 레일 추적 역전 전략은 부린 벨트, 켈트너 채널 및 동력 지표의 결합으로 역전 거래 전략이다. 이 전략은 부린 벨트 및 켈트너 채널의 통합 판단을 통해 가격이 압축 영역에 들어가는 시점을 식별하고 동력 지표와 결합하여 가격의 역전 신호를 판단하여 거래 입시 및 출구 신호를 형성한다.
브린 벨트에서 중간, 상단, 하단 레일을 계산한다
켈트너 통로의 중간, 상단, 하단 레일을 계산
Keltner 통로 내부에 부린 벨트를 판단
클로즈와 브린 벨트, 켈트너 통로의 중간 지점의 선형 회귀 기울기 val를 계산
클로즈의 변화율 ROC와 그 EMA를 계산합니다.
압축할 때, val > 0이고 변화율이 임계값에 도달할 때 더 많이 합니다.
손해 중지 조건 설정
이중 레일 시스템과 결합하여 역전 시점을 판단하여 정확도를 높여줍니다.
선형 회귀와 변화율 판단을 증가시켜 반전 가짜 신호를 방지한다.
다양한 품종에 최적화 할 수있는 조정 가능한 파라미터 설정
단편 거래 위험을 효과적으로 통제할 수 있는 스톱 로스 스톱 전략
충분한 데이터로 전략의 효과를 확인할 수 있습니다.
이중 레일 압축은 반드시 효과적인 반전을 생성하지 않는다.
가짜 침입으로 잘못된 신호가 발생했습니다.
단기 손실이 너무 커서 손해 중지 설정이 너무 느슨합니다.
테스트 사이클 Datenichinhalt
더 많은 품종에 적응하기 위해 최적화된 파라미터 설정
기계학습 판단을 강화하기 위한 저항의 핵심점
거래량 변화와 함께 진솔성을 강화하는 것
트렌드 지속성을 판단하기 위한 시간적 분석을 추가합니다.
역동적 추적을 구현하기 위한 중지 손실 전략의 최적화
이중 트랙 추적 역전 전략은 전반적으로 부린띠 켈트너 통로와 같은 지표를 이용한 역전 전략이다. 이 전략은 매개 변수를 통해 최적화되어 다양한 품종에 적응할 수 있으며, 어느 정도까지 돌파구의 진위성을 식별할 수 있다. 그러나 역전 거래 자체는 여전히 약간의 위험이 있으며, 판단 정확성을 향상시키기 위해 기계 학습과 같은 기술을 추가로 결합하여 더 안정적인 초과 수익을 얻을 필요가 있다.
/*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)