Tài nguyên đang được tải lên... tải...

Chiến lược giao dịch xu hướng xu hướng EMA tiên tiến

Tác giả:ChaoZhang, Ngày: 2024-12-11 17:50:14
Tags:EMAATRRRRGMT

img

Tổng quan

Chiến lược này là một hệ thống theo xu hướng dựa trên Chỉ số trung bình chuyển động biểu thức (EMA) và chỉ số động lực. Nó tạo ra các tín hiệu giao dịch thông qua sự kết hợp của các tín hiệu đột phá động lực và bộ lọc xu hướng EMA, thực hiện giao dịch khi xu hướng thị trường được xác định rõ ràng. Chiến lược bao gồm một mô-đun quản lý rủi ro toàn diện, bộ lọc thời gian giao dịch linh hoạt và các chức năng phân tích thống kê chi tiết để tăng sự ổn định và độ tin cậy.

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

Logic cốt lõi của chiến lược dựa trên một số yếu tố chính:

  1. Xác định tín hiệu động lực: Tính toán các giá trị động lực trong một khoảng thời gian được xác định bởi người dùng, tạo ra các tín hiệu dài khi động lực vượt quá ngưỡng và các tín hiệu ngắn khi nó vượt dưới ngưỡng.
  2. EMA Trend Filter: Sử dụng EMA 200 giai đoạn như tiêu chí xu hướng, cho phép các vị trí dài trên EMA và các vị trí ngắn dưới EMA.
  3. Bộ lọc thời gian: Các phiên giao dịch có thể cấu hình với hỗ trợ điều chỉnh múi giờ GMT để thích nghi tốt hơn với các giờ giao dịch thị trường khác nhau.
  4. Kiểm soát rủi ro: Hỗ trợ cài đặt dừng lỗ và lấy lợi nhuận dựa trên ATR hoặc tỷ lệ phần trăm cố định, với giới hạn giao dịch hàng ngày.

Ưu điểm chiến lược

  1. Khả năng theo dõi xu hướng mạnh mẽ: Có hiệu quả nắm bắt các chuyển động xu hướng chính thông qua xác nhận kép của EMA và động lực.
  2. Quản lý rủi ro toàn diện: Cung cấp nhiều tùy chọn dừng lỗ, bao gồm dừng động dựa trên ATR và dừng tỷ lệ cố định.
  3. Phân tích thống kê kỹ lưỡng: Theo dõi thời gian thực của nhiều chỉ số hiệu suất, bao gồm tỷ lệ chiến thắng dài / ngắn và tỷ lệ rủi ro-lợi nhuận.
  4. Các thông số linh hoạt: Các thông số chính có thể được tối ưu hóa cho các đặc điểm thị trường khác nhau.

Rủi ro chiến lược

  1. Rủi ro thị trường hỗn loạn: Có thể tạo ra các tín hiệu đột phá sai thường xuyên trong các thị trường bên cạnh. Giải pháp đề xuất: Thêm các bộ lọc dao động hoặc tăng ngưỡng đột phá.

  2. Rủi ro trượt: Có thể phải đối mặt với trượt đáng kể trong các giai đoạn biến động cao. Giải pháp được đề xuất: Đặt phạm vi dừng lỗ hợp lý và tránh giao dịch trong thời gian biến động cao.

  3. Nguy cơ giao dịch quá mức: Các tín hiệu thường xuyên có thể dẫn đến giao dịch quá mức. Giải pháp được đề xuất: Đặt giới hạn giao dịch hàng ngày phù hợp.

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

  1. Tối ưu hóa thông số động: Tự động điều chỉnh ngưỡng đà và thời gian EMA dựa trên biến động thị trường.
  2. Phân tích nhiều khung thời gian: Thêm xác nhận xu hướng trên nhiều khung thời gian để cải thiện độ tin cậy tín hiệu.
  3. Nhận dạng môi trường thị trường: Kết hợp mô-đun phân tích biến động để điều chỉnh các tham số theo các điều kiện thị trường khác nhau.
  4. Phân loại cường độ tín hiệu: Đánh giá tín hiệu đột phá và điều chỉnh kích thước vị trí dựa trên cường độ tín hiệu.

Tóm lại

Đây là một chiến lược theo dõi xu hướng được thiết kế tốt, nắm bắt các cơ hội thị trường thông qua sự kết hợp của đột phá đà và xu hướng EMA. Chiến lược có hệ thống quản lý rủi ro hoàn chỉnh và các chức năng phân tích thống kê mạnh mẽ, cung cấp tính thực tế và khả năng mở rộng tốt. Thông qua tối ưu hóa và cải tiến liên tục, chiến lược này có tiềm năng duy trì hiệu suất ổn định trong các môi trường thị trường khác nhau.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-09 08:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("[Mustang Algo] EMA Momentum Strategy", 
         shorttitle="[Mustang Algo] Mom Strategy", 
         overlay=true, 
         initial_capital=10000,
         default_qty_type=strategy.fixed,
         default_qty_value=1,
         pyramiding=0,
         calc_on_every_tick=false,
         max_bars_back=5000)

// Momentum Parameters
len = input.int(10, minval=1, title="Length")
src = input(close, title="Source")
momTimeframe = input.timeframe("", title="Momentum Timeframe")
timeframe_gaps = input.bool(true, title="Autoriser les gaps de timeframe")
momFilterLong = input.float(5, title="Filtre Momentum Long", minval=0)
momFilterShort = input.float(-5, title="Filtre Momentum Short", maxval=0)

// EMA Filter
useEmaFilter = input.bool(true, title="Utiliser Filtre EMA")
emaLength = input.int(200, title="EMA Length", minval=1)

// Position Size
contractSize = input.float(1.0, title="Taille de position", minval=0.01, step=0.01)

// Time filter settings
use_time_filter = input.bool(false, title="Utiliser le Filtre de Temps")
start_hour = input.int(9, title="Heure de Début", minval=0, maxval=23)
start_minute = input.int(30, title="Minute de Début", minval=0, maxval=59)
end_hour = input.int(16, title="Heure de Fin", minval=0, maxval=23)
end_minute = input.int(30, title="Minute de Fin", minval=0, maxval=59)
gmt_offset = input.int(0, title="Décalage GMT", minval=-12, maxval=14)

// Risk Management
useAtrSl = input.bool(false, title="Utiliser ATR pour SL/TP")
atrPeriod = input.int(14, title="Période ATR", minval=1)
atrMultiplier = input.float(1.5, title="Multiplicateur ATR pour SL", minval=0.1, step=0.1)
stopLossPerc = input.float(1.0, title="Stop Loss (%)", minval=0.01, step=0.01)
tpRatio = input.float(2.0, title="Take Profit Ratio", minval=0.1, step=0.1)

// Daily trade limit
maxDailyTrades = input.int(2, title="Limite de trades par jour", minval=1)

// Variables for tracking daily trades
var int dailyTradeCount = 0

// Reset daily trade count
if dayofweek != dayofweek[1]
    dailyTradeCount := 0

// Time filter function
is_within_session() =>
    current_time = time(timeframe.period, "0000-0000:1234567", gmt_offset)
    start_time = timestamp(year, month, dayofmonth, start_hour, start_minute, 0)
    end_time = timestamp(year, month, dayofmonth, end_hour, end_minute, 0)
    in_session = current_time >= start_time and current_time <= end_time
    not use_time_filter or in_session

// EMA Calculation
ema200 = ta.ema(close, emaLength)

// Momentum Calculation
gapFillMode = timeframe_gaps ? barmerge.gaps_on : barmerge.gaps_off
mom = request.security(syminfo.tickerid, momTimeframe, src - src[len], gapFillMode)

// ATR Calculation
atr = ta.atr(atrPeriod)

// Signal Detection with Filters
crossoverUp = ta.crossover(mom, momFilterLong)
crossoverDown = ta.crossunder(mom, momFilterShort)

emaUpTrend = close > ema200
emaDownTrend = close < ema200

// Trading Conditions
longCondition = crossoverUp and (not useEmaFilter or emaUpTrend) and is_within_session() and dailyTradeCount < maxDailyTrades and barstate.isconfirmed
shortCondition = crossoverDown and (not useEmaFilter or emaDownTrend) and is_within_session() and dailyTradeCount < maxDailyTrades and barstate.isconfirmed

// Calcul des niveaux de Stop Loss et Take Profit
float stopLoss = useAtrSl ? (atr * atrMultiplier) : (close * stopLossPerc / 100)
float takeProfit = stopLoss * tpRatio

// Modification des variables pour éviter les erreurs de repainting
var float entryPrice = na
var float currentStopLoss = na
var float currentTakeProfit = na

// Exécution des ordres avec gestion des positions
if strategy.position_size == 0
    if longCondition
        entryPrice := close
        currentStopLoss := entryPrice - stopLoss
        currentTakeProfit := entryPrice + takeProfit
        strategy.entry("Long", strategy.long, qty=contractSize)
        strategy.exit("Exit Long", "Long", stop=currentStopLoss, limit=currentTakeProfit)
        dailyTradeCount += 1

    if shortCondition
        entryPrice := close
        currentStopLoss := entryPrice + stopLoss
        currentTakeProfit := entryPrice - takeProfit
        strategy.entry("Short", strategy.short, qty=contractSize)
        strategy.exit("Exit Short", "Short", stop=currentStopLoss, limit=currentTakeProfit)
        dailyTradeCount += 1

// Plot EMA
plot(ema200, color=color.yellow, linewidth=2, title="EMA 200")

// Plot Signals
plotshape(longCondition, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortCondition, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// // Performance Statistics
// var int longWins = 0
// var int longLosses = 0
// var int shortWins = 0
// var int shortLosses = 0

// if strategy.closedtrades > 0
//     trade = strategy.closedtrades - 1
//     isLong = strategy.closedtrades.entry_price(trade) < strategy.closedtrades.exit_price(trade)
//     isWin = strategy.closedtrades.profit(trade) > 0
    
//     if isLong and isWin
//         longWins += 1
//     else if isLong and not isWin
//         longLosses += 1
//     else if not isLong and isWin
//         shortWins += 1
//     else if not isLong and not isWin
//         shortLosses += 1

// longTrades = longWins + longLosses
// shortTrades = shortWins + shortLosses

// longWinRate = longTrades > 0 ? (longWins / longTrades) * 100 : 0
// shortWinRate = shortTrades > 0 ? (shortWins / shortTrades) * 100 : 0
// overallWinRate = strategy.closedtrades > 0 ? (strategy.wintrades / strategy.closedtrades) * 100 : 0

// avgRR = strategy.grossloss != 0 ? math.abs(strategy.grossprofit / strategy.grossloss) : 0

// // Display Statistics
// var table statsTable = table.new(position.top_right, 4, 7, border_width=1)
// if barstate.islastconfirmedhistory
//     table.cell(statsTable, 0, 0, "Type", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 1, 0, "Win", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 2, 0, "Lose", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 3, 0, "Daily Trades", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 0, 1, "Long", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 1, 1, str.tostring(longWins), bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 2, 1, str.tostring(longLosses), bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 3, 1, str.tostring(dailyTradeCount) + "/" + str.tostring(maxDailyTrades), bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 0, 2, "Short", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 1, 2, str.tostring(shortWins), bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 2, 2, str.tostring(shortLosses), bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 0, 3, "Win Rate", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 1, 3, "Long: " + str.tostring(longWinRate, "#.##") + "%", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 2, 3, "Short: " + str.tostring(shortWinRate, "#.##") + "%", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 0, 4, "Overall", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 1, 4, "Win Rate: " + str.tostring(overallWinRate, "#.##") + "%", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 2, 4, "Total: " + str.tostring(strategy.closedtrades) + " | RR: " + str.tostring(avgRR, "#.##"), bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 0, 5, "Trading Hours", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 1, 5, "Start: " + str.format("{0,time,HH:mm}", start_hour * 60 * 60 * 1000 + start_minute * 60 * 1000), bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 2, 5, "End: " + str.format("{0,time,HH:mm}", end_hour * 60 * 60 * 1000 + end_minute * 60 * 1000), bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 3, 5, "GMT: " + (gmt_offset >= 0 ? "+" : "") + str.tostring(gmt_offset), bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 0, 6, "SL/TP Method", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 1, 6, useAtrSl ? "ATR-based" : "Percentage-based", bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 2, 6, useAtrSl ? "ATR: " + str.tostring(atrPeriod) : "SL%: " + str.tostring(stopLossPerc), bgcolor=color.new(color.blue, 90))
//     table.cell(statsTable, 3, 6, "TP Ratio: " + str.tostring(tpRatio), bgcolor=color.new(color.blue, 90))

Có liên quan

Thêm nữa