Chiến lược theo xu hướng trung bình chuyển động hàm số kép là một chiến lược theo xu hướng dựa trên đường chéo trung bình chuyển động hàm số (EMA). Nó đánh giá hướng xu hướng hiện tại bằng cách tính đường EMA nhanh và đường EMA chậm và hành động theo đường chéo của chúng. Khi đường EMA nhanh vượt qua đường EMA chậm, nó được xác định là tín hiệu tăng. Khi đường EMA nhanh vượt qua đường EMA chậm, nó được xác định là tín hiệu giảm. Dựa trên hướng xu hướng được xác định, chiến lược này có thể dài hoặc ngắn theo đó.
Khái niệm cơ bản của chiến lược này nằm trong việc tính toán hai đường EMA của các giai đoạn khác nhau - một hoạt động như đường giảm và một hoạt động như đường tăng. Cụ thể, chiến lược tính toán đường EMA nhanh 8 giai đoạn bằng cách sử dụng chỉ số talib như đường tăng. Và nó tính toán đường EMA chậm 21 giai đoạn như đường giảm. Sau đó nó đánh giá các mối quan hệ chéo giữa đường EMA nhanh và đường EMA chậm. Khi đường nhanh vượt qua đường chậm, nó xác định tín hiệu tăng để đi dài. Khi đường nhanh vượt qua đường chậm, nó xác định tín hiệu giảm để đi ngắn.
Theo thực tế thực hiện giao dịch, chiến lược này có thể chỉ đi dài, chỉ đi ngắn hoặc đi cả hai hướng khi giao thoa xảy ra giữa các đường nhanh và chậm. Ngoài ra, giá dừng lỗ và lấy lợi nhuận được cấu hình trong chiến lược. Sau khi mở các vị trí, nếu giá đi theo hướng bất lợi, giá dừng lỗ sẽ được kích hoạt để thoát khỏi các vị trí. Nếu giá đạt mức mục tiêu dự kiến, lấy lợi nhuận sẽ nhận ra và đóng các vị trí.
Ưu điểm lớn nhất của chiến lược Dual EMA Trend Following nằm ở khả năng xác định xu hướng mạnh mẽ của các đường chéo trung bình động. Là một công cụ phổ biến để phân tích xu hướng, đường EMA có thể xác định sự thay đổi xu hướng và các điểm chuyển hướng thông qua các đường chéo, tránh bị đánh lừa bởi tiếng ồn thị trường trong ngắn hạn và nắm bắt hướng xu hướng chính.
Ngoài ra, các thiết lập linh hoạt về hướng giao dịch làm cho chiến lược thích nghi với cả xu hướng một chiều và dao động hai chiều, do đó tăng khả năng áp dụng của chiến lược.
Rủi ro lớn nhất của chiến lược này là các tín hiệu sai được kích hoạt bởi các giao dịch chéo nhỏ thường xuyên dưới thị trường giới hạn phạm vi. Điều này sẽ dẫn đến việc mở và mất lỗ vị trí quá mức. Để giải quyết điều này, chúng ta có thể tăng thời gian EMA để giảm thời gian giao dịch chéo và xác suất tín hiệu sai.
Mặt khác, một thiết lập stop loss quá chặt chẽ cũng làm tăng cơ hội bị dừng ra.
Chiến lược này có thể được tối ưu hóa thêm trong các khía cạnh sau:
Điều chỉnh thích nghi đối với các khoảng thời gian EMA dựa trên biến động thị trường và kết quả backtest, tránh quá mức trong các khoảng thời gian cố định.
Thêm các điều kiện lọc để lọc ra các tín hiệu sai, ví dụ: kết hợp với khối lượng giao dịch để lọc các chéo không đáng kể; hoặc kết hợp các chỉ số khác như MACD và KDJ để tránh các tín hiệu không chắc chắn.
Tối ưu hóa các chiến lược dừng lỗ và lấy lợi nhuận, ví dụ: kết hợp ATR để thực hiện theo dõi động trên SL / TP, ngăn ngừa SL quá chặt chẽ và TP sớm.
Kiểm tra các khoảng thời gian nắm giữ khác nhau. Thời gian nắm giữ quá dài có thể bị ảnh hưởng bởi các sự cố, trong khi thời gian quá ngắn dẫn đến chi phí giao dịch cao và chi phí trượt. Tìm ra ngày nắm giữ tối ưu có thể cải thiện lợi nhuận chiến lược.
Nói chung, Chiến lược theo xu hướng EMA kép là một hệ thống giao dịch xu hướng mạnh mẽ và thực tế. Nó nắm bắt các hướng xu hướng hiệu quả thông qua hệ thống chéo EMA. Trong khi đó, các thiết lập linh hoạt về các hướng giao dịch làm cho nó thích nghi; rủi ro dừng lỗ và kiểm soát lợi nhuận được cấu hình. Với các tối ưu hóa và cải tiến hơn nữa, chiến lược này có thể trở thành một công cụ mạnh mẽ cho giao dịch định lượng.
/*backtest start: 2024-01-02 00:00:00 end: 2024-02-01 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © TradersPostInc //@version=5 strategy('TradersPost Example MOMO Strategy', overlay=true, default_qty_value=100, initial_capital=100000, default_qty_type=strategy.percent_of_equity, pyramiding=0) startTime = input(defval = timestamp('01 Jan 2021 00:00 +0000'), title = 'Start Time', group = 'Date Range') endTime = input(defval = timestamp('31 Dec 2023 23:59 +0000'), title = 'End Time', group = 'Date Range') timeCondition = true timeConditionEnd = timeCondition[1] and not timeCondition fastEmaLength = input.int(defval = 8, title = 'Fast EMA Length') slowEmaLength = input.int(defval = 21, title = 'Slow EMA Length') sides = input.string(defval = 'Both', title = 'Sides', options = ['Long', 'Short', 'Both', 'None']) fastEma = ta.ema(close, fastEmaLength) slowEma = ta.ema(close, slowEmaLength) isUptrend = fastEma >= slowEma isDowntrend = fastEma <= slowEma trendChanging = ta.cross(fastEma, slowEma) ema105 = request.security(syminfo.tickerid, '30', ta.ema(close, 105)[1], barmerge.gaps_off, barmerge.lookahead_on) ema205 = request.security(syminfo.tickerid, '30', ta.ema(close, 20)[1], barmerge.gaps_off, barmerge.lookahead_on) plot(ema105, linewidth=4, color=color.new(color.purple, 0), editable=true) plot(ema205, linewidth=2, color=color.new(color.purple, 0), editable=true) aa = plot(fastEma, linewidth=3, color=color.new(color.green, 0), editable=true) bb = plot(slowEma, linewidth=3, color=color.new(color.red, 0), editable=true) fill(aa, bb, color=isUptrend ? color.green : color.red, transp=90) tradersPostBuy = trendChanging and isUptrend and timeCondition tradersPostSell = trendChanging and isDowntrend and timeCondition pips = syminfo.pointvalue / syminfo.mintick percentOrPipsInput = input.string('Percent', title='Percent or Pips', options=['Percent', 'Pips']) stopLossLongInput = input.float(defval=0, step=0.01, title='Stop Loss Long', minval=0) stopLossShortInput = input.float(defval=0, step=0.01, title='Stop Loss Short', minval=0) takeProfitLongInput = input.float(defval=0, step=0.01, title='Target Profit Long', minval=0) takeProfitShortInput = input.float(defval=0, step=0.01, title='Target Profit Short', minval=0) stopLossPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (stopLossLongInput / 100) * pips stopLossPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (stopLossShortInput / 100) * pips takeProfitPriceLong = ta.valuewhen(tradersPostBuy, close, 0) * (takeProfitLongInput / 100) * pips takeProfitPriceShort = ta.valuewhen(tradersPostSell, close, 0) * (takeProfitShortInput / 100) * pips takeProfitALong = takeProfitLongInput > 0 ? takeProfitLongInput : na takeProfitBLong = takeProfitPriceLong > 0 ? takeProfitPriceLong : na takeProfitAShort = takeProfitShortInput > 0 ? takeProfitShortInput : na takeProfitBShort = takeProfitPriceShort > 0 ? takeProfitPriceShort : na stopLossALong = stopLossLongInput > 0 ? stopLossLongInput : na stopLossBLong = stopLossPriceLong > 0 ? stopLossPriceLong : na stopLossAShort = stopLossShortInput > 0 ? stopLossShortInput : na stopLossBShort = stopLossPriceShort > 0 ? stopLossPriceShort : na takeProfitLong = percentOrPipsInput == 'Pips' ? takeProfitALong : takeProfitBLong stopLossLong = percentOrPipsInput == 'Pips' ? stopLossALong : stopLossBLong takeProfitShort = percentOrPipsInput == 'Pips' ? takeProfitAShort : takeProfitBShort stopLossShort = percentOrPipsInput == 'Pips' ? stopLossAShort : stopLossBShort buyAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "buy", "price": ' + str.tostring(close) + '}' sellAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "sell", "price": ' + str.tostring(close) + '}' exitLongAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}' exitShortAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit", "price": ' + str.tostring(close) + '}' if (sides != "None") if tradersPostBuy strategy.entry('Long', strategy.long, when = sides != 'Short', alert_message = buyAlertMessage) strategy.close('Short', when = sides == "Short" and timeCondition, alert_message = exitShortAlertMessage) if tradersPostSell strategy.entry('Short', strategy.short, when = sides != 'Long', alert_message = sellAlertMessage) strategy.close('Long', when = sides == 'Long', alert_message = exitLongAlertMessage) exitAlertMessage = '{"ticker": "' + syminfo.ticker + '", "action": "exit"}' strategy.exit('Exit Long', from_entry = "Long", profit = takeProfitLong, loss = stopLossLong, alert_message = exitAlertMessage) strategy.exit('Exit Short', from_entry = "Short", profit = takeProfitShort, loss = stopLossShort, alert_message = exitAlertMessage) strategy.close_all(when = timeConditionEnd)