Chiến lược này dựa trên các tín hiệu chéo của hai đường trung bình động theo cấp số nhân (EMA) để giao dịch. Khi EMA ngắn hạn vượt qua EMA dài hạn, nó mở một vị trí dài; khi EMA ngắn hạn vượt qua dưới EMA dài hạn, nó đóng vị trí. Chiến lược cũng giới thiệu một cơ chế dừng lỗ và bộ lọc thời gian giao dịch để kiểm soát rủi ro và tối ưu hóa hiệu suất chiến lược.
Chiến lược này sử dụng hai EMA với các khoảng thời gian khác nhau làm cơ sở để đánh giá xu hướng. So với trung bình động đơn giản (SMA), EMA có thể phản ứng với những thay đổi giá nhanh hơn và có sự phân phối trọng lượng hợp lý hơn. Khi EMA ngắn hạn vượt qua trên EMA dài hạn, nó cho thấy giá có thể hình thành một xu hướng tăng, và một vị trí dài được mở; ngược lại, khi EMA ngắn hạn vượt dưới EMA dài hạn, nó cho thấy xu hướng tăng có thể kết thúc, và vị trí được đóng.
Ngoài các tín hiệu chéo trung bình động, chiến lược cũng giới thiệu một cơ chế dừng lỗ. Một mặt, một tỷ lệ dừng lỗ cố định được thiết lập, tức là, khi giá giảm hơn một tỷ lệ phần trăm cụ thể so với giá mở, vị trí bị buộc phải đóng để kiểm soát lỗ; mặt khác, cũng có thể chọn đóng vị trí khi giá đóng thấp hơn giá đóng của ngọn nến trước. Hai phương pháp dừng lỗ này có thể kiểm soát hiệu quả việc rút chiến lược.
Hơn nữa, chiến lược cũng giới thiệu bộ lọc thời gian giao dịch. Người dùng có thể tự đặt thời gian bắt đầu và kết thúc giao dịch được phép, do đó tránh giao dịch trong thời gian cụ thể (như ngày lễ, giờ không giao dịch, v.v.).
Đơn giản và dễ sử dụng: Logic chiến lược rõ ràng và chỉ sử dụng hai EMA làm tín hiệu giao dịch, dễ hiểu và thực hiện.
Theo dõi xu hướng: EMA có thể phản ứng nhanh chóng với những thay đổi giá, cho phép chiến lược nắm bắt sự hình thành xu hướng và kết thúc kịp thời, do đó có được lợi nhuận theo dõi xu hướng.
Kiểm soát rủi ro: Việc giới thiệu một tỷ lệ dừng lỗ cố định và một mức dừng lỗ dựa trên giá đóng cửa của ngọn nến trước có thể kiểm soát hiệu quả các khoản lỗ và rút tiền trong một giao dịch.
Các thông số linh hoạt: Người dùng có thể điều chỉnh các thông số như thời gian EMA, tỷ lệ dừng lỗ, liệu có nên sử dụng giá đóng của nến trước đó để dừng lỗ, thời gian giao dịch, v.v., theo nhu cầu của riêng họ, do đó tối ưu hóa hiệu suất chiến lược.
Rủi ro tối ưu hóa tham số: Hiệu suất của chiến lược phụ thuộc vào việc lựa chọn các tham số như thời gian EMA và tỷ lệ dừng lỗ, và các tham số không phù hợp có thể dẫn đến hiệu suất chiến lược kém. Do đó, cần thực hiện tối ưu hóa tham số và kiểm tra lại dữ liệu lịch sử để chọn các tham số tối ưu.
Rủi ro thị trường: Chiến lược chủ yếu áp dụng cho các thị trường xu hướng. Trong thị trường biến động hoặc đảo ngược xu hướng, giao dịch thường xuyên có thể dẫn đến giảm lớn. Do đó, cần phải điều chỉnh các thông số chiến lược hoặc ngừng sử dụng chiến lược theo điều kiện thị trường.
Rủi ro chi phí: Chiến lược có thể tạo ra một số lượng lớn các giao dịch, do đó làm tăng chi phí giao dịch. Do đó, cần phải chọn các mục tiêu giao dịch và khối lượng giao dịch phù hợp và kiểm soát chi phí của mỗi giao dịch.
Giới thiệu nhiều chỉ số kỹ thuật hơn: Trên cơ sở các tín hiệu chéo EMA, giới thiệu các chỉ số kỹ thuật khác như RSI và MACD để tạo ra các tín hiệu giao dịch đa yếu tố và cải thiện độ chính xác của phán đoán xu hướng.
Động thái dừng lỗ: Điều chỉnh động vị trí dừng lỗ theo các chỉ số như biến động thị trường và ATR, đồng thời kiểm soát rủi ro và giảm thiểu thiệt hại lợi nhuận do dừng lỗ càng tốt.
Quản lý vị trí: Điều chỉnh động kích thước vị trí theo sức mạnh của xu hướng thị trường, mức độ lệch giá so với đường trung bình động, v.v., tăng vị trí khi xu hướng mạnh, và giảm vị trí khi xu hướng suy yếu hoặc không rõ ràng.
Tối ưu hóa học máy: Sử dụng thuật toán học máy để tối ưu hóa các tham số chiến lược và tự động chọn kết hợp tham số tối ưu, cải thiện lợi nhuận chiến lược và giảm rủi ro quá mức.
Chiến lược định lượng chéo EMA này sử dụng các tín hiệu chéo của hai EMA để đánh giá xu hướng, trong khi giới thiệu một cơ chế dừng lỗ và bộ lọc thời gian giao dịch, đạt được sự cân bằng tốt giữa khả năng theo dõi xu hướng và kiểm soát rủi ro. Mặc dù logic chiến lược đơn giản, nó có thể đạt được lợi nhuận ổn định trong các thị trường xu hướng thông qua tối ưu hóa tham số hợp lý và kiểm soát rủi ro. Trong tương lai, chiến lược có thể được cải thiện từ các khía cạnh như giới thiệu các chỉ số kỹ thuật hơn, dừng lỗ năng động, quản lý vị trí và tối ưu hóa học máy, để cải thiện hơn nữa hiệu suất và độ bền của chiến lược. Nói chung, chiến lược này là một chiến lược giao dịch định lượng dễ hiểu và dễ thực hiện, phù hợp cho các nhà giao dịch định lượng cấp độ mới để học và sử dụng.
/*backtest start: 2023-03-02 00:00:00 end: 2024-03-07 00:00:00 period: 1d basePeriod: 1h 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/ // © ZenAndTheArtOfTrading / www.PineScriptMastery.com // @version=5 strategy("EMA strategy", overlay=true, initial_capital=50000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, // 100% of balance invested on each trade commission_type=strategy.commission.cash_per_contract, commission_value=0.005) // Interactive Brokers rate // Get user input i_ma1 = input.int(title="MA 1 Length", defval=200, step=10, group="Strategy Parameters", tooltip="Long-term MA") i_ma2 = input.int(title="MA 2 Length", defval=10, step=10, group="Strategy Parameters", tooltip="Short-term MA") i_stopPercent = input.float(title="Stop Loss Percent", defval=0.10, step=0.1, group="Strategy Parameters", tooltip="Failsafe Stop Loss Percent Decline") i_lowerClose = input.bool(title="Exit On Lower Close", defval=false, group="Strategy Parameters", tooltip="Wait for a lower-close before exiting above MA2") i_startTime = input(title="Start Filter", defval=timestamp("01 Jan 1995 13:30 +0000"), group="Time Filter", tooltip="Start date & time to begin searching for setups") i_endTime = input(title="End Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), group="Time Filter", tooltip="End date & time to stop searching for setups") // Get indicator values ma1 = ta.ema(close, i_ma1) ma2 = ta.ema(close, i_ma2) // Check filter(s) f_dateFilter = true // Check buy/sell conditions var float buyPrice = 0 buyCondition = close > ma1 and strategy.position_size == 0 and f_dateFilter sellCondition = close < ma2 and strategy.position_size > 0 //and (not i_lowerClose or close < low[1]) stopDistance = strategy.position_size > 0 ? ((buyPrice - close) / close) : na stopPrice = strategy.position_size > 0 ? buyPrice - (buyPrice * i_stopPercent) : na stopCondition = strategy.position_size > 0 and stopDistance > i_stopPercent // Enter positions if buyCondition strategy.entry(id="Long", direction=strategy.long) if buyCondition[1] buyPrice := open // Exit positions if sellCondition or stopCondition strategy.close(id="Long", comment="Exit" + (stopCondition ? "SL=true" : "")) buyPrice := na // Draw pretty colors plot(buyPrice, color=color.lime, style=plot.style_linebr) plot(stopPrice, color=color.red, style=plot.style_linebr, offset=-1) plot(ma1, color=color.blue) plot(ma2, color=color.orange)