Dựa trên chiến lược định lượng giao thoa trung bình động kép


Ngày tạo: 2024-03-08 14:18:21 sửa đổi lần cuối: 2024-03-08 14:18:21
sao chép: 1 Số nhấp chuột: 622
1
tập trung vào
1617
Người theo dõi

Dựa trên chiến lược định lượng giao thoa trung bình động kép

Tổng quan

Chiến lược này giao dịch dựa trên tín hiệu chéo của hai chỉ số trung bình di chuyển ((EMA)). Khi EMA ngắn hạn vượt qua EMA dài hạn, mở nhiều vị trí; Khi EMA ngắn hạn vượt qua EMA dài hạn, hẹp. Chiến lược này cũng giới thiệu 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.

Các nguyên tắc chiến lược

Chiến lược này sử dụng hai chu kỳ EMA khác nhau làm cơ sở để đánh giá xu hướng. EMA có thể phản ứng nhanh hơn với sự thay đổi giá so với đường trung bình di chuyển đơn giản (SMA) và phân bổ trọng lượng hợp lý hơn. Khi giá trên EMA ngắn hạn đi qua EMA dài hạn, có nghĩa là giá có thể tạo ra xu hướng tăng lên và mở nhiều vị trí hơn; ngược lại, khi EMA ngắn hạn đi qua EMA dài hạn, có nghĩa là xu hướng tăng có thể kết thúc và đóng cửa.

Ngoài các tín hiệu giao thoa, chiến lược này cũng giới thiệu một cơ chế dừng lỗ. Một mặt, thiết lập dừng lỗ phần trăm cố định, nghĩa là bắt buộc bán hàng để kiểm soát tổn thất khi giá giảm hơn một phần trăm nhất định so với giá mở cửa; mặt khác, bạn cũng có thể chọn thanh toán khi giá đóng cửa thấp hơn giá đóng cửa K trước đó.

Ngoài ra, chiến lược này cũng giới thiệu bộ lọc thời gian giao dịch. Người dùng có thể tự thiết lập thời gian bắt đầu và kết thúc giao dịch để tránh giao dịch trong một khoảng thời gian nhất định (như kỳ nghỉ, thời gian không giao dịch, v.v.).

Phân tích lợi thế (Advantage Analysis)

  1. Dễ sử dụng: Chiến lược này có logic rõ ràng, chỉ sử dụng hai EMA làm tín hiệu giao dịch, dễ hiểu và thực hiện.

  2. Theo dõi xu hướng: EMA có thể phản ứng nhanh chóng với sự thay đổi giá, cho phép chiến lược này có thể bắt kịp thời sự hình thành và kết thúc của xu hướng, từ đó thu được lợi nhuận theo dõi xu hướng.

  3. Kiểm soát rủi ro: giới thiệu mức dừng phần trăm cố định và dừng dựa trên giá đóng cửa của dòng K trước, có thể kiểm soát hiệu quả tổn thất và rút tiền giao dịch đơn lẻ.

  4. Các tham số linh hoạt: Người dùng có thể điều chỉnh các tham số như chu kỳ EMA, tỷ lệ phần trăm dừng, liệu có sử dụng giá dừng K trước, thời gian giao dịch, để tối ưu hóa hiệu suất chiến lược theo nhu cầu của mình.

Phân tích rủi ro

  1. 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 lựa chọn các tham số như chu kỳ EMA, tỷ lệ dừng, các tham số không phù hợp có thể dẫn đến hiệu suất kém của chiến lược. Do đó, cần phải tối ưu hóa tham số và kiểm tra lại trên dữ liệu lịch sử để chọn tham số tối ưu nhất.

  2. Rủi ro thị trường: Chiến lược này được áp dụng chủ yếu cho thị trường xu hướng, giao dịch thường xuyên có thể dẫn đến rút lui lớn khi thị trường biến động hoặc xu hướng đảo ngược. Do đó, cần điều chỉnh các tham số chiến lược hoặc ngừng sử dụng chiến lược theo tình trạng thị trường.

  3. Rủi ro chi phí: Chiến lược này có thể tạo ra nhiều giao dịch hơn, do đó làm tăng chi phí giao dịch. Do đó, cần phải chọn tiêu chuẩn giao dịch và khối lượng giao dịch phù hợp và kiểm soát chi phí cho mỗi giao dịch.

Hướng tối ưu hóa

  1. Thêm nhiều chỉ số kỹ thuật: Trên cơ sở tín hiệu giao chéo EMA, giới thiệu các chỉ số kỹ thuật khác như RSI, MACD, để tạo ra tín hiệu giao dịch đa yếu tố, cải thiện độ chính xác của xu hướng.

  2. Hạn chế động lực: tùy thuộc vào biến động của thị trường, ATR và các chỉ số khác, điều chỉnh động vị trí dừng lỗ, trong khi kiểm soát rủi ro, giảm thiểu tối đa tổn thất thu nhập do dừng lỗ.

  3. Quản lý vị trí: tùy thuộc vào cường độ của xu hướng thị trường, mức độ lệch giá so với đường trung bình, kích thước vị trí được điều chỉnh động, tăng vị trí khi xu hướng mạnh, giảm vị trí khi xu hướng yếu hoặc không rõ ràng.

  4. Tối ưu hóa học máy: Sử dụng các thuật toán học máy để tối ưu hóa các tham số chiến lược, tự động chọn kết hợp tham số tối ưu nhất, tăng lợi nhuận chiến lược và giảm nguy cơ quá phù hợp.

Kết luận

Chiến lược định lượng chéo song song này đánh giá xu hướng thông qua tín hiệu chéo của hai EMA, đồng thời giới thiệu cơ chế dừng lỗ và bộ lọc thời gian giao dịch, tạo ra 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 của chiến lược đơn giản, nhưng có thể đạt được lợi nhuận ổn định trong thị trường đang có xu hướng với tối ưu hóa tham số và kiểm soát rủi ro hợp lý.

Mã nguồn chiến lược
/*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)