Chiến lược theo xu hướng dựa trên ZigZag


Ngày tạo: 2023-10-30 14:51:08 sửa đổi lần cuối: 2023-10-30 14:51:08
sao chép: 0 Số nhấp chuột: 843
1
tập trung vào
1617
Người theo dõi

Chiến lược theo xu hướng dựa trên ZigZag

Tổng quan

Chiến lược này sử dụng chỉ số ZigZag để xác định hướng xu hướng và theo dõi xu hướng sau khi xác nhận xu hướng, thuộc chiến lược theo dõi xu hướng.

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

Chiến lược này chủ yếu thông qua chỉ số ZigZag để xác định xu hướng của giá. Chỉ số ZigZag có thể lọc tiếng ồn thị trường và xác định hướng dao động của giá chính. Khi giá tạo ra một mức cao mới hoặc thấp mới, ZigZag sẽ phát tín hiệu giao dịch.

Cụ thể, chiến lược này tính toán giá trị ZigZag đầu tiên, khi giá tạo ra điểm cao cao hơn, ZigZag là giá điểm cao đó; khi giá tạo ra điểm thấp hơn, ZigZag là giá điểm thấp đó. Như vậy, ZigZag có thể phản ánh rõ ràng hướng biến động chính của giá.

Chiến lược đánh giá xu hướng theo giá trị ZigZag. Khi ZigZag tăng, nó cho thấy nó đang trong xu hướng tăng; Khi ZigZag giảm, nó cho thấy nó đang trong xu hướng giảm. Chiến lược mở vị trí khi ZigZag đảo chiều để theo dõi xu hướng.

Cụ thể, chiến lược mở nhiều lệnh khi ZigZag xoay hình thành một mức cao mới và mở đơn trống khi ZigZag xoay hình thành một mức thấp mới. Điều kiện trơn là ZigZag xoay lại và ngược lại. Điều này thực hiện chiến lược giao dịch tự động dựa trên xu hướng phán đoán ZigZag.

Phân tích lợi thế chiến lược

  • Sử dụng chỉ số ZigZag để đánh giá xu hướng, nó có thể lọc hiệu quả tiếng ồn thị trường và xác định chính xác xu hướng chính.
  • Thời điểm chuyển đổi ZigZag chính xác, dễ dàng tạo ra thời gian nhập cảnh tốt hơn.
  • Thực hiện chiến lược theo dõi xu hướng hoàn toàn mà không cần các chỉ số phức tạp khác hoặc hỗ trợ mô hình.
  • Lập luận của chiến lược đơn giản, rõ ràng, dễ hiểu và sửa đổi.
  • Các tham số có thể điều chỉnh tần số giao dịch của chiến lược kiểm soát tự do.

Phân tích rủi ro

  • ZigZag không nhạy cảm với chuyển đổi bò và gấu ngắn giữa, có thể bỏ lỡ sự đảo ngược nhanh hơn.
  • Chiến lược theo dõi xu hướng, không thể đối phó với tổn thất do đảo ngược xu hướng.
  • Không có giới hạn về số lượng tổn thất đơn lẻ và có nguy cơ tổn thất đơn lẻ lớn hơn.
  • Chiến lược chỉ dựa trên một chỉ số, có thể có nguy cơ quá phù hợp.

Bạn có thể làm giảm nguy cơ bằng cách:

  • Kết hợp các chỉ số khác để xác định nguy cơ đảo ngược xu hướng.
  • Giảm thời gian nắm giữ một cách thích hợp và dừng lỗ kịp thời.
  • Thêm mô-đun quản lý tài chính, hạn chế số lượng tổn thất đơn lẻ
  • Thêm mô hình học máy để cải thiện tính mạnh mẽ của chiến lược.

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

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

  1. Thêm chiến lược dừng lỗ để kiểm soát rủi ro lỗ đơn. Bạn có thể thiết lập dừng di chuyển hoặc dừng một lần.

  2. Thêm cơ chế phán đoán xu hướng đảo ngược. Bạn có thể tham gia các chỉ số như MACD, trung bình di chuyển và đóng vị trí khi phán đoán xu hướng đảo ngược.

  3. Tham gia mô-đun nhập lại. Nếu xu hướng tiếp tục, bạn có thể đặt cược phù hợp để kiếm được nhiều lợi nhuận hơn.

  4. Thêm mô hình học máy. Có thể đào tạo mô hình học sâu như LSTM, hỗ trợ ZigZag xác định xu hướng.

  5. Cơ chế quản lý quỹ tối ưu. Kích thước vị trí có thể được tối ưu hóa dựa trên lý thuyết thu hồi hoặc liên quan.

  6. Các tham số tối ưu hóa toàn diện được thiết lập. Các tham số tối ưu hóa có thể được thực hiện thông qua lịch sử và tham khảo các sách chuyên môn, chẳng hạn như độ dài chu kỳ của ZigZag.

Tóm tắt

Chiến lược này sử dụng chỉ số ZigZag để xác định hướng xu hướng, thực hiện chiến lược giao dịch dựa trên xu hướng. Logic của chiến lược đơn giản, rõ ràng và dễ thực hiện. Nhưng cũng có những vấn đề như phụ thuộc vào chỉ số đơn, rủi ro đảo ngược xu hướng.

Mã nguồn chiến lược
/*backtest
start: 2022-10-23 00:00:00
end: 2023-04-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's ZZ Strategy v1.0", shorttitle = "ZZ str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//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 = "Capital, %")
tf = input('W', title='Timeframe for ZigZag')
showzz = input(false, defval = false, title = "Show ZigZag")
showbg = input(false, defval = false, title = "Show Background")
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")

//ZigZag
zigzag() =>
    _isUp = close >= open
    _isDown = close <= open
    _direction = _isUp[1] and _isDown ? -1 : _isDown[1] and _isUp ? 1 : nz(_direction[1])
    _zigzag = _isUp[1] and _isDown and _direction[1] != -1 ? highest(2) : _isDown[1] and _isUp and _direction[1] != 1 ? lowest(2) : na
useAltTF = true
zz = useAltTF ? (change(time(tf)) != 0 ? request.security(syminfo.tickerid, tf, zigzag()) : na) : zigzag()
zzcolor = showzz ? black : na
plot(zz, title = 'ZigZag', color = zzcolor, linewidth = 2)

//Levels
dot = zz > 0 ? zz : dot[1]
uplevel = dot > dot[1] ? dot : uplevel[1]
dnlevel = dot < dot[1] ? dot : dnlevel[1]
colorup = close[1] < uplevel[1] and uplevel == uplevel[1] ? lime : na
colordn = close[1] > dnlevel[1] and dnlevel == dnlevel[1] ? red : na
plot(uplevel, color = colorup, linewidth = 3)
plot(dnlevel, color = colordn, linewidth = 3)

//Background
size = strategy.position_size
bgcol = showbg == false ? na : size != size[1] ? blue : na
bgcolor(bgcol, transp = 50)

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

if uplevel > 0 and dnlevel > 0
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot, stop = uplevel + syminfo.mintick)
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, stop = dnlevel - syminfo.mintick)

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