Chiến lược này sử dụng chỉ số ZigZag để xác định hướng xu hướng và theo xu hướng một khi được xác nhận.
Chiến lược này chủ yếu sử dụng chỉ số ZigZag để xác định hướng xu hướng giá. ZigZag có thể lọc tiếng ồn thị trường và xác định các hướng biến động giá lớn. Nó tạo ra tín hiệu giao dịch khi giá đạt mức cao hoặc thấp mới.
Đặc biệt, chiến lược đầu tiên tính toán các giá trị ZigZag. Khi giá đạt mức cao hơn, giá trị ZigZag trở thành giá cao. Khi giá đạt mức thấp hơn, giá trị ZigZag trở thành giá thấp. Do đó, ZigZag có thể phản ánh rõ hướng biến động giá chính.
Chiến lược xác định hướng xu hướng dựa trên giá trị ZigZag. Khi ZigZag tăng, nó chỉ ra xu hướng tăng. Khi ZigZag giảm, nó chỉ ra xu hướng giảm. Chiến lược mở các vị trí khi ZigZag quay lại để theo hướng xu hướng.
Đặc biệt, chiến lược sẽ dài khi ZigZag quay sang mức cao mới và ngắn khi ZigZag quay sang mức thấp mới. Điều kiện thoát là khi ZigZag quay lại. Điều này đạt được giao dịch tự động dựa trên ZigZag để xác định xu hướng.
Các rủi ro có thể được giảm bằng cách:
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Thêm lệnh dừng lỗ để kiểm soát rủi ro lỗ duy nhất, ví dụ như lệnh dừng hoặc lệnh dừng giới hạn.
Thêm các cơ chế phát hiện sự đảo ngược xu hướng, ví dụ: MACD, đường trung bình động.
Thêm mô-đun nhập lại, vị trí kim tự tháp khi xu hướng tiếp tục.
Thêm các mô hình học máy như LSTM để hỗ trợ phát hiện xu hướng.
Tối ưu hóa quản lý vốn dựa trên lý thuyết rút vốn hoặc tương quan.
Tối ưu hóa toàn diện các thông số như thời gian ZigZag bằng cách kiểm tra lại và tham chiếu chuyên môn.
Chiến lược xác định hướng xu hướng bằng ZigZag và giao dịch xu hướng. Logic đơn giản và dễ thực hiện. Nhưng rủi ro như sự phụ thuộc chỉ số duy nhất và đảo ngược xu hướng tồn tại. Chúng ta có thể tối ưu hóa thông qua dừng lỗ, chỉ số phụ trợ, tái nhập, mô hình học máy vv để làm cho nó mạnh mẽ hơn và hợp lý hơn. Với các tham số và kiểm soát rủi ro thích hợp, nó có thể theo dõi hiệu quả xu hướng trung dài.
/*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()