高低ブレイカーバックテスト戦略 (High Low Breaker Backtest) は,株価が過去の高低を突破するかどうかを判断するために,株価の歴史的高低を活用したトレンドフォロー戦略である.特定の期間における最高価格と最低価格を計算し,現在の期間における価格が最近の期間の最高価格を超えると購入信号を生成し,価格が最近の期間の最低価格を下回ると販売信号を生成する.トレンドフォロー戦略の一種として,株価のいくつかのトレンド特性を捕捉し,ライブ取引の実用的な価値を有する.
この戦略の主な論理は,一定の数のバー (デフォルト50バー) で最高価格と最低価格を計算することです.最高/最低価格を計算する際に,近価格または実際の高/低価格を使用することができます (デフォルトは高/低価格を使用します).その後,現在のバーの閉値または高価格が最近の最高価格を超えているかどうかをチェックします.もしそうであり,最後の最高価格バーから最低数バー (デフォルト30バー) 以上の数バー (デフォルト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)