하이 로브 브레이커 백테스트 전략 (High Low Breaker Backtest strategy) 은 주식의 역사적 최고와 최하위를 사용하여 가격이 이러한 높은 낮은 범위에서 벗어날 수 있는지 여부를 결정하는 트렌드를 따르는 전략이다. 특정 기간 동안 가장 높은 가격과 가장 낮은 가격을 계산하고, 현재 기간의 가격이 최근 기간 동안 가장 높은 가격을 초과하면 구매 신호를 생성하고, 가격이 최근 기간 동안 가장 낮은 가격 아래로 넘어갈 때 판매 신호를 생성합니다. 트렌드 추적 전략의 한 종류로서 주식 가격의 일부 트렌드 특성을 캡처 할 수 있으며 라이브 거래에 실용적인 가치를 가지고 있습니다.
이 전략의 핵심 논리는 특정 수의 바 (전면 50 바) 에서 가장 높은 가격과 가장 낮은 가격을 계산하는 것입니다. 가장 높은 / 가장 낮은 가격을 계산할 때, 그것은 가까운 가격 또는 실제 높은 / 낮은 가격을 사용할 수 있습니다. 다음으로 현재 바의 폐쇄 가격 또는 높은 가격이 최근 기간 동안 가장 높은 가격을 초과하는지 확인하십시오. 만약 네이고 마지막 가장 높은 가격 바에서 최소 수의 바 (전면 30 바) 보다 더 많다면 구매 신호를 생성합니다. 마찬가지로, 현재 바의 폐쇄 가격 또는 낮은 가격이 최근 기간 동안 가장 낮은 가격을 깨고 마지막 최저 가격 이후 최소 수의 바를 통과하면 판매 신호를 생성합니다.
구매 신호를 생성하면 전략은 그 가격에 장기 포지션을 입력하고, 스톱 로스 가격과 수익 가격으로 설정됩니다. 스톱 로스 가격에 닿을 때 스톱 로스로 포지션을 종료하고, 수익 가격에 닿을 때 수익을 취합니다. 판매 신호의 논리는 비슷합니다.
이 높은 낮은 브레이커 백테스트 전략은 다음과 같은 장점을 가지고 있습니다:
이 전략에는 또한 몇 가지 위험이 있습니다.
다음과 같은 측면은 이러한 위험을 완화하는 데 도움이 될 수 있습니다.
이 전략은 다음과 같은 방법으로 개선될 수 있습니다.
요약하자면, 높은 낮은 브레이커 백테스트 전략은 간단하고 실용적인 트렌드 추적 전략이다. 그것은 주기적인 최고/최저 가격의 가격 브레이킹을 기반으로 거래 신호를 생성한다. 전략은 단순성, 트렌드 추적 및 매개 변수 최적화 등의 장점이 있지만, 과잉 거래 및 변동 시장을 처리할 수 없는 위험도 있다. 더 이상의 최적화는 매개 변수, 신호 필터, 포지션 사이징 등을 통해 성능을 향상시킬 수 있다.
/*backtest start: 2023-11-25 00:00:00 end: 2023-11-26 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("High/Low Breaker Backtest 1.0", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, max_bars_back=700) // Strategy Settings takeProfitPercentageLong = input(.1, title='Take Profit Percentage Long', type=float)/100 stopLossPercentageLong = input(0.15, title='Stop Loss Percentage Long', type=float)/100 takeProfitPercentageShort = input(.1, title='Take Profit Percentage Short', type=float)/100 stopLossPercentageShort = input(0.15, title='Stop Loss Percentage Short', type=float)/100 candlesBack = input(title="Number of candles back", defval=50) useHighAndLows = input(true, title="Use high and lows (uncheck to use close)", defval=true) lastBarsBackMinimum = input(title="Number of candles back to ignore for last high/low", defval=30) showHighsAndLows = input(true, title="Show high/low lines", defval=true) getIndexOfLowestInSeries(series, period) => index = 0 current = series for i = 1 to period if series[i] <= current index := i current := series[i] index getIndexOfHighestInSeries(series, period) => index = 0 current = series for i = 1 to period if series[i] >= current index := i current := series[i] index indexOfHighestInRange = getIndexOfHighestInSeries(useHighAndLows ? high : close, candlesBack) indexOfLowestInRange = getIndexOfLowestInSeries(useHighAndLows ? low : close, candlesBack) max = useHighAndLows ? high[indexOfHighestInRange] : close[indexOfHighestInRange] min = useHighAndLows ? low[indexOfLowestInRange] : close[indexOfLowestInRange] barsSinceLastHigh = indexOfHighestInRange barsSinceLastLow = indexOfLowestInRange isNewHigh = (useHighAndLows ? high > max[1] : close > max[1]) and (barsSinceLastHigh[1] + 1 > lastBarsBackMinimum) isNewLow = (useHighAndLows ? low < min[1] : close < min[1]) and (barsSinceLastLow[1] + 1 > lastBarsBackMinimum) alertcondition(condition=isNewHigh, title="New High", message="Last High Broken") alertcondition(condition=isNewLow, title="New Low", message="Last Low Broken") if high > max max := high barsSinceLastHigh := 0 if low < min min := low barsSinceLastLow := 0 plot( showHighsAndLows ? max : na, color=red, style=line, title="High", linewidth=3) plot( showHighsAndLows ? min : na, color=green, style=line, title="Low", linewidth=3) // Strategy Entry/Exit Logic goLong =isNewHigh longStopLevel = strategy.position_avg_price * (1 - stopLossPercentageLong) longTakeProfitLevel = strategy.position_avg_price * (1 + takeProfitPercentageLong) goShort = isNewLow shortStopLevel = strategy.position_avg_price * (1 + stopLossPercentageShort) shortTakeProfitLevel = strategy.position_avg_price * (1 - takeProfitPercentageShort) strategy.entry("Long", strategy.long, when=goLong) strategy.exit("Long Exit", "Long", stop=longStopLevel, limit=longTakeProfitLevel) strategy.entry("Short", strategy.short, when=goShort) strategy.exit("Short Exit", "Short", stop=shortStopLevel, limit=shortTakeProfitLevel) plot(goShort ? shortStopLevel : na, color=yellow, style=linebr, linewidth=2) plot(goShort ? shortTakeProfitLevel : na, color=blue, style=linebr, linewidth=2) plot(goLong ? longStopLevel : na, color=yellow, style=linebr, linewidth=2) plot(goLong ? longTakeProfitLevel : na, color=blue, style=linebr, linewidth=2)