이 전략은 가격의 역사적인 변동 영역을 기반으로 거래 신호를 결정한다. 그것은 일정 기간 동안의 최고 가격과 최저 가격의 차이를 계산하고 이동 평균을 통해 변동 영역을 형성한다. 가격이 이 영역의 상하 궤도를 돌파 할 때 거래 신호를 생성한다. 가격 돌파를 기반으로 한 트렌드 추적 전략에 속한다.
이 전략의 핵심 지표는 가격의 역사적인 변동률이다. 구체적인 계산 방법은 다음과 같다:
지난 N근 Bar의 최고 가격과 최저 가격의 차이를 계산하고, HL로 기록합니다.
지난 N근 Bar의 최고 가격과 최저 가격의 평균값을 계산합니다
변동률 = HL / avg (H, L)
여기서 N은 “Volatility Length”의 변수이다.
그 다음으로, 변동률을 계산합니다.
상향 = 현재 클로즈 + 현재 클로즈 * 변동률
하도 = 현재 클로즈 - 현재 클로즈 * 변동률
상하 레일은 WMA 평선으로 매끄럽게 처리되며, 파라미트는 “Average Length”이다.
가격이 상승할 때 더 많이 하고, 하락할 때 더 적게 한다.
평고지 신호는 “Exit Type” 파라미터에 따라 주어진다:
Exit Type는 Volatility MA일 때, 가격이 WMA 평균 평평점 포지션으로 돌아갑니다.
엑시트 타입이 레인지 크로스오버였을 때, 가격은 상하 경유선 평준을 돌파했다.
위험은 다음과 같은 방법으로 줄일 수 있습니다.
이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.
다양한 Length 변수를 테스트하여 최적의 변수 조합을 찾습니다.
예를 들어, 가격이 경로를 돌파 할 때 MACD가 동시에 금포를 넣으면 더 많은 것을 할 수 있습니다.
간단한 간격 돌파파가 아닌 탄력적인 추적 상쇄로 최적화 할 수 있습니다.
상쇄출장 후, 트렌드가 계속된다면, 재출장 조건을 설정하여 트렌드를 다시 추적할 수 있다.
시장의 변동에 따라 거래 포지션을 동적으로 조정할 수 있습니다.
이 전략은 전반적으로 트렌드적인 행태에 비교적 적합하며, 변동률의 궤도 및 하향 궤도를 통해 트렌드 방향과 강도를 판단하고, WMA 평균선과 함께 신뢰할 수 있는 거래 영역을 형성하여 파업 매수점을 생성한다. 그러나 트렌드 판단이 지연되고, 손해 중지 방법이 개선될 수 있는 등의 문제도 있다. 실물 데이터에 대해 많은 피드백과 최적화를 수행하고, 수 설정 및 전략 규칙을 조정하여 실수 오류의 확률을 줄여서, 전략은 다양한 시장에서 더 나은 성능을 발휘할 수 있다. 또한, 엄격한 재원 관리는 전략의 장기적인 수익성 여부에 중요한 요소이기도 하다.
/*backtest
start: 2023-09-13 00:00:00
end: 2023-09-20 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © wbburgin
//@version=5
strategy("Volatility Range Breakout Strategy [wbburgin]", shorttitle = "VRB Strategy [wbburgin]", overlay=true,
pyramiding=20,max_bars_back=2000,initial_capital=10000)
wma(float priceType,int length,float weight) =>
norm = 0.0
sum = 0.0
for i = 0 to length - 1
norm := norm + weight
sum := sum + priceType[i] * weight
sum / norm
// This definition of volatility uses the high-low range divided by the average of that range.
volatility(source,length) =>
h = ta.highest(source,length)
l = ta.lowest(source,length)
vx = 2 * (h - l) / (h + l)
vx
vm1 = input.int(100,"Average Length")
volLen = input.int(100,"Volatility Length")
vsrc = input.source(close,"Volatility Source")
cross_type = input.source(close,"Exit Source")
exit_type = input.string("Volatility MA",options=["Volatility MA","Range Crossover"],title="Exit Type")
volatility = volatility(vsrc,volLen)
highband1 = close + (close * volatility)
lowband1 = close - (close * volatility)
hb1 = wma(highband1,vm1,volatility)
lb1 = wma(lowband1,vm1,volatility)
hlavg = math.avg(hb1,lb1)
upcross = ta.crossover(high,hb1) //Crossing over the high band of historical volatility signifies a bullish breakout
dncross = ta.crossunder(low,lb1) //Crossing under the low band of historical volatility signifies a bearish breakout
vlong = upcross
vshort = dncross
vlong_exit = switch
exit_type == "Volatility MA" => ta.crossunder(cross_type,hlavg)
exit_type == "Range Crossover" => ta.crossunder(cross_type,hb1)
vshort_exit = switch
exit_type == "Volatility MA" => ta.crossover(cross_type,hlavg)
exit_type == "Range Crossover" => ta.crossover(cross_type,lb1)
if vlong
strategy.entry("Long",strategy.long)
if vlong_exit
strategy.close("Long")
if vshort
strategy.entry("Short",strategy.short)
if vshort_exit
strategy.close("Short")
plot(hlavg,color=color.white,title="Weighted Volatility Moving Average")
t = plot(hb1,color=color.new(color.red,50),title="Volatility Reversal Band - Top")
b = plot(lb1,color=color.new(color.green,50),title="Volatility Reversal Band - Bottom")
alertcondition(vlong,"Volatility Long Entry Signal")
alertcondition(vlong_exit,"Volatility Long Exit Signal")
alertcondition(vshort,"Volatility Short Entry Signal")
alertcondition(vshort_exit,"Volatility Short Exit Signal")
fill(t,b,color=color.new(color.aqua,90))