Chiến lược kết hợp dừng lỗ theo sau ATR động và giao cắt trung bình động

EMA ATR RSI SMA VOLUME
Ngày tạo: 2025-02-18 15:48:18 sửa đổi lần cuối: 2025-02-18 15:48:18
sao chép: 1 Số nhấp chuột: 504
1
tập trung vào
1617
Người theo dõi

Chiến lược kết hợp dừng lỗ theo sau ATR động và giao cắt trung bình động

Tổng quan

Chiến lược này là một hệ thống giao dịch phức tạp dựa trên ATR theo dõi động dừng và chéo đường trung bình, kết hợp nhiều chỉ số kỹ thuật để lọc giao dịch và kiểm soát rủi ro. Chiến lược hoạt động trong chu kỳ 15 phút, xác định tín hiệu giao dịch thông qua các chỉ số đa chiều như đường trung bình EMA, dao động ATR, chỉ số RSI và khối lượng giao dịch và quản lý rủi ro bằng cách theo dõi động.

Nguyên tắc chiến lược

Lập luận cốt lõi của chiến lược bao gồm các thành phần quan trọng sau:

  1. Điều kiện nhập cảnh với nhiều cơ chế lọc:
    • Giá nằm trên/dưới 100 chu kỳ EMA
    • Chu kỳ 1 giờ 100 EMA xác nhận xu hướng
    • Giá giao nhau với ATR theo dõi đường dừng lỗ
    • RSI trong vùng trung tính giữa 30-70
    • Số lượng giao dịch hiện tại lớn hơn trung bình 20 chu kỳ
  2. Hệ thống kiểm soát rủi ro:
    • Hạn chế theo dõi động dựa trên ATR 3 lần
    • Đặt mục tiêu tăng ATR 2 lần
  3. Cơ chế ra sân:
    • 15 và 17 chu kỳ EMA liên tục tín hiệu chéo của hai đường K
    • Bắt đầu theo dõi mục tiêu dừng lỗ hoặc lợi nhuận

Lợi thế chiến lược

  1. Xác thực chéo đa chỉ số kỹ thuật, giảm hiệu quả tín hiệu giả
  2. Sử dụng lọc xu hướng đa chu kỳ để tăng độ chính xác của hướng giao dịch
  3. Động ATR dừng có thể điều chỉnh theo biến động của thị trường
  4. Mục tiêu lợi nhuận gắn liền với dừng lỗ, đảm bảo cân bằng năng động của tỷ lệ lợi nhuận rủi ro
  5. Sử dụng giao lộ EMA như một tín hiệu ra sân để tránh ra sân quá sớm
  6. Xác nhận giao dịch tăng hiệu quả giao dịch

Rủi ro chiến lược

  1. Điều kiện lọc nhiều lần có thể khiến một số cơ hội giao dịch bị bỏ lỡ
  2. ATR có thể bị dừng lại trong thị trường biến động mạnh
  3. Sự xuất hiện liên tục của EMA có thể dẫn đến một số lợi nhuận bị thổi phồng
  4. Dựa vào xu hướng của thị trường, thị trường có thể không hoạt động tốt
  5. Tính phức tạp tính toán cao, có thể có nguy cơ chậm thực hiện

Hướng tối ưu hóa chiến lược

  1. Tiếp theo, bạn có thể sử dụng các công cụ khác nhau.
    • ATR có thể được điều chỉnh theo các biến động của thị trường khác nhau
    • Chu kỳ EMA có thể tự động tối ưu hóa dựa trên biến động thị trường
  2. Tăng khả năng nhận dạng tình trạng thị trường:
    • Thêm chỉ số cường độ xu hướng
    • Ghi nhận định kỳ biến động
  3. Cải thiện kiểm soát rủi ro:
    • Tạo và giảm kho hàng loạt
    • Tăng giới hạn thời gian nắm giữ tối đa
  4. Tối ưu hóa cơ chế ra sân:
    • Định hướng lợi nhuận được điều chỉnh theo xu hướng
    • Thêm cơ chế dừng thời gian

Tóm tắt

Chiến lược này xây dựng một hệ thống giao dịch tương đối hoàn chỉnh bằng cách sử dụng tổng hợp nhiều chỉ số kỹ thuật và các phương tiện kiểm soát rủi ro. Đặc điểm chính của chiến lược là sử dụng ATR theo dõi động để dừng lỗ để thích ứng với biến động thị trường, đồng thời sử dụng lọc đa chỉ số và chéo đồng nhất để xác nhận tín hiệu giao dịch. Mặc dù có một số không gian tối ưu hóa, nhưng khái niệm thiết kế tổng thể phù hợp với yêu cầu của giao dịch định lượng hiện đại và có giá trị ứng dụng thực tế tốt.

Mã nguồn chiến lược
/*backtest
start: 2024-02-19 00:00:00
end: 2025-02-16 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='UT Bot Strategy with 100 EMA Filter, Trailing Stop and EMA Cross Exit', overlay=true)

// Inputs
a = input(1, title='Key Value. \'This changes the sensitivity\'')
c = input(10, title='ATR Period')
h = input(false, title='Signals from Heikin Ashi Candles')

// Higher timeframe trend filter (1-hour)
higherTimeframeEMA = request.security(syminfo.tickerid, "60", ta.ema(close, 100)) // 1-hour EMA

xATR = ta.atr(c)

// Adjusting ATR multiplier for Gold on 15-minute timeframe
atrMultiplier = 3
nLoss = atrMultiplier * xATR  // ATR-based loss calculation

src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=barmerge.lookahead_off) : close

// Trailing Stop Calculation
xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2

pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

// Define 100 EMA
ema100 = ta.ema(src, 100)
plot(ema100, title="100 EMA", color=color.black, linewidth=2)

// Define 15 EMA and 17 EMA for exit conditions
ema15 = ta.ema(src, 15)
ema17 = ta.ema(src, 17)
plot(ema15, title="15 EMA", color=color.blue, linewidth=1)
plot(ema17, title="17 EMA", color=color.purple, linewidth=1)

// Define Entry Conditions
longCondition = src > ema100 and src > xATRTrailingStop and close > higherTimeframeEMA and ta.crossover(ta.ema(src, 1), xATRTrailingStop)
shortCondition = src < ema100 and src < xATRTrailingStop and close < higherTimeframeEMA and ta.crossover(xATRTrailingStop, ta.ema(src, 1))

// RSI Filter
rsi = ta.rsi(close, 14)
longCondition := longCondition and rsi > 30 and rsi < 70  // Ensure RSI is not in extreme conditions
shortCondition := shortCondition and rsi > 30 and rsi < 70

// Volume Filter
volumeMA = ta.sma(volume, 20)
longCondition := longCondition and volume > volumeMA
shortCondition := shortCondition and volume > volumeMA

// ** Trailing Stop Setup **
trailOffset = nLoss  // The trailing stop distance is based on ATR, which is already calculated
trailPriceLong = close - trailOffset  // The trailing stop for long trades is below the entry price
trailPriceShort = close + trailOffset  // The trailing stop for short trades is above the entry price

// Define Take Profit (TP) condition
takeProfitMultiplier = 2  // This sets the take profit at 2x the ATR from the entry
takeProfitLong = close + takeProfitMultiplier * nLoss
takeProfitShort = close - takeProfitMultiplier * nLoss

// Strategy Entries
if (longCondition)
    strategy.entry('long', strategy.long)

if (shortCondition)
    strategy.entry('short', strategy.short)

// Exit conditions for 15 and 17 EMA cross (must be consecutive on two bars)
exitLong = ta.crossover(ema15, ema17) and ta.crossover(ema15[1], ema17[1])  // Exit long if both the current and previous bars have 15 EMA crossing above 17 EMA
exitShort = ta.crossunder(ema15, ema17) and ta.crossunder(ema15[1], ema17[1])  // Exit short if both the current and previous bars have 15 EMA crossing below 17 EMA

// Apply trailing stop and take profit along with EMA cross exit
strategy.exit("Exit Long", "long", trail_price=trailPriceLong, trail_offset=trailOffset, limit=takeProfitLong)  // Long exit with trailing stop and TP
strategy.exit("Exit Short", "short", trail_price=trailPriceShort, trail_offset=trailOffset, limit=takeProfitShort)  // Short exit with trailing stop and TP

// Close positions when 15 and 17 EMAs cross consecutively
strategy.close("long", when=exitLong)
strategy.close("short", when=exitShort)

// Alert condition for trade closure
longExitAlert = exitLong  // Only trigger alert for long if both consecutive bars show crossover
shortExitAlert = exitShort  // Only trigger alert for short if both consecutive bars show crossunder

alertcondition(longExitAlert, title="Close Long Trade", message="Long trade closed. 15 EMA crossed above 17 EMA on two consecutive bars.")
alertcondition(shortExitAlert, title="Close Short Trade", message="Short trade closed. 15 EMA crossed below 17 EMA on two consecutive bars.")