Chiến lược giao dịch đa khung thời gian P-Signal


Ngày tạo: 2023-11-28 16:32:36 sửa đổi lần cuối: 2023-11-28 16:32:36
sao chép: 1 Số nhấp chuột: 641
1
tập trung vào
1619
Người theo dõi

Chiến lược giao dịch đa khung thời gian P-Signal

Tổng quan

Chiến lược giao dịch đa khung thời gian P-Signal là một chiến lược giao dịch thuật toán tiền tệ kỹ thuật số dựa trên các nguyên tắc thống kê kết hợp với phân tích đa khung thời gian. Chiến lược này sử dụng hàm sai sót Gaussian và chỉ số P-Signal để mô hình hóa ngày, tuần và trăng của Bitcoin, để thực hiện giao dịch tỷ lệ biến động theo chỉ số Gold Fork Plus và Dead Fork Zero.

Nguyên tắc chiến lược

Chỉ số cốt lõi của chiến lược P-Signal là P-Signal, nó kết hợp sự chênh lệch chuẩn thống kê và trung bình di chuyển đơn giản, được lập bản đồ từ -1 đến 1 thông qua hàm sai sót Gaussian, được sử dụng để phát hiện thị trường có phù hợp với phân bố chính xác hay không. Công thức tính toán cụ thể như sau:

fErf(x) = 1.0 - 1.0/(1.0 + 0.5*abs(x)) * exp(-x*x - 1.26551223 + ...)  # 高斯误差函数

fPSignal(ser, n) = fErf((stdev(ser, n) > 0 ? sma(ser, n)/stdev(ser, n)/sqrt(2) : 1)) # P-Signal指标

Chiến lược này tính toán các chỉ số P-Signal trong các khung thời gian mặt trời, đường tròn và đường mặt trăng, làm nhiều khi chỉ số vượt qua 0 và bằng phẳng khi vượt qua 0 . Đồng thời thiết lập các cửa sổ giá trị chỉ số để kiểm soát mở lại các vị trí .

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược P-Signal là sử dụng nhiều khung thời gian để tăng sự ổn định của chiến lược. Dòng mặt trăng nắm bắt biến động ngắn hạn của thị trường, Dòng tuần trăng lọc phá vỡ giả. Đồng thời, chỉ số P-Signal cũng có một khả năng dự đoán, có thể làm tăng biến động của hành vi theo xu hướng.

So với khung thời gian đơn lẻ, khung thời gian đa dạng có thể sử dụng lỗ hổng hằng ngày khi rút lui, trong khi sử dụng khung thời gian cao hơn trong tình huống xung đột làm giảm tần suất giao dịch. Nhìn chung, sự kết hợp này có thể giảm tối đa rút lui tuyệt đối và tương đối trong khi đảm bảo lợi nhuận.

Phân tích rủi ro

Rủi ro lớn nhất của chiến lược P-Signal là bản thân chỉ số là một hộp đen đối với các nhà giao dịch định lượng. Chúng tôi rất khó xác định được mức độ phù hợp của chỉ số đối với một thị trường cụ thể và không thể xác định được phạm vi tối ưu hóa các tham số của nó. Điều này có thể dẫn đến chiến lược không hoạt động tốt trong thị trường thực.

Ngoài ra, chính chiến lược này cũng có một số hạn chế. Ví dụ: không thể xử lý tình huống mạnh mẽ, chỉ số chênh lệch có thể bị chậm trễ như tín hiệu giao dịch. Những vấn đề này có thể trở thành rủi ro ẩn trong thời gian thực.

Để giải quyết các vấn đề này, chúng ta có thể điều chỉnh các tham số chỉ số, tối ưu hóa phương thức dừng lỗ, giới thiệu nhiều chỉ số phụ trợ hơn, v.v.

Hướng tối ưu hóa

P-Signal có một số chiến lược để tối ưu hóa:

  1. Thay đổi các tham số của chỉ số P-Signal: nIntr_D, nIntr_W và nIntr_M, tìm ra sự kết hợp tham số tối ưu

  2. Tăng phương thức dừng lỗ: theo dõi dừng lỗ, dừng thời gian, dừng ATR, v.v. để tìm cách dừng lỗ tốt nhất

  3. Tham gia các chỉ số hỗ trợ: Chiến lược tăng cường khả năng phán đoán đối với các tình huống cụ thể, ví dụ như đưa ra xu hướng phán đoán MACD

  4. Tối ưu hóa quản lý vị trí: thiết lập vị trí động, tối ưu hóa hiệu quả sử dụng vốn

  5. Máy học tối ưu hóa tham số: sử dụng mạng thần kinh, thuật toán di truyền để tìm tham số tối ưu hóa toàn cầu

Tóm tắt

Chiến lược giao dịch đa khung thời gian của P-Signal nói chung là một ý tưởng chiến lược rất tiềm năng. Nó kết hợp các nguyên tắc thống kê với các chỉ số kỹ thuật, sử dụng phân tích đa khung thời gian để tăng sự ổn định. Nếu chúng ta có thể giải quyết một số hạn chế bằng cách phản hồi và tối ưu hóa rất nhiều, thì hoàn toàn có thể chuyển đổi nó thành một chiến lược giao dịch thuật toán tiền kỹ thuật số có thể sử dụng thực sự.

Mã nguồn chiến lược
/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 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
// A good strategy should be able to handle backtesting.
// @version=4
// **********************************************************************************************************
strategy("P-Signal Strategy:", precision = 3, pyramiding = 3)
//
// Parameters and const of P-Signal.
//
nPoints_D = input(title = "Number of D Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.")
nPoints_W = input(title = "Number of W Bars", type = input.integer, defval = 4, minval = 4, maxval = 100, group = "Parameters of observation.")
nPoints_M = input(title = "Number of M Bars", type = input.integer, defval = 6, minval = 4, maxval = 100, group = "Parameters of observation.")
int nIntr_D = nPoints_D - 1
int nIntr_W = nPoints_W - 1
int nIntr_M = nPoints_M - 1
bool bDValveOpen = true
bool bWValveOpen = true
bool bMValveOpen = true
// 
// 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)
//
// Signals for the strategy.
//
float nPSignal_D = sma(fPSignal(change(ohlc4), nIntr_D), nIntr_D)
float ndPSignal_D = sign(nPSignal_D[0] - nPSignal_D[1])
//
float nPSignal_W = sma(security(syminfo.tickerid, "W",fPSignal(change(ohlc4), nIntr_W)), nIntr_W)
float ndPSignal_W = sign(nPSignal_W[0] - nPSignal_W[1])
//
float nPSignal_M = sma(security(syminfo.tickerid, "M",fPSignal(change(ohlc4), nIntr_M)), nIntr_M)
float ndPSignal_M = sign(nPSignal_M[0] - nPSignal_M[1])
//
// P-Signal 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_D, color = color.blue, style = plot.style_line)
//
// Multi Frame Strategy 
// ... Day
if(nPSignal_D < 0 and ndPSignal_D > 0 and bDValveOpen)
    strategy.entry("long_D", strategy.long, 1) 
    bDValveOpen := false
if(nPSignal_D > 0 and ndPSignal_D < 0)
    strategy.close("long_D")
    bDValveOpen := true
// ... Week
if(nPSignal_W < 0 and ndPSignal_W > 0 and bWValveOpen)
    strategy.entry("long_W", strategy.long, 1) 
    bWValveOpen := false
if(nPSignal_W > 0 and ndPSignal_W < 0)
    strategy.close("long_W")
    bWValveOpen := true
// ... Month
if(nPSignal_M < 0 and ndPSignal_M > 0 and bMValveOpen)
    strategy.entry("long_M", strategy.long, 1) 
    bMValveOpen := false
if(nPSignal_M > 0 and ndPSignal_M < 0)
    strategy.close("long_M")
    bMValveOpen := true
// The end.