리소스 로딩... 로딩...

동적 범위 필터와 함께 고급 양적 트렌드 캡처 전략

저자:차오장, 날짜: 2024-12-17 14:31:11
태그:EMAMARFVOLSMAHA

img

전반적인 설명

이 전략은 이동 평균과 동적 범위 필터를 결합한 고급 양적 거래 시스템이다. 이는 가격 움직임과 거래량 사이의 관계를 분석하여 시장 추세를 식별하며, 잘못된 신호를 제거하고 거래 정확도를 향상시키기 위해 범위 필터를 사용한다. 이 전략은 시장 유동성 경계를 결정하기 위해 적응적인 계산 방법을 사용하고 트렌드 방향을 확인하기 위해 빠르고 느린 이동 평균을 결합한다.

전략 원칙

전략의 핵심 논리는 다음의 핵심 계산에 기초합니다.

  1. 유동성 분석: 시장의 유동성을 평가하여 가격 변화와 부피의 비율을 계산하고 동적 유동성 경계를 설정합니다.
  2. 트렌드 확인: 트렌드 방향을 확인하기 위해 50주기 및 100주기 기하급수적인 이동 평균 (EMA) 을 사용합니다.
  3. 범위 필터링: 동적 거래 범위를 구성하기 위해 50 기간 샘플링 기간과 3x 범위 곱셈을 사용합니다.
  4. 신호 생성: 가격이 범위 필터를 통과하고 EMA 지표가 일관된 추세를 나타낼 때 거래 신호를 생성합니다.

전략적 장점

  1. 강력한 적응력: 전략은 시장 조건에 따라 매개 변수를 동적으로 조정하여 다른 시장 환경에 적응할 수 있습니다.
  2. 신뢰할 수 있는 신호: 여러 가지 기술 지표와 필터를 결합함으로써 잘못된 신호를 효과적으로 줄입니다.
  3. 포괄적 리스크 관리: 효과적인 리스크 통제를 위해 스톱 로스 포지션의 자동 계산을 통합합니다.
  4. 완전한 백테스팅 기능: 전략 최적화를 위한 상세한 백테스팅 설정을 포함합니다.

전략 위험

  1. 매개 변수 민감도: 여러 매개 변수는 정밀 조정이 필요하며 과도한 최적화에 유연합니다.
  2. 미끄러짐 영향: 매우 변동적인 시장에서 상당한 미끄러짐 위험을 감수할 수 있습니다.
  3. 시장 적응력: 다양한 시장에서 빈번한 잘못된 신호를 생성 할 수 있습니다.
  4. 자본 관리: 고정 자본 할당 방법은 모든 시장 조건에 적합하지 않을 수 있습니다.

전략 최적화 방향

  1. 매개 변수 조정: 시장 조건에 따라 자동 매개 변수 조정을 위한 적응적 매개 변수 조정 메커니즘을 도입합니다.
  2. 시장 상태 인식: 다른 시장 조건에서 다른 거래 전략을 적용하기 위해 시장 상태 식별 모듈을 추가합니다.
  3. 자본 관리 최적화: 시장 변동성에 기초한 동적 위치 크기를 구현합니다.
  4. 신호 필터 강화: 잘못된 신호를 필터링하기 위해 더 많은 기술적 지표를 추가합니다.

요약

이 전략은 유동성 분석, 트렌드 추적 및 범위 필터링을 결합하여 완전한 양적 거래 시스템을 구축합니다. 이 전략의 장점은 시장 변화에 적응하고 신뢰할 수있는 거래 신호를 제공하는 능력에 있으며 매개 변수 최적화 및 위험 관리에주의를 기울여야합니다. 지속적인 최적화 및 개선을 통해 전략은 다른 시장 환경에서 안정적인 성능을 유지하는 것을 약속합니다.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Killer Coin V2 + Range Filter Strategy", shorttitle="KC-RF Strategy", overlay=true
         )

// === INPUT BACKTEST RANGE ===
useDate = input(true, title='---------------- Use Date ----------------', group="Backtest Settings")
FromMonth = input.int(7, title="From Month", minval=1, maxval=12, group="Backtest Settings")
FromDay = input.int(25, title="From Day", minval=1, maxval=31, group="Backtest Settings")
FromYear = input.int(2019, title="From Year", minval=2017, group="Backtest Settings")
ToMonth = input.int(1, title="To Month", minval=1, maxval=12, group="Backtest Settings")
ToDay = input.int(1, title="To Day", minval=1, maxval=31, group="Backtest Settings")
ToYear = input.int(9999, title="To Year", minval=2017, group="Backtest Settings")
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() => time >= start and time <= finish

// === KILLER COIN V2 INPUTS ===
outlierThreshold = input.int(10, "Outlier Threshold Length", group="Killer Coin Settings")
fastMovingAverageLength = input.int(50, "Fast MA length", group="Killer Coin Settings")
slowMovingAverageLength = input.int(100, "Slow MA length", group="Killer Coin Settings")

// === RANGE FILTER INPUTS ===
sources = input(close, "Source", group="Range Filter Settings")
isHA = input(false, "Use HA Candles", group="Range Filter Settings")
per = input.int(50, "Sampling Period", minval=1, group="Range Filter Settings")
mult = input.float(3.0, "Range Multiplier", minval=0.1, group="Range Filter Settings")

// === KILLER COIN V2 CALCULATIONS ===
priceMovementLiquidity = volume / math.abs(close - open)
liquidityBoundary = ta.ema(priceMovementLiquidity, outlierThreshold) + ta.stdev(priceMovementLiquidity, outlierThreshold)
var liquidityValues = array.new_float(5)

if ta.crossover(priceMovementLiquidity, liquidityBoundary)
    array.insert(liquidityValues, 0, close)

fastEMA = ta.ema(array.get(liquidityValues, 0), fastMovingAverageLength)
slowEMA = ta.ema(array.get(liquidityValues, 0), slowMovingAverageLength)

// === RANGE FILTER CALCULATIONS ===
src = isHA ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, sources) : sources

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t*2) - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper)*m
    smoothrng

smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt

filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// === PLOTTING ===
// Killer Coin V2 Plots
bullColor = color.new(#00ffbb, 50)
bearColor = color.new(#800080, 50)
fastPlot = plot(fastEMA, "Fast EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
slowPlot = plot(slowEMA, "Slow EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
fill(fastPlot, slowPlot, color = fastEMA > slowEMA ? bullColor : bearColor)

// Range Filter Plots
filtcolor = upward > 0 ? color.new(color.lime, 0) : downward > 0 ? color.new(color.red, 0) : color.new(color.orange, 0)
filtplot = plot(filt, "Range Filter", color=filtcolor, linewidth=3)
hbandplot = plot(hband, "High Target", color=color.new(color.aqua, 90))
lbandplot = plot(lband, "Low Target", color=color.new(color.fuchsia, 90))
fill(hbandplot, filtplot, color=color.new(color.aqua, 90))
fill(lbandplot, filtplot, color=color.new(color.fuchsia, 90))

// === STRATEGY CONDITIONS ===
// Range Filter Conditions
longCond = ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0))
shortCond = ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

// Combined Conditions
finalLongSignal = longCondition and fastEMA > slowEMA and window()
finalShortSignal = shortCondition and fastEMA < slowEMA and window()

// === PLOTTING SIGNALS ===
plotshape(finalLongSignal, "Buy Signal", text="BUY", textcolor=color.white, 
         style=shape.labelup, size=size.normal, location=location.belowbar, 
         color=color.new(color.green, 0))
         
plotshape(finalShortSignal, "Sell Signal", text="SELL", textcolor=color.white, 
         style=shape.labeldown, size=size.normal, location=location.abovebar, 
         color=color.new(color.red, 0))

// === STRATEGY ENTRIES ===
if finalLongSignal
    strategy.entry("Long", strategy.long, stop=hband)
    
if finalShortSignal
    strategy.entry("Short", strategy.short, stop=lband)

// === ALERTS ===
alertcondition(finalLongSignal, "Strong Buy Signal", "🚨 Buy - Both Indicators Aligned!")
alertcondition(finalShortSignal, "Strong Sell Signal", "🚨 Sell - Both Indicators Aligned!")

관련

더 많은