Chiến lược giao dịch định lượng dừng lỗ và dừng lãi động của đường trung bình động kép EMA

EMA
Ngày tạo: 2024-11-18 15:53:49 sửa đổi lần cuối: 2024-11-18 15:53:49
sao chép: 5 Số nhấp chuột: 611
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này là một hệ thống giao dịch định lượng dựa trên đường thẳng chéo, kết hợp với cơ chế dừng lỗ động. Cốt lõi của chiến lược là xác định xu hướng thị trường và giao dịch khi điều chỉnh bằng cách chéo các chỉ số chuyển động trung bình 10 chu kỳ và 26 chu kỳ (EMA). Hệ thống sử dụng thiết lập điểm dừng lỗ cố định để bảo vệ an toàn vốn thông qua kiểm soát rủi ro nghiêm ngặt.

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

Chiến lược sử dụng hai đường trung bình EMA của hai chu kỳ khác nhau làm chỉ số cốt lõi: EMA 10 chu kỳ ngắn hạn và EMA 26 chu kỳ dài hạn. Khi đường trung bình ngắn hạn đi lên vượt qua đường trung bình dài hạn, hệ thống nhận ra là xu hướng tăng, tạo ra tín hiệu mua; Khi đường trung bình ngắn hạn đi xuống vượt qua đường trung bình dài hạn, hệ thống nhận ra là xu hướng giảm, tạo ra tín hiệu bán.

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

  1. Tín hiệu rõ ràng: sử dụng đường giao nhau như một tín hiệu giao dịch, quy tắc đơn giản rõ ràng, dễ thực hiện và giám sát
  2. Có thể kiểm soát rủi ro: Có điểm dừng cố định để kiểm soát rủi ro trên mỗi giao dịch
  3. Theo dõi xu hướng: kết hợp giao thoa và giá cả điều chỉnh để nắm bắt tốt hơn các hoạt động xu hướng
  4. Mức độ tự động hóa cao: logic chiến lược rõ ràng, dễ lập trình để tự động hóa giao dịch
  5. Khả năng thích ứng: phù hợp với các giống giao dịch khác nhau, đặc biệt là các giống có tỷ lệ biến động cao

Rủi ro chiến lược

  1. Rủi ro của thị trường chấn động: có thể tạo ra các tín hiệu sai trong thị trường chấn động trong khu vực
  2. Rủi ro trượt: Có thể có một trượt lớn khi thị trường biến động mạnh
  3. Rủi ro dừng lỗ: mức dừng cố định có thể không linh hoạt trong một số điều kiện thị trường
  4. Trễ tín hiệu: tín hiệu giao tuyến trung bình có độ trễ, có thể bỏ lỡ điểm vào tốt nhất
  5. Quản lý rủi ro tài chính: cần kiểm soát hợp lý tỷ lệ tiền trong mỗi giao dịch

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

  1. Hạn chế động lực: Bạn có thể xem xét việc điều chỉnh các vị trí dừng lỗ theo sự biến động của thị trường
  2. Lưu trữ tín hiệu: tăng số lượng giao dịch, tỷ lệ dao động và các chỉ số phụ trợ để lọc tín hiệu giả
  3. Bộ lọc thời gian: Tăng bộ lọc thời gian giao dịch, tránh thời gian biến động mạnh
  4. Quản lý giữ vị trí: Thêm một số cơ chế chặn, cho phép giữ một số vị trí để tiếp tục theo dõi xu hướng
  5. Quản lý tiền: Thêm hệ thống quản lý tiền động, tự động điều chỉnh quy mô giao dịch theo giá trị tài khoản ròng

Tóm tắt

Chiến lược này tạo ra một hệ thống giao dịch hoàn chỉnh bằng cách kết hợp EMA và giá cả điều chỉnh. Chiến lược được thiết kế đơn giản, trực quan, kiểm soát rủi ro rõ ràng, phù hợp với các loại giao dịch có tính biến động cao. Bằng cách tối ưu hóa hợp lý và điều chỉnh tham số, chiến lược này có khả năng đạt được lợi nhuận ổn định trong giao dịch thực.

Mã nguồn chiến lược
/*backtest
start: 2023-11-18 00:00:00
end: 2024-11-17 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("30 Pips Target & 15 Pips Stop-Loss with One Signal at a Time", overlay=true)

// Define settings for target and stop-loss in pips
target_in_pips = 30
stoploss_in_pips = 10

// Convert pips to price value based on market (for forex, 1 pip = 0.0001 for major pairs like GBP/JPY)
pip_value = syminfo.mintick * 10  // For forex, 1 pip = 0.0001 or 0.01 for JPY pairs
target_value = target_in_pips * pip_value
stoploss_value = stoploss_in_pips * pip_value

// Define EMAs (10-EMA and 26-EMA) for the crossover strategy
ema10 = ta.ema(close, 10)
ema26 = ta.ema(close, 26)

// Buy signal: when 10 EMA crosses above 26 EMA
longCondition = ta.crossover(ema10, ema26)
// Sell signal: when 10 EMA crosses below 26 EMA
shortCondition = ta.crossunder(ema10, ema26)

// Define price levels with explicit type float
var float long_entry_price = na
var float long_take_profit = na
var float long_stop_loss = na
var float short_entry_price = na
var float short_take_profit = na
var float short_stop_loss = na

// Variable to track if a trade is active
var bool inTrade = false

// Check if the trade hit stop loss or take profit
if (inTrade)
    if (not na(long_take_profit) and close >= long_take_profit)
        inTrade := false  // Exit the trade after hitting target
        long_entry_price := na
        long_take_profit := na
        long_stop_loss := na
        strategy.close("Long")

    if (not na(long_stop_loss) and close <= long_stop_loss)
        inTrade := false  // Exit the trade after hitting stoploss
        long_entry_price := na
        long_take_profit := na
        long_stop_loss := na
        strategy.close("Long")

    if (not na(short_take_profit) and close <= short_take_profit)
        inTrade := false  // Exit the trade after hitting target
        short_entry_price := na
        short_take_profit := na
        short_stop_loss := na
        strategy.close("Short")

    if (not na(short_stop_loss) and close >= short_stop_loss)
        inTrade := false  // Exit the trade after hitting stoploss
        short_entry_price := na
        short_take_profit := na
        short_stop_loss := na
        strategy.close("Short")

// Only generate new signals if not already in a trade
if (not inTrade)
    if (longCondition)
        long_entry_price := close
        long_take_profit := close + target_value
        long_stop_loss := close - stoploss_value
        strategy.entry("Long", strategy.long)  // Enter a long trade
        strategy.exit("Take Profit/Stop Loss", "Long", limit=long_take_profit, stop=long_stop_loss)
        inTrade := true  // Mark trade as active

    if (shortCondition)
        short_entry_price := close
        short_take_profit := close - target_value
        short_stop_loss := close + stoploss_value
        strategy.entry("Short", strategy.short)  // Enter a short trade
        strategy.exit("Take Profit/Stop Loss", "Short", limit=short_take_profit, stop=short_stop_loss)
        inTrade := true  // Mark trade as active

// Plot the levels on the chart only when in a trade
plot(inTrade and not na(long_take_profit) ? long_take_profit : na, color=color.green, linewidth=2, style=plot.style_linebr, title="Take Profit (Long)")
plot(inTrade and not na(long_stop_loss) ? long_stop_loss : na, color=color.red, linewidth=2, style=plot.style_linebr, title="Stop Loss (Long)")

plot(inTrade and not na(short_take_profit) ? short_take_profit : na, color=color.green, linewidth=2, style=plot.style_linebr, title="Take Profit (Short)")
plot(inTrade and not na(short_stop_loss) ? short_stop_loss : na, color=color.red, linewidth=2, style=plot.style_linebr, title="Stop Loss (Short)")

plotshape(series=longCondition and not inTrade, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="Buy")
plotshape(series=shortCondition and not inTrade, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell")