Chiến lược High Low Breaker Backtest là một chiến lược theo xu hướng sử dụng các mức cao và thấp trong lịch sử của một cổ phiếu để xác định xem giá có vượt qua các phạm vi cao và thấp này hay không. Nó tính toán giá cao nhất và giá thấp nhất trong một khoảng thời gian nhất định, và tạo ra tín hiệu mua khi giá của khoảng thời gian hiện tại vượt quá giá cao nhất trong một khoảng thời gian gần đây, và bán tín hiệu khi giá vượt qua mức giá thấp nhất trong một khoảng thời gian gần đây. Là một loại chiến lược theo xu hướng, nó có thể nắm bắt một số đặc điểm xu hướng của giá cổ phiếu và có giá trị thực tế cho giao dịch trực tiếp.
Lý thuyết cốt lõi của chiến lược này là tính toán giá cao nhất và giá thấp nhất trên một số thanh nhất định (bên định 50 thanh). Khi tính toán giá cao nhất / thấp nhất, nó cho phép sử dụng giá đóng hoặc giá cao / thấp thực tế (bên định sử dụng giá cao / thấp). Sau đó nó kiểm tra xem giá đóng hoặc giá cao của thanh hiện tại có vượt quá giá cao nhất trong khoảng thời gian gần đây không. Nếu có và nó đã vượt quá số lượng thanh tối thiểu (bên định 30 thanh) kể từ thanh giá cao nhất cuối cùng, nó tạo ra tín hiệu mua. Tương tự, nếu giá đóng hoặc giá thấp của thanh hiện tại phá giá thấp nhất trong khoảng thời gian gần đây và số lượng thanh tối thiểu kể từ khi giá thấp nhất cuối cùng vượt qua, nó tạo ra tín hiệu bán.
Khi tạo ra tín hiệu mua, chiến lược đi vào các vị trí dài ở mức giá đó, với mức giá dừng lỗ và lấy lợi nhuận được thiết lập. Nó thoát khỏi vị trí với mức dừng lỗ khi giá dừng lỗ được chạm, và thoát ra với lợi nhuận khi giá lấy lợi nhuận được chạm.
Chiến lược backtest bộ ngắt cao thấp này có những lợi thế sau:
Chiến lược này cũng có một số rủi ro:
Các khía cạnh sau đây có thể giúp giảm thiểu những rủi ro này:
Chiến lược này có thể được cải thiện theo những cách sau:
Tóm lại, chiến lược High Low Breaker Backtest là một chiến lược theo xu hướng đơn giản và thực tế. Nó tạo ra các tín hiệu giao dịch dựa trên giá phá vỡ theo thời gian cao nhất / thấp nhất. Chiến lược có những lợi thế như sự đơn giản, theo xu hướng và tối ưu hóa tham số, nhưng cũng có những rủi ro như giao dịch quá mức và không thể xử lý thị trường dao động.
/*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)