Chiến lược Broken High/Low là một chiến lược theo xu hướng theo dõi sự đột phá giá vượt quá mức cao hoặc thấp của ngọn nến trước đó.
Các điều kiện chính cho nhập cảnh và xuất cảnh được xác định bởi chiến lược này là:
Chiến lược này cũng sử dụng các bộ lọc dựa trên nến đảo ngược thứ hai để tránh đột phá sai và đảm bảo độ tin cậy tín hiệu.
Các biện pháp kiểm soát rủi ro:
Chiến lược này có thể được tối ưu hóa trong các khía cạnh sau:
Chiến lược Broken High/Low nói chung là một chiến lược theo xu hướng trưởng thành. Với sự giúp đỡ của các đường trung bình động cho phán đoán phụ trợ, nó có thể nắm bắt một mức độ nhất định của xu hướng. Các cơ chế dừng lỗ và dừng kéo theo cũng giúp khóa lợi nhuận. Thông qua kiểm tra và tối ưu hóa liên tục, các thông số và hiệu suất của chiến lược này có thể trở nên nổi bật hơn.
/*backtest start: 2022-12-15 00:00:00 end: 2023-12-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Broken High/Low Strategy", overlay=true, initial_capital = 5000, default_qty_value = 25, pyramiding = 10, default_qty_type= strategy.percent_of_equity) useEMAForStop = input.bool(false, 'Use trail stop EMA', group = 'Exit strategy') trailStopMALength = input(8, 'Trail stop EMA length', group = 'Exit strategy') fastMALength = input(5 , 'Fast MA length', group = 'Trend strength') fastEMAEnabled = input.bool(false, 'Fast EMA enabled (default is SMA)', group = 'Trend strength') slowMALength = input(10, 'Slow MA length', group = 'Trend strength') slowEMAEnabled = input.bool(false, 'Slow EMA enabled (default is SMA)', group = 'Trend strength') ignoreSlowMA = input.bool(false, 'Use fast MA for trend ignoring slow MA', group = 'Trend strength') useOpposingBarAsExit = input.bool(false, 'Using opposing bar as exit', group = 'Exit strategy') secondEntryEnabled = input.bool(false, 'Second bar that eliminates opposing bar for entry', group = 'Trend strength') longsEnabled = input.bool(true, 'Enable longs', group = 'Trade settings') shortsEnabled = input.bool(true, 'Enable shorts', group = 'Trade settings') fastMA = fastEMAEnabled ? ta.ema(close, fastMALength) : ta.sma(close, fastMALength) slowMA = slowEMAEnabled ? ta.ema(close, slowMALength) : ta.sma(close, slowMALength) FromMonth=input.int(defval=1,title="FromMonth",minval=1,maxval=12, group = 'Time filters') FromDay=input.int(defval=1,title="FromDay",minval=1,maxval=31, group = 'Time filters') FromYear=input.int(defval=1990,title="FromYear",minval=1900, group = 'Time filters') ToMonth=input.int(defval=1,title="ToMonth",minval=1,maxval=12, group = 'Time filters') ToDay=input.int(defval=1,title="ToDay",minval=1,maxval=31, group = 'Time filters') ToYear=input.int(defval=9999,title="ToYear",minval=2017, group = 'Time filters') start=timestamp(FromYear,FromMonth,FromDay,00,00) finish=timestamp(ToYear,ToMonth,ToDay,23,59) window()=>time>=start and time<=finish?true:false afterStartDate = time >= start and time<=finish?true:false closeTradesEOD = input.bool(false, 'Close trades end of day', group = 'Time filters') trailStopMA = ta.ema(close, trailStopMALength) isGreenCandle = close > open isRedCandle = close < open isBrokenHigh = close > open[1] isPriorCandleRed = close[1] < open[1] isPriorPriorCandleRed = close[2] < open[2] isPriorPriorCandleGreen = close[2] > open[2] isPriorCandleGreen = close[1] > open[1] isBrokenLow = close < open[1] isPriorRedCandleBroken = isGreenCandle and isPriorCandleRed and isBrokenHigh isPriorGreenCandleBroken = isRedCandle and isPriorCandleGreen and isBrokenLow isPriorPriorRedCandleBroken = secondEntryEnabled and not isPriorRedCandleBroken and isGreenCandle and isPriorPriorCandleRed ? close > open[2] : false isPriorPriorGreenCandleBroken = secondEntryEnabled and not isPriorGreenCandleBroken and isRedCandle and isPriorPriorCandleGreen ? close < open[2] : false longOpenCondition = (isPriorRedCandleBroken or isPriorPriorRedCandleBroken) and afterStartDate and (ignoreSlowMA ? close > fastMA : fastMA > slowMA) and longsEnabled longCloseCondition = useOpposingBarAsExit ? isRedCandle : ta.crossunder(close, fastMA) longCloseCondition := useEMAForStop ? ta.crossunder(close, trailStopMA) : longCloseCondition shortOpenCondition = (isPriorGreenCandleBroken or isPriorPriorGreenCandleBroken) and afterStartDate and (ignoreSlowMA ? close < fastMA : fastMA < slowMA) and shortsEnabled shortCloseCondition = useOpposingBarAsExit ? isGreenCandle : ta.crossover(close, fastMA) shortCloseCondition := useEMAForStop ? ta.crossover(close, trailStopMA) : shortCloseCondition if (longOpenCondition) strategy.entry("Long Entry", strategy.long) if (longCloseCondition) strategy.close('Long Entry', 'Long Exit') if (shortOpenCondition) strategy.entry("Short Entry", strategy.long) if (shortCloseCondition) strategy.close('Short Entry', 'Short Exit') if (closeTradesEOD and hour >= 14 and minute >= 30) strategy.close_all("EOD") plot(useEMAForStop ? trailStopMA : na, linewidth = 2, color = color.red) plot(fastMA) plot(ignoreSlowMA ? na : slowMA, linewidth = 4)