
Chiến lược này là một hệ thống theo dõi xu hướng kết hợp với nhiều chỉ số, chủ yếu để nắm bắt cơ hội theo xu hướng thị trường bằng cách xác định đột phá giá, xác nhận khối lượng giao dịch và kết hợp hệ thống đường thẳng. Chiến lược này xác định tín hiệu giao dịch bằng cách giám sát giá phá vỡ các điểm cao / thấp gần đây, khối lượng giao dịch tăng đáng kể và xếp hạng theo trung bình di chuyển đa chỉ số (EMA).
Lập luận cốt lõi của chiến lược dựa trên các yếu tố then chốt sau:
Chiến lược giao dịch động lực đột phá xu hướng đa dạng là một hệ thống theo dõi xu hướng tổng hợp, cung cấp cơ hội giao dịch linh hoạt bằng cách sử dụng nhiều chỉ số kỹ thuật kết hợp, đồng thời đảm bảo độ tin cậy của tín hiệu. Sự đổi mới của chiến lược là kết hợp các phương pháp giao dịch đột phá truyền thống với cơ chế nhận dạng sắp xếp hẹp kiểu mới, cho phép nó thích nghi với các môi trường thị trường khác nhau. Mặc dù có một số rủi ro, chiến lược có khả năng đạt được hiệu suất ổn định trong thị trường xu hướng bằng cách tối ưu hóa tham số và quản lý rủi ro hợp lý.
/*backtest
start: 2024-02-21 00:00:00
end: 2025-02-18 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Breakout Strategy (Long & Short) + Slope of 200 EMA", overlay=true)
// -------------------
// 1. Settings
// -------------------
breakout_candles = input.int(20, title="Number of Candles for Breakout")
range_candles = input.int(10, title="Number of Candles for Previous Range")
ema_long_period = input.int(200, title="Long EMA Period")
ema_medium_period = input.int(50, title="Medium EMA Period")
ema_short_period = input.int(30, title="Short EMA Period")
// Checkbox to allow/disallow short positions
allowShort = input.bool(true, title="Allow Short Positions")
// Inputs for the new Narrow Consolidation Short setup
consolidationBars = input.int(10, "Consolidation Bars", minval=1)
narrowThreshInAtr = input.float(0.5,"Narrowness (ATR Mult.)",minval=0.0)
atrLength = input.int(14, "ATR Length for Range")
// -------------------
// 2. Calculations
// -------------------
breakout_up = close > ta.highest(high, breakout_candles)[1]
breakout_down = close < ta.lowest(low, breakout_candles)[1]
prev_range_high = ta.highest(high, range_candles)[1]
prev_range_low = ta.lowest(low, range_candles)[1]
ema_long = ta.ema(close, ema_long_period)
ema_medium = ta.ema(close, ema_medium_period)
ema_short = ta.ema(close, ema_short_period)
average_vol = ta.sma(volume, breakout_candles)
volume_condition = volume > 2 * average_vol
// 200 EMA sloping down?
ema_long_slope_down = ema_long < ema_long[1]
// For the Narrow Consolidation Short
rangeHigh = ta.highest(high, consolidationBars)
rangeLow = ta.lowest(low, consolidationBars)
rangeSize = rangeHigh - rangeLow
atrValue = ta.atr(atrLength)
// Condition: Price range is "narrow" if it's less than (ATR * threshold)
narrowConsolidation = rangeSize < (atrValue * narrowThreshInAtr)
// Condition: All bars under Medium EMA if the highest difference (high - ema_medium) in last N bars is < 0
allBelowMedium = ta.highest(high - ema_medium, consolidationBars) < 0
// -------------------
// 3. Long Entry
// -------------------
breakout_candle_confirmed_long = ta.barssince(breakout_up) <= 3
long_condition = breakout_candle_confirmed_long
and volume_condition
and close > prev_range_high
and close > ema_long
and ema_short > ema_medium
and ema_medium > ema_long
and strategy.opentrades == 0
if long_condition
strategy.entry("Long", strategy.long)
// -------------------
// 4. Short Entries
// -------------------
// (A) Original breakout-based short logic
breakout_candle_confirmed_short = ta.barssince(breakout_down) <= 3
short_condition_breakout = breakout_candle_confirmed_short
and volume_condition
and close < prev_range_low
and close < ema_long
and ema_short < ema_medium
and ema_medium < ema_long
and ema_long_slope_down
and strategy.opentrades == 0
// (B) NEW: Narrow Consolidation Short
short_condition_consolidation = narrowConsolidation
and allBelowMedium
and strategy.opentrades == 0
// Combine them: if either short scenario is valid, go short
short_condition = (short_condition_breakout or short_condition_consolidation) and allowShort
if short_condition
// Use a different order ID if you want to distinguish them
// but "Short" is fine for a single position
strategy.entry("Short", strategy.short)
// -------------------
// 5. Exits
// -------------------
if strategy.position_size > 0 and close < ema_long
strategy.close("Long", qty_percent=100)
if strategy.position_size < 0 and close > ema_long
strategy.close("Short", qty_percent=100)
// ======================================================================
// 5. ADDITIONAL PARTIAL EXITS / STOPS
// ======================================================================
// You can add partial exits for shorts or longs similarly.
// For example:
// if strategy.position_size < 0 and close > stop_level_for_short
// strategy.close("Short", qty_percent=50)