
자기 적응 트렌드 추적 전략은 부린 밴드 지표와 평선 지표를 결합하여 동적으로 트렌드 강도 인자를 조정하여 트렌드 추적과 상쇄를 실현하는 양적 거래 전략이다. 이 전략은 부린 밴드 지표를 사용하여 가격 변동률을 계산하고, 이에 따라 합리적인 트렌드 강도를 계산한 다음 ATR 지표와 결합하여 자기 적응 트렌드 통로를 그리며, 황소와 곰의 추세를 판단하고 추적한다. 동시에, 전략 내의 상쇄 메커니즘은 위험을 효과적으로 제어 할 수 있습니다.
이 전략의 핵심 지표는 브린 띠이다. 브린 띠는 중궤도, 상궤도, 하궤도로 구성된다. 중궤도는 n일간의 간단한 이동 평균이며, 상궤도는 중궤도+k배의 n일간 표준차이고, 하궤도는 중궤도-k배의 n일간 표준차이다. 여기서 20일간의 중궤도와 2배의 표준차를 선택하여 브린 띠를 구성한다.
그 다음 부린 밴드의 대역 (上軌-下軌) 과 중軌의 비율을 계산하여 ?? 강도 인수 ?? 이라고 한다. 이 비율은 현재 시장의 변동률과 트렌드 강도를 반영한다. 우리는 강도 인수의 최대 최소값을 설정하여 너무 크고 너무 작지 않도록 한다.
합리적인 강도 인자를 얻은 후, ATR 지표와 결합하여 ATR을 위아래로 이동합니다.*강도 인자 이 거리, 자기 적응 트렌드 채널을 형성한다. 상쇄 가격이 아래에서 위로 돌파 할 때, 더 많이 한다. 위에서 아래로 돌파 할 때, 공백한다.
또한, 전략은 손실을 막는 메커니즘을 설정한다. 다수 상위 포지션이 형성된 후, 가격이 포지션을 개시했을 때 가장 낮은 지점을 넘어서는 경우, 평위 포지션을 중지한다. 공수 포지션도 마찬가지이다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
자기 적응력이 강하다. 강도 인자의 계산 방식은 전략이 시장의 변동률에 따라 채널 폭을 조정할 수 있도록 하며, 트렌드하는 황소 시장에서 채널을 넓히고, 흔들리는 시장에서 채널을 좁히며, 다른 유형의 시장에 대한 자기 적응을 실현한다.
연동 주파수는 적다. 간단한 이동 평균 전략에 비해, 부린 벨트 전략은 채널을 조정하는 주파수가 낮아 불필요한 빈번한 평점을 피한다.
정확한 진입. 이 진입 방식은 시장의 소음을 효과적으로 필터링하여 트렌드의 시작을 높은 확률로 잡을 수 있습니다.
단독 손실을 효과적으로 통제할 수 있는 내장된 손실 방식이 이 전략의 큰 장점이다.
이 전략에는 몇 가지 위험도 있습니다.
변수 민감도가 높다. 브린띠의 주기 n과 곱하기 k는 결과에 큰 영향을 미치며, 최적의 변수 조합을 찾기 위해 반복 테스트가 필요하다.
부린띠 궤도가 분산될 때 트렌드를 추적할 수 없습니다. 가격이 급격하게 변동할 때 부린띠 궤도는 빠르게 뻗어 트렌드를 추적할 수 없습니다. 이 경우 전략을 일시 중지하고 궤도가 수렴한 후에 다시 실행해야합니다.
때때로 잘못된 신호가 발생한다. 브린 벨트 전략은 완벽하지 않으며, 특정 잘못된 신호가 발생하여 그에 따른 손실이 발생한다.
손해 차단 방법은 간단하다. 이 전략의 차단은 포지션 개시 후의 최고 가격과 최저 가격을 고려하며, 변동률과 같은 더 복잡한 차단 방법은 결합하지 않고, 너무 급진적이거나 보수적이어서 최적화가 필요합니다.
이 전략은 다음과 같은 부분에서 최적화가 필요합니다.
다른 통화와 다른 주기 파라미터의 효과를 테스트한다. 전략의 파라미터는 다른 통화와 주기들에 대해 최적화되어 전략의 적응성을 향상시킬 수 있다.
손해 제도를 최적화한다. 이동 손해, 진동 손해, 추적 손해 등을 도입하여 손해 제도를 더욱 지능화한다.
다른 지표와 결합하여 필터링 할 수 있다. MACD, KDJ 등의 지표가 추가되어 부린띠가 가로판 진동시장에서 잘못된 신호를 발생하지 않도록 할 수 있다.
포지션 관리 메커니즘을 추가한다. 포지션 관리 방법을 구현하는 것은 전략 수익률을 높일 수 있다.
리테크 최적화를 수행한다. 리테크 시간 범위를 확장하고, 매개 변수를 조정하고, 리테크 보고서를 분석하는 등으로 전략 효과를 전체적으로 검사하고, 최적 매개 변수를 찾는다.
자동 적응 트렌드가 전략 전체에 따라 보다 성숙한 양적 전략이다. 그것은 브린 띠 지표의 동적 포착 트렌드를 사용하고, ATR 지표와 함께 자동 적응 통로를 구축하여 다공간 트렌드에 대한 판단을 실현한다. 동시에 내장 된 중지 손실 메커니즘 제어 위험. 이 전략의 장점은 작동 주파수 적응, 출전 정확성, 위험 제어성이 좋다. 그러나 또한 몇 가지 문제가 있으며, 파라미터 옵션, 중지 방식, 신호 필터링 등의 측면에서 최적화가 필요하며, 전략을 더 안정적이고 지능화한다.
/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
strategy("[Th] Adaptive Trend v1", shorttitle="[TH] Adaptive Trend", overlay=true)
Pd=input(2, minval=1,maxval = 100, title="Period")
Bw=input(50, minval=1,maxval = 100, title="Bandwidth")
minFactor = input(0.5, minval=0.1, maxval=1.0, step=0.1, title="Minimum Factor")
maxFactor = input(3.00, minval=0.2, maxval=5.0, step=0.1, title="Maximum Factor")
plot_trend=input(true, title="Plot trend")
plot_losscut = input(true, title="Plot losscut")
/////////////// Calculate the BB's ///////////////
basisBB = ema(close, 20)
devBB = 2 * stdev(close, 20)
upperBB = basisBB + devBB
lowerBB = basisBB - devBB
//plot(upperBB)
//plot(lowerBB)
///////////// Trend ////////////////////////////
rawFactor = ((upperBB-lowerBB)/basisBB)*Bw
Factor = rawFactor > minFactor ? (rawFactor > maxFactor ? maxFactor : rawFactor) : minFactor
Up=hl2-(Factor*atr(Pd))
Dn=hl2+(Factor*atr(Pd))
TrendUp=close[1]>TrendUp[1]? max(Up,TrendUp[1]) : Up
TrendDown=close[1]<TrendDown[1]? min(Dn,TrendDown[1]) : Dn
TrendUpPlot=plot(plot_trend?TrendUp:na, style=line, color=green, linewidth=1)
TrendDownPlot=plot(plot_trend?TrendDown:na, style=line, color=red, linewidth=1)
Trend = close > TrendDown[1] ? 1: close< TrendUp[1]? -1: nz(Trend[1],1)
fill(TrendUpPlot,TrendDownPlot, color=Trend == 1 ? green : red, transp=80)
sig_trend_long = Trend[1] == -1 and Trend == 1
sig_trend_short = Trend[1] == 1 and Trend == -1
///////////// Loss Cut ////////////////////////////
price_cut = sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1] ? open : price_cut[1]
current_trend = sig_trend_long[1] ? 1 : (sig_trend_short[1] ? -1 : current_trend[1])
sig_loss_cut = sig_trend_long or sig_trend_short ? false : ( current_trend == 1 ? (price_cut > low) : (current_trend == -1 ? (price_cut < high) : false) )
has_position = sig_loss_cut ? false : ((sig_trend_long[1] or sig_trend_short[1] or sig_reentry_long[1] or sig_reentry_short[1]) ? true : has_position[1])
sig_reentry_long = not has_position and current_trend == 1 and low > price_cut
sig_reentry_short = not has_position and current_trend == -1 and high < price_cut
bgcolor(plot_losscut and ( not has_position or sig_loss_cut ) ? silver : white, transp=70)
plotshape(plot_losscut and sig_loss_cut and current_trend == 1? 1 : na, color=green, style=shape.xcross, location=location.belowbar ,size=size.tiny)
plotshape(plot_losscut and sig_loss_cut and current_trend == -1? 1 : na, color=red, style=shape.xcross, location=location.abovebar ,size=size.tiny)
LossCutPlot = plot(plot_losscut ? price_cut : na, linewidth=4, color=black, transp=60)
fill(TrendDownPlot, LossCutPlot, color=silver, transp=90)
plotshape(sig_trend_long or sig_reentry_long ? Trend : na, title="Up Entry Arrow", color=green, style=shape.triangleup, location=location.belowbar, size=size.tiny)
plotshape(sig_trend_short or sig_reentry_short ? Trend : na, title="Down Entry Arrow",color=red, style=shape.triangledown, size=size.tiny)
///////////// Strategy ////////////////////////////
if true
strategy.entry('long', long=strategy.long, comment='Long', when=sig_trend_long or sig_reentry_long)
strategy.entry('short', long=strategy.short, comment='Short', when=sig_trend_short or sig_reentry_short)
if(current_trend == 1)
strategy.close('long', when=sig_loss_cut == true)
//strategy.exit('lc',from_entry='long', stop=price_cut)
if( current_trend == -1 )
strategy.close('short', when=sig_loss_cut == true)
//strategy.exit('sc',from_entry='short', stop=price_cut)