Chiến lược trung bình động động

Tác giả:ChaoZhang, Ngày: 2023-11-23 11:39:24
Tags:

img

Tổng quan

Chiến lược này được gọi là Dynamic Moving Average Strategy. Ý tưởng chính là sử dụng hướng của đường trung bình động và mối quan hệ của nó với giá để xác định xu hướng.

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

Chiến lược này sử dụng giá nguồn trong một khoảng thời gian dài để tính trung bình động, trong đó giá nguồn có thể là OHLC4, HLC3, giá đóng vv. Giá trung bình động kết quả được định nghĩa là sma. Sau đó đường dài và đường ngắn được vẽ dựa trên tỷ lệ phần trăm của giá trị trung bình động để xác định xem chúng ta đang trong xu hướng tăng hay giảm.

Cụ thể, đường ngắn được tính như sau: đường ngắn = sma * ((100 + shortlevel) / 100), trong đó đường ngắn là một số tích cực được thiết lập bởi người dùng, đại diện cho tỷ lệ phần trăm mà đường ngắn nằm trên trung bình động.

Do đó, giá trị đường ngắn luôn lớn hơn trung bình chuyển động và giá trị đường dài luôn thấp hơn trung bình chuyển động. Khi giá vượt qua đường ngắn, nó đại diện cho xu hướng tăng lên bắt đầu. Tại thời điểm này nếu needlong cho phép dài, nó sẽ đặt lệnh dài ở mức giá đường dài. Khi giá vượt qua dưới đường dài, nó đại diện cho xu hướng giảm bắt đầu. Tại thời điểm này nếu needshort cho phép ngắn, nó sẽ đặt lệnh ngắn ở mức giá đường ngắn.

Bất kể là dài hay ngắn, khi giá chuyển trở lại mức trung bình động, điều đó có nghĩa là xu hướng kết thúc.

Vì vậy, hướng xu hướng và các mục tương ứng và tồn tại được xác định bởi mối quan hệ năng động giữa các đường dài / ngắn và đường trung bình động.

Ưu điểm

Ưu điểm lớn nhất của chiến lược này là bằng cách thiết lập động các đường dài và ngắn, nó có thể tương đối linh hoạt nắm bắt hướng xu hướng chính. so với các chiến lược kích hoạt nhập và xuất ở mức cố định, chiến lược này là tiên tiến và thông minh hơn.

Thứ hai, trung bình động có tác dụng lọc đến một mức độ nào đó, tránh bị mắc kẹt bởi biến động tần số cao đến một mức độ nào đó.

Rủi ro

Rủi ro lớn nhất của chiến lược này là hiệu suất của các đường trung bình động khác nhau trong các giai đoạn khác nhau. Thông thường đường trung bình động là đủ để đại diện cho hướng xu hướng, nhưng trong một số điều kiện thị trường cực đoan, đường trung bình động có thể bị xâm nhập trong ngắn hạn, gây ra các mục nhập sai, hoặc chênh lệch trên cùng v.v. Trong trường hợp này, đường trung bình động dài hơn là cần thiết để đảm bảo tính chính xác của phán đoán xu hướng.

Một khía cạnh khác của rủi ro là các đường trung bình động có quán tính cao. Đối với một số biến động giá ngắn và dữ dội, rất khó để đường trung bình động phản ứng kịp thời, do đó bỏ lỡ các điểm vào hoặc ra. Thời gian cần được giảm để tăng tốc độ phản ứng của đường trung bình động.

Tăng cường

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

  1. Thêm logic dừng lỗ. Vì các đường trung bình động có sự chậm trễ trong việc đánh giá xu hướng, không thể tránh hoàn toàn bị mắc kẹt. Vì vậy, việc dừng lại phù hợp có thể làm giảm thêm rủi ro.

  2. Tối ưu hóa các tham số của đường dài / ngắn. Hiện tại tỷ lệ phần trăm đường dài / ngắn lệch từ đường trung bình động được cố định. Chúng có thể được kiểm tra trên các bộ dữ liệu khác nhau để tìm ra các giá trị tối ưu.

  3. Ngoài các vị trí đường dài / ngắn, các thuật toán cũng có thể đánh giá sức mạnh của xu hướng, để tránh lỗi từ các tín hiệu xu hướng yếu.

  4. Hãy thử áp dụng các đường trung bình động cho các sản phẩm giao dịch khác để xác minh hiệu suất giữa các sản phẩm.

Kết luận

Chiến lược này xác định xu hướng và đặt các giao dịch dài / ngắn tương ứng bằng cách thiết lập động các điểm vào và ra dựa trên đường trung bình động. Phương pháp này tạo ra các tín hiệu giao dịch năng động dựa trên đường trung bình động linh hoạt và thông minh hơn trong việc nắm bắt xu hướng giá so với mức kích hoạt tĩnh. Nó cũng giải quyết vấn đề thiếu tính kịp thời của đường trung bình động. Với kiểm tra ngược có hệ thống và tối ưu hóa tham số, chiến lược này có thể mang lại lợi nhuận tốt.


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

//Noro
//2018

//@version=3
strategy(title = "Noro's ShiftMA Strategy v1.1", shorttitle = "ShiftMA str 1.1", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 100)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(false, defval = false, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
per = input(3, title = "Length")
src = input(ohlc4, title = "Source")
shortlevel = input(10.0, title = "Short line (red)")
longlevel = input(-5.0, title = "Long line (lime)")
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")

//SMAs
sma = sma(src, per) 
//sma = lowest(low, per)
shortline = sma * ((100 + shortlevel) / 100)
longline = sma * ((100 + longlevel) / 100)
plot(shortline, linewidth = 2, color = red, title = "Short line")
plot(sma, linewidth = 2, color = blue, title = "SMA line")
plot(longline, linewidth = 2, color = lime, title = "Long line")

//plot(round(buy * 100000000), linewidth = 2, color = lime)
//plot(round(sell * 100000000), linewidth = 2, color = red)

//Trading
size = strategy.position_size
lot = 0.0
lot := size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if (not na(close[per])) and size == 0 and needlong
    strategy.entry("L", strategy.long, lot, limit = longline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size == 0 and needshort
    strategy.entry("S", strategy.short, lot, limit = shortline, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size > 0 
    strategy.entry("Close", strategy.short, 0, limit = sma, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if (not na(close[per])) and size < 0 
    strategy.entry("Close", strategy.long, 0, limit = sma, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()

Thêm nữa