Chiến lược giao dịch lệnh giới hạn đa MA

Tác giả:ChaoZhang, Ngày: 2023-09-22 14:16:20
Tags:

Tổng quan

Đây là một chiến lược giao dịch thiết lập các lệnh giới hạn dựa trên nhiều đường trung bình động. Nó sẽ thiết lập số lượng lệnh giới hạn dài hoặc ngắn khác nhau khi giá vượt qua các mức MA khác nhau, tạo thành nhiều vị trí hình kim tự tháp. Khi giá vượt qua MA một lần nữa, các lệnh giới hạn ngược sẽ được mở. Khi giữ các vị trí, các vị trí sẽ được đóng bằng các lệnh thị trường ngược nếu giá vượt qua mức MA giữa.

Chiến lược logic

Chiến lược này sử dụng đường trung bình động để xác định hướng xu hướng. Cụ thể, nó xác định số lượng lệnh giới hạn dài dựa trên việc giá có vượt qua 3 đường MA tăng hay không. Và nó xác định số lượng lệnh giới hạn ngắn dựa trên việc giá vượt qua 3 đường MA giảm hay không.

Do đó, xu hướng càng mạnh, các lệnh giới hạn theo cùng hướng sẽ được đặt nhiều hơn. Khi giá hiển thị tín hiệu đảo ngược, các vị trí đảo ngược sẽ được mở. MA giữa được sử dụng để đánh giá sự đột phá của các vị trí hiện có và tạo ra các tín hiệu đóng.

Toàn bộ chiến lược kết hợp mở kiểu kim tự tháp với đóng kiểu đột phá để tạo ra logic giao dịch. Nó nhằm mục đích mở các vị trí ở mức giá trung bình tốt hơn để giảm chi phí và sử dụng MA giữa để dừng lỗ để kiểm soát rủi ro.

Phân tích lợi thế

Những lợi thế của chiến lược này bao gồm:

  1. Sử dụng MAs để xác định xu hướng, đơn giản và trực quan để vận hành.

  2. Mở kiểu kim tự tháp có thể có được giá trung bình tốt hơn ở giai đoạn đầu của xu hướng.

  3. Đặt lệnh dừng lỗ MA ở giữa có thể ngăn chặn lỗ và kiểm soát rủi ro kịp thời.

  4. Lệnh giới hạn tránh trượt.

  5. Các tham số có thể tùy chỉnh thích nghi với các sản phẩm khác nhau.

  6. Cấu trúc rõ ràng, dễ hiểu và mở rộng.

Phân tích rủi ro

Các rủi ro của chiến lược bao gồm:

  1. Sự chậm trễ của MA có thể gây ra sự đánh giá sai.

  2. Các lệnh giới hạn thất bại có thể không có cơ hội nhập cảnh.

  3. Lỗ dừng MA trung bình có thể quá thô để đánh giá đột phá.

  4. Cài đặt tham số không chính xác có thể dẫn đến các vị trí quá lớn.

  5. Không đủ thời gian kiểm tra lại có thể gây ra quá độ.

  6. Không tính đến chi phí giao dịch.

Các giải pháp là:

  1. Thêm các chỉ số khác để xác nhận, tối ưu hóa các thông số.

  2. Đặt hết hạn, điều chỉnh giá giới hạn.

  3. Thêm lợi nhuận hoặc logic ở giữa MA dừng lỗ.

  4. Tối ưu hóa các thông số, đánh giá tỷ lệ rủi ro-lợi nhuận.

  5. Mở rộng thời gian backtest, nhiều thị trường backtest.

  6. Thêm chi phí giao dịch và logic trượt.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Tối ưu hóa các tham số cho nhiều sản phẩm hơn, sử dụng các phương pháp học máy.

  2. Thêm các chỉ số khác để xác nhận, ví dụ như MACD, KDJ v.v.

  3. Thêm lợi nhuận lấy logic ở giữa đường MA.

  4. Điều chỉnh động kích thước vị trí và mức dừng lỗ.

  5. Tối ưu hóa giá giới hạn cho chi phí nhập cảnh tốt hơn, ví dụ dựa trên biến động.

  6. Quản lý chi phí để ngăn chặn xu hướng theo đuổi quá mức.

  7. Kiểm tra các tham số trên các sản phẩm khác nhau để xây dựng các hồ sơ tham số.

Kết luận

Chiến lược này mở các vị trí hình kim tự tháp với lệnh giới hạn để đạt được chi phí trung bình tốt hơn. Nó sử dụng MA giữa để dừng lỗ để kiểm soát rủi ro. Cấu trúc chiến lược đơn giản và rõ ràng, dễ hiểu và mở rộng. Nhưng nó có thể được cải thiện bằng cách giới thiệu các chỉ số khác, tối ưu hóa các tham số, cải thiện logic lệnh giới hạn vv để làm cho nó mạnh mẽ hơn. Nhìn chung, chiến lược này cung cấp một ý tưởng đơn giản và thực tế về giao dịch lệnh giới hạn có một số giá trị tham chiếu.


/*backtest
start: 2022-09-15 00:00:00
end: 2023-09-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2019

//@version=4
strategy(title = "Robot WhiteBox MultiMA", shorttitle = "Robot WhiteBox MultiMA", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 3)

//Settings
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(3, minval = 1, title = "MA Length")
s = input(defval = "7. OHLC4", options = ["1. Open", "2. High", "3. Low", "4. Close", "5. HL2", "6. HLC3", "7. OHLC4", "8. OC2", "9. PCMA"], title = "Data")
short3 = input(true, title = "short 3")
short2 = input(true, title = "short 2")
short1 = input(true, title = "short 1")
long1 = input(true, title = "long 1")
long2 = input(true, title = "long 2")
long3 = input(true, title = "long 3")
shortlevel3 = input(15.0, title = "Short line 3")
shortlevel2 = input(10.0, title = "Short line 2")
shortlevel1 = input(5.0, title = "Short line 1")
longlevel1 = input(-5.0, title = "Long line 1")
longlevel2 = input(-10.0, title = "Long line 2")
longlevel3 = input(-15.0, title = "Long line 3")
needoffset = input(true, title = "Offset")
fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Variables
size = strategy.position_size
mult = 1 / syminfo.mintick
needtime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)

//MA
oc2 = (open + close) / 2
pcma = (highest(high, len) + lowest(low, len)) / 2
src = s == "1. Open" ? open : s == "2. High" ? high : s == "3. Low" ? low : s == "4. Close" ? close : s == "5. HL2" ? hl2 : s == "6. HLC3" ? hlc3 : s == "7. OHLC4" ? ohlc4 : s == "8. OC2" ? oc2: close
sma = sma(src, len)
ma = s == "9. PCMA" ? round(pcma * mult) / mult : round(sma * mult) / mult

//Levels
longline1 = long1 ? round(ma * ((100 + longlevel1) / 100) * mult) / mult : close
longline2 = long2 ? round(ma * ((100 + longlevel2) / 100) * mult) / mult : close
longline3 = long3 ? round(ma * ((100 + longlevel3) / 100) * mult) / mult : close
shortline1 = short1 ? round(ma * ((100 + shortlevel1) / 100) * mult) / mult : close
shortline2 = short2 ? round(ma * ((100 + shortlevel2) / 100) * mult) / mult : close
shortline3 = short3 ? round(ma * ((100 + shortlevel3) / 100) * mult) / mult : close

//Lines
colorlong1 = long1 ? color.lime : na
colorlong2 = long2 ? color.lime : na
colorlong3 = long3 ? color.lime : na
colorshort1 = short1 ? color.red : na
colorshort2 = short2 ? color.red : na
colorshort3 = short3 ? color.red : na
offset = needoffset ? 1 : 0
plot(shortline3, offset = offset, color = colorshort3, title = "Short line 3")
plot(shortline2, offset = offset, color = colorshort2, title = "Short line 2")
plot(shortline1, offset = offset, color = colorshort1, title = "Short line 1")
plot(ma, offset = offset, color = color.blue, title = "MA line")
plot(longline1, offset = offset, color = colorlong1, title = "Long line 1")
plot(longline2, offset = offset, color = colorlong2, title = "Long line 2")
plot(longline3, offset = offset, color = colorlong3, title = "Long line 3")

//Trading
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]
lots = 0.0
if ma > 0
    lots := round(size / lot)
    strategy.entry("L1", strategy.long, lot, limit = longline1, when = (lots == 0 and long1 and needtime))
    lots := round(size / lot)
    strategy.entry("L2", strategy.long, lot, limit = longline2, when = (lots <= 1 and long2 and needtime))
    lots := round(size / lot)
    strategy.entry("L3", strategy.long, lot, limit = longline3, when = (lots <= 2 and long3 and needtime))
    lots := round(size / lot)
    strategy.entry("S1", strategy.short, lot, limit = shortline1, when = (lots == 0 and short1 and needtime))
    lots := round(size / lot)
    strategy.entry("S2", strategy.short, lot, limit = shortline2, when = (lots >= -1 and short2 and needtime))
    lots := round(size / lot)
    strategy.entry("S3", strategy.short, lot, limit = shortline3, when = (lots >= -2 and short3 and needtime))
if size > 0
    strategy.entry("TPL", strategy.short, 0, limit = ma)
if size < 0
    strategy.entry("TPS", strategy.long, 0, limit = ma)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

Thêm nữa