Ý tưởng cốt lõi của chiến lược này là kết hợp chỉ số siêu xu hướng và chỉ số chuyển động theo hướng trung bình (ADX) để đánh giá và theo dõi xu hướng. Chỉ số siêu xu hướng được sử dụng để xác định hướng xu hướng giá hiện tại và ADX được sử dụng để xác định sức mạnh xu hướng. Các giao dịch chỉ được thực hiện trong điều kiện xu hướng mạnh. Ngoài ra, chiến lược cũng sử dụng màu thân nến, khối lượng giao dịch và các chỉ số khác để xác nhận, tạo thành một bộ quy tắc giao dịch tương đối hoàn chỉnh.
Nhìn chung, chiến lược này thuộc về chiến lược theo dõi xu hướng, nhằm mục đích nắm bắt các xu hướng rõ ràng trung và dài hạn trong khi tránh sự can thiệp từ các giai đoạn củng cố và dao động.
Sử dụng chỉ số siêu xu hướng để xác định hướng xu hướng giá. Khi giá đứng trên siêu xu hướng, đó là một tín hiệu dài, và khi nó đứng dưới siêu xu hướng, đó là một tín hiệu ngắn.
Sử dụng ADX để đánh giá sức mạnh của xu hướng. Các tín hiệu giao dịch chỉ được tạo ra khi ADX lớn hơn ngưỡng, để các giai đoạn có sự củng cố không rõ ràng có thể được lọc ra.
Màu cơ thể nến được sử dụng để đánh giá xem nó hiện đang trong một mô hình tăng hoặc giảm, kết hợp với chỉ số Super Trend để tạo thành xác nhận.
Việc mở rộng khối lượng giao dịch là một tín hiệu xác nhận.
Thiết lập dừng lỗ và lấy lợi nhuận để khóa lợi nhuận và kiểm soát rủi ro.
Đóng tất cả các vị trí trước khi kết thúc ngày.
Theo dõi xu hướng rõ ràng trung và dài hạn, tránh dao động và đạt được lợi nhuận cao.
Chiến lược có ít thông số và dễ hiểu và thực hiện.
Rủi ro được kiểm soát tốt với việc dừng lỗ và lấy lợi nhuận.
Việc sử dụng nhiều chỉ số để xác nhận có thể giảm tín hiệu sai.
Có thể chịu tổn thất lớn trong các cuộc điều chỉnh lớn trên toàn thị trường.
Các cổ phiếu cá nhân có thể có sự đảo ngược mạnh do những thay đổi về các yếu tố cơ bản.
Black Swan sự kiện từ chính sách thay đổi lớn.
Giải pháp:
Điều chỉnh các thông số ADX phù hợp để đảm bảo giao dịch chỉ dưới xu hướng mạnh.
Tăng tỷ lệ dừng lỗ để kiểm soát số tiền lỗ duy nhất.
Theo dõi chặt chẽ các chính sách và các sự kiện quan trọng, tích cực cắt giảm tổn thất nếu cần thiết.
Kiểm tra các kết hợp khác nhau của các thông số siêu xu hướng để tìm ra một trong những tạo ra các tín hiệu ổn định nhất.
Kiểm tra các kết hợp tham số ADX khác nhau để xác định các thiết lập tối ưu.
Thêm các chỉ số xác nhận khác như biến động và Bollinger Bands để giảm thêm các tín hiệu sai.
Kết hợp với các chiến lược phá vỡ để cắt giảm lỗ kịp thời khi xu hướng bị phá vỡ.
Chiến lược này được thiết lập để kiểm soát rủi ro. Chiến lược này có ít tham số và dễ tối ưu hóa. Nó có thể là một ví dụ tốt cho việc học các chiến lược theo dõi xu hướng đơn giản và hiệu quả.
/*backtest start: 2023-02-15 00:00:00 end: 2024-02-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Intraday Strategy Template // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © vikris //@version=4 strategy("[VJ]Hulk Smash Intra", overlay=true, calc_on_every_tick = false, pyramiding=0,default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=2000) // ********** Strategy inputs - Start ********** // Used for intraday handling // Session value should be from market start to the time you want to square-off // your intraday strategy // Important: The end time should be at least 2 minutes before the intraday // square-off time set by your broker var i_marketSession = input(title="Market session", type=input.session, defval="0915-1455", confirm=true) // Make inputs that set the take profit % (optional) longProfitPerc = input(title="Long Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=1) * 0.01 shortProfitPerc = input(title="Short Take Profit (%)", type=input.float, minval=0.0, step=0.1, defval=1) * 0.01 // Set stop loss level with input options (optional) longLossPerc = input(title="Long Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0.5) * 0.01 shortLossPerc = input(title="Short Stop Loss (%)", type=input.float, minval=0.0, step=0.1, defval=0.5) * 0.01 var float i_multiplier = input(title = "ST Multiplier", type = input.float, defval = 2, step = 0.1, confirm=true) var int i_atrPeriod = input(title = "ST ATR Period", type = input.integer, defval = 10, confirm=true) len = input(title="ADX Length", type=input.integer, defval=14) th = input(title="ADX Threshold", type=input.integer, defval=20) adxval = input(title="ADX Momemtum Value", type=input.integer, defval=25) // ********** Strategy inputs - End ********** // ********** Supporting functions - Start ********** // A function to check whether the bar or period is in intraday session barInSession(sess) => time(timeframe.period, sess) != 0 // ********** Supporting functions - End ********** // ********** Strategy - Start ********** [superTrend, dir] = supertrend(i_multiplier, i_atrPeriod) colResistance = dir == 1 and dir == dir[1] ? color.new(color.red, 0) : color.new(color.red, 100) colSupport = dir == -1 and dir == dir[1] ? color.new(color.green, 0) : color.new(color.green, 100) // Super Trend Long/short condition stlong = close > superTrend stshort = close < superTrend // Figure out take profit price longExitPrice = strategy.position_avg_price * (1 + longProfitPerc) shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc) // Determine stop loss price longStopPrice = strategy.position_avg_price * (1 - longLossPerc) shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc) //Vol Confirmation vol = volume > volume[1] //Candles colors greenCandle = (close > open) redCandle = (close < open) // See if intraday session is active bool intradaySession = barInSession(i_marketSession) // Trade only if intraday session is active TrueRange = max(max(high - low, abs(high - nz(close[1]))), abs(low - nz(close[1]))) DirectionalMovementPlus = high - nz(high[1]) > nz(low[1]) - low ? max(high - nz(high[1]), 0) : 0 DirectionalMovementMinus = nz(low[1]) - low > high - nz(high[1]) ? max(nz(low[1]) - low, 0) : 0 SmoothedTrueRange = 0.0 SmoothedTrueRange := nz(SmoothedTrueRange[1]) - nz(SmoothedTrueRange[1]) / len + TrueRange SmoothedDirectionalMovementPlus = 0.0 SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - nz(SmoothedDirectionalMovementPlus[1]) / len + DirectionalMovementPlus SmoothedDirectionalMovementMinus = 0.0 SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - nz(SmoothedDirectionalMovementMinus[1]) / len + DirectionalMovementMinus DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100 DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100 DX = abs(DIPlus - DIMinus) / (DIPlus + DIMinus) * 100 ADX = sma(DX, len) // a = plot(DIPlus, color=color.green, title="DI+", transp=100) // b = plot(DIMinus, color=color.red, title="DI-", transp=100) //Final Long/Short Condition longCondition = stlong and redCandle and vol and ADX>adxval shortCondition = stshort and greenCandle and vol and ADX >adxval //Long Strategy - buy condition and exits with Take profit and SL if (longCondition and intradaySession) stop_level = longStopPrice profit_level = longExitPrice strategy.entry("My Long Entry Id", strategy.long) strategy.exit("TP/SL", "My Long Entry Id",stop=stop_level, limit=profit_level) //Short Strategy - sell condition and exits with Take profit and SL if (shortCondition and intradaySession) stop_level = shortStopPrice profit_level = shortExitPrice strategy.entry("My Short Entry Id", strategy.short) strategy.exit("TP/SL", "My Short Entry Id", stop=stop_level, limit=profit_level) // Square-off position (when session is over and position is open) squareOff = (not intradaySession) and (strategy.position_size != 0) strategy.close_all(when = squareOff, comment = "Square-off") // ********** Strategy - End **********