이 전략은 가격 변동성을 부드럽게 하는 가격 대역을 생성하고 가격이 대역을 넘어서면 거래 신호를 생성합니다.
이 전략은 먼저 특정 기간 동안 가격의 평균 변동성 범위를 계산하고, 그 다음 기하급수적인 이동 평균을 사용하여 변동성을 생성하기 위해 변동성 범위를 평평화합니다. 계수와 곱한 평준화 변동성은 대역의 범위를 제공합니다. 가격이 상단 범위를 넘으면 구매 신호가 생성됩니다. 가격이 하단 범위를 넘으면 판매 신호가 생성됩니다.
구체적으로, 평형 변동성 smrng은 smoothrng 함수로 계산된다. 가격 대역의 상단 h밴드 및 하단 밴드 l밴드는 smrng에 기초하여 계산된다. 긴 조건 longCondition 및 짧은 조건 shortCondition은 이를 기반으로 설정된다. longCondition이 충족되면 구매 신호가 생성된다. shortCondition이 충족되면 판매 신호가 생성된다.
이 전략의 장점은 다음과 같습니다.
가격 변동성을 사용하여 거래 신호를 구성하면 시장 변화를 효과적으로 추적 할 수 있습니다.
기하급수적인 이동 평균으로 변동성을 완화하면 소음을 필터하고 더 신뢰할 수있는 거래 신호를 생성 할 수 있습니다.
폭은 변동성 계수를 통해 조정할 수 있어 전략을 보다 유연하게 만들 수 있습니다.
브레이크아웃 판단과 결합하면 트렌드 전환이 발생했을 때 적시에 거래 기회를 잡을 수 있습니다.
이 전략에는 몇 가지 위험도 있습니다.
비정상적인 시장 변동성에서는 평형 변동성이 실제 변동성을 정확하게 반영하지 못하여 잘못된 신호로 이어질 수 있습니다.
부적절한 대역 범위 설정은 과도한 거래 또는 불충분한 신호로 이어질 수 있습니다. 최적의 범위를 찾기 위해 다른 매개 변수를 테스트 할 수 있습니다.
파업 신호에 시간이 지연되어 조기 출입 또는 늦은 출입을 일으킬 수 있습니다. 확인을 위해 다른 지표가 도입 될 수 있습니다.
전략은 다음과 같이 최적화 될 수 있습니다.
변동성을 계산하기 위해 가장 적합한 기간을 찾기 위해 다른 가격 데이터 주기를 테스트합니다.
가중화 이동 평균과 같은 다른 이동 평균 알고리즘을 시도하고 있습니다.
브레이크오웃 신호를 확인하기 위해 거래량 또는 다른 지표를 도입합니다.
트레이드당 손실을 제어하기 위해 Stop Loss 또는 Trailing Stop를 설정합니다.
최적의 밴드 범위를 결정하기 위해 변동성 계수 멀트를 최적화합니다.
이 전략의 전반적인 논리는 명확합니다. 가격 변동성을 사용하여 밴드와 가격 브레이크를 구성하여 거래 신호를 생성하여 시장 트렌드 변화를 효과적으로 추적 할 수 있습니다. 그러나 매개 변수 최적화, 신호 확인 등을 통해 전략을 더 견고하게 만들기 위해 개선 할 여지가 있습니다.
/*backtest start: 2023-01-22 00:00:00 end: 2024-01-28 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true) // Source src = input(defval=close, title="Source") // Sampling Period per = input(defval=100, minval=1, title="Sampling Period") // Range Multiplier mult = input(defval=3.0, minval=0.1, title="Range Multiplier") // Smooth Average Range smoothrng(x, t, m) => wper = (t * 2) - 1 avrng = ema(abs(x - x[1]), t) smoothrng = 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 // Breakouts longCondition = (src > filt) and (src > src[1]) and (upward > 0) shortCondition = (src < filt) and (src < src[1]) and (downward > 0) strategy.entry("Buy", strategy.long, when = longCondition) strategy.entry("Sell", strategy.short, when = shortCondition) // Plotting plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter") hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target") lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target") // Fills fill(hbandplot, lbandplot, color=color.aqua, title="Target Range") // Bar Color barcolor(longCondition ? color.green : shortCondition ? color.red : na) // Alerts alertcondition(longCondition, title="Buy Alert", message="BUY") alertcondition(shortCondition, title="Sell Alert", message="SELL")