이 전략은 가격의 역사적 변동성 범위를 기반으로 거래 신호를 생성합니다. 특정 기간 동안 가장 높은 가격과 가장 낮은 가격의 차이를 계산하고 이동 평균을 사용하여 변동성 범위를 형성합니다. 가격은 범위의 상부 또는 하부 범위를 통과 할 때 거래 신호가 유발됩니다. 트렌드를 따르는 브레이크아웃 전략에 속합니다.
핵심 지표는 가격의 역사적 변동성입니다. 구체적인 계산은:
HL라고 불리는 지난 N 바의 최고와 최저 가격의 차이를 계산합니다.
N 바, avg ((H, L) 에서 가장 높은 가격과 가장 낮은 가격의 평균을 계산합니다.
변동성 = HL / AVG ((H, L)
여기서 N는
변동성을 얻은 후, 폭은 다음과 같이 계산됩니다.
상단역 = 현재 종료 + 현재 종료 * 변동성
하위 폭 = 현재 종료 - 현재 종료 * 변동성
그 다음 WMA에 의해
가격이 상위 범위를 넘을 때, 장거리, 하위 범위를 넘을 때, 단거리.
출구 신호는
출구 유형이 변동성 MA라면, 가격이 WMA 아래로 넘어갈 때 출구한다.
출구 유형이 범위를 넘어서면 가격이 다시 범위를 넘어가면 출구합니다.
위험은 다음과 같이 감소 할 수 있습니다.
이 전략은 다음과 같이 개선될 수 있습니다.
최적의 조합을 찾기 위해 다른 길이 값을 테스트합니다.
예를 들어, 가격이 상단 범위를 넘어서면 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))