
Chiến lược này là một chiến lược giao dịch định lượng P-Signal dựa trên hàm sai số Gaussian để tính toán sự thay đổi giá. Nó sử dụng P-Signal để đánh giá xu hướng giá và điểm biến, từ đó quyết định thời gian nhập và thoát.
Chỉ số cốt lõi của chiến lược là P-Signal. Công thức tính toán của P-Signal là:
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
Ở đây ser là chuỗi giá, int là tham số nPoints, tức là xem có bao nhiêu đường K. Công thức này bao gồm ba phần:
Toàn bộ công thức này có nghĩa là giá được phân chia theo chênh lệch tiêu chuẩn của giá bằng trung bình di chuyển, sau đó được phân chia theo sqrt ((2)), sau đó được chuẩn hóa, sau đó được lập bản đồ bằng hàm sai số Gaussian vào khoảng ((-1, 1) ≠; nghĩa là nếu giá dao động lớn hơn trung bình, P-Signal gần 1; nếu giá dao động nhỏ hơn trung bình, P-Signal gần −1.
Chiến lược sử dụng giá trị của P-Signal và các ký hiệu thay đổi của nó để quyết định nhập cảnh và xuất cảnh:
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
Khi P-Signal nhỏ hơn 0 và thay đổi thành tích, hãy làm nhiều; khi P-Signal lớn hơn 0 và thay đổi thành âm, hãy bằng phẳng.
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 biệt là:
Để giảm những rủi ro này, bạn có thể xem xét tăng các điều kiện lọc, giảm tần suất giao dịch; tối ưu hóa các tham số và thiết lập chi phí giao dịch; mài cứng, chọn giống thích hợp.
Chiến lược này còn có thể được tối ưu hóa hơn nữa, chủ yếu là:
Nhìn chung, ý tưởng cốt lõi của chiến lược này là mới mẻ, sử dụng hàm Gaussian để phù hợp với phân bố giá và tự động điều chỉnh phạm vi tham số. Tuy nhiên, là một chiến lược giao dịch tần số cao, cần phải được thử nghiệm và tối ưu hóa thêm, đặc biệt là kiểm soát rủi ro và điều chỉnh tham số, để có thể ổn định lợi nhuận trong thị trường thực.
/*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.