
Chiến lược này dựa trên chỉ số kênh giá, đặt tham số động lực, hình thành đường trung bình của kênh giá bằng cách tính trung bình giá cao nhất và giá thấp nhất trong các chu kỳ khác nhau, sử dụng nó làm chuẩn, đặt đường dài và đường ngắn. Khi giá phá vỡ đường dài, làm nhiều hơn; Khi giá phá vỡ đường ngắn, làm trống.
Chiến lược này sử dụng chỉ số kênh giá để tính toán trung bình của giá cao nhất và giá thấp nhất trong các chu kỳ khác nhau, tạo ra đường trung bình của kênh giá. Dựa trên đường trung bình làm chuẩn, thiết lập đường dài và đường ngắn thông qua tham số thay đổi. Cụ thể, công thức tính toán đường dài là: đường trung bình + (((x tham số đường dài%); công thức tính toán đường ngắn là: đường trung bình + (((x tham số đường ngắn%).
Khi giá thấp hơn đường dài, sử dụng đơn giá giới hạn để mở nhiều lệnh; khi giá cao hơn đường ngắn, sử dụng đơn giá giới hạn để mở nhiều lệnh. Phương thức dừng lỗ của nhiều lệnh là giá quay trở lại đường trung tâm.
Chiến lược này có những ưu điểm sau:
Chiến lược này cũng có một số rủi ro:
Có thể giảm thiểu rủi ro trên 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 với các phán đoán về các chỉ số khác.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Chiến lược này được thiết kế dựa trên các chỉ số đường dẫn giá rõ ràng, sử dụng phá vỡ mở cửa để kiểm soát rủi ro hiệu quả. Tuy nhiên, cũng có nhiều vấn đề về tối ưu hóa tham số và cơ chế dừng lỗ cần được hoàn thiện. Nhìn chung, chiến lược này có một số giá trị thực tế và đáng để kiểm tra và tối ưu hóa hơn nữa.
/*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()