Chiến lược này dựa trên chỉ số kênh giá. Bằng cách thiết lập một thông số động lực, nó tính toán giá trị trung bình của giá cao nhất và thấp nhất trong các chu kỳ khác nhau để tạo ra đường trung bình của kênh giá, và thiết lập các đường dài và ngắn dựa trên điều này. Khi giá vượt qua đường dài, nó sẽ dài; khi giá vượt qua đường ngắn, nó sẽ ngắn. Điều kiện đóng cửa là giá sẽ lùi xuống đường trung bình của kênh.
Chiến lược này sử dụng chỉ số kênh giá để tính giá trị trung bình của giá cao nhất và thấp nhất trong các chu kỳ khác nhau để tạo thành đường giữa kênh. Dựa trên đường giữa, các đường dài và đường ngắn được thiết lập thông qua tham số chuyển đổi. Cụ thể, công thức tính toán đường dài là: đường trung + (chỉ số đường trung × đường dài %); công thức tính toán đường ngắn là: đường trung + (chỉ số đường trung × đường ngắn%).
Khi giá thấp hơn đường dài, mở các vị trí dài với lệnh giới hạn; khi giá cao hơn đường ngắn, mở các vị trí ngắn với lệnh giới hạn.
Chiến lược có những lợi thế sau:
Chiến lược này cũng có một số rủi ro:
Các rủi ro trên có thể được giảm thiểu bằng cách tối ưu hóa các tham số, đặt lệnh dừng lỗ hoặc kết hợp các chỉ số khác để đánh giá.
Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:
Ý tưởng thiết kế của chiến lược này dựa trên chỉ số kênh giá là rõ ràng. Sử dụng breakout để mở các vị trí có thể kiểm soát rủi ro một cách hiệu quả. Nhưng cũng có không gian tối ưu hóa tham số lớn và cơ chế dừng lỗ cần được cải thiện. Nhìn chung, chiến lược có một giá trị thực tế nhất định và đáng để thử nghiệm và tối ưu hóa thêm.
/*backtest start: 2022-11-29 00:00:00 end: 2023-12-05 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=3 strategy(title = "Noro's PCMA Strategy v1.0", shorttitle = "PCMA 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(true, defval = true, title = "Short") capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %") per = input(3, title = "Length") 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") //Price Channel h = highest(high, per) l = lowest(low, per) c = (h + l) / 2 ll = c + ((c / 100) * longlevel) sl = c + ((c / 100) * shortlevel) //Lines shortcolor = needshort ? red : na longcolor = needlong ? lime : na plot(sl, linewidth = 2, color = shortcolor, title = "Short line") plot(c, linewidth = 2, color = blue, title = "SMA line") plot(ll, linewidth = 2, color = longcolor, title = "Long line") //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 = ll, 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 = sl, 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 = c, 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 = c, 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()