Chiến lược này là một chiến lược giao dịch định lượng dựa trên chỉ số P-Signal được tính bằng hàm lỗi Gaussian để đo lường sự thay đổi giá. Nó sử dụng P-Signal để xác định xu hướng giá và các điểm chuyển đổi cho các bước vào và ra.
Chỉ số cốt lõi của chiến lược này là tín hiệu P. Công thức tính toán của tín hiệu P là:
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
Ở đây ser đại diện cho chuỗi giá, int đại diện cho tham số nPoints, đó là số thanh để xem lại.
Ý nghĩa của toàn bộ công thức là lấy trung bình động của giá chia cho độ lệch chuẩn của giá, sau đó chia cho sqrt (((2) để tiêu chuẩn hóa, và cuối cùng được lập bản đồ đến phạm vi (-1, 1) bằng hàm lỗi Gauss.
Chiến lược sử dụng giá trị của P-Signal và dấu hiệu thay đổi của nó để xác định các bước vào và ra:
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
Nó đi dài khi tín hiệu P nhỏ hơn 0 và thay đổi thành dương tính. Nó đóng vị trí khi tín hiệu P lớn hơn 0 và thay đổi thành âm.
Những lợi thế của chiến lược này bao gồm:
Ngoài ra còn có một số rủi ro với chiến lược này:
Để giảm những rủi ro đó, một số biện pháp có thể được xem xét: thêm các bộ lọc để giảm tần suất giao dịch; tối ưu hóa sự kết hợp các tham số và thiết lập chi phí giao dịch; thử nghiệm trực tiếp và lựa chọn các sản phẩm phù hợp.
Có chỗ cho việc nâng cao hơn nữa:
Kết luận, ý tưởng cốt lõi của chiến lược này là sáng tạo, phân phối giá phù hợp với hàm Gaussian và điều chỉnh tự động các tham số.
/*backtest start: 2023-01-12 00:00:00 end: 2024-01-18 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // ********************************************************************************************************** // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // P-Signal Strategy © Kharevsky // @version=4 // ********************************************************************************************************** strategy("P-Signal Strategy", precision = 3) // Parameters and const of P-Signal. nPoints = input(title = "Number of Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.") int nIntr = nPoints - 1 // Horner's method for the error (Gauss) & P-Signal functions. fErf(x) => nT = 1.0/(1.0 + 0.5*abs(x)) nAns = 1.0 - nT*exp(-x*x - 1.26551223 + nT*( 1.00002368 + nT*( 0.37409196 + nT*( 0.09678418 + nT*(-0.18628806 + nT*( 0.27886807 + nT*(-1.13520398 + nT*( 1.48851587 + nT*(-0.82215223 + nT*( 0.17087277 )))))))))) x >= 0 ? nAns : -nAns fPSignal(ser, int) => nStDev = stdev(ser, int) nSma = sma(ser, int) fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0) // Strat. float nPSignal = sma(fPSignal(change(ohlc4), nIntr), nIntr) float ndPSignal = sign(nPSignal[0] - nPSignal[1]) strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0) strategy.close("long", when = nPSignal > 0 and ndPSignal < 0) // Plotting. hline(+1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted) hline(-1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted) plot(nPSignal, color = color.blue, style = plot.style_line) plot(strategy.position_size, color = color.white, style = plot.style_cross) // Alerts. if(strategy.position_size[0] > strategy.position_size[1]) alert("P-Signal strategy opened the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar) if(strategy.position_size[0] < strategy.position_size[1]) alert("P-Signal strategy closed the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar) // The end.