Strategi High Low Breaker Backtest adalah strategi trend-following yang menggunakan puncak dan terendah historis saham untuk menentukan apakah harga keluar dari kisaran tinggi-rendah ini. Ini menghitung harga tertinggi dan harga terendah selama periode tertentu, dan menghasilkan sinyal beli ketika harga periode saat ini melebihi harga tertinggi selama periode terakhir, dan sinyal jual ketika harga pecah di bawah harga terendah selama periode terakhir. Sebagai jenis strategi trend-following, ini dapat menangkap beberapa karakteristik tren harga saham dan memiliki nilai praktis untuk perdagangan langsung.
Logika inti dari strategi ini adalah untuk menghitung harga tertinggi dan harga terendah selama sejumlah bar (default 50 bar). Saat menghitung harga tertinggi / terendah, memungkinkan untuk menggunakan harga dekat atau harga tinggi / rendah aktual (default untuk menggunakan harga tinggi / rendah). Kemudian memeriksa apakah harga penutupan bar saat ini atau harga tinggi melebihi harga tertinggi selama periode terakhir. Jika ya dan telah lebih dari jumlah minimum bar (default 30 bar) sejak bar harga tertinggi terakhir, itu menghasilkan sinyal beli. Demikian pula, jika harga penutupan bar saat ini atau harga rendah melanggar harga terendah selama periode terakhir dan jumlah minimum bar sejak harga terendah terakhir, itu menghasilkan sinyal jual.
Setelah menghasilkan sinyal beli, strategi memasuki posisi panjang pada harga tersebut, dengan harga stop loss dan harga take profit yang ditetapkan.
Strategi backtest high low breaker ini memiliki keuntungan berikut:
Strategi ini juga memiliki beberapa risiko:
Aspek berikut dapat membantu mengurangi risiko ini:
Strategi ini dapat ditingkatkan dengan cara berikut:
Singkatnya, strategi High Low Breaker Backtest adalah strategi trend-following yang sederhana dan praktis. Strategi ini menghasilkan sinyal trading berdasarkan price breaking periodic highest/lowest prices. Strategi ini memiliki keuntungan seperti kesederhanaan, trend-following, dan parameter optimization, tetapi juga risiko seperti over-trading dan ketidakmampuan untuk menangani pasar yang berosilasi. Optimasi lebih lanjut dapat dilakukan di sekitar parameter, filter sinyal, ukuran posisi dll untuk meningkatkan kinerjanya.
/*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)