Strategi perdagangan pelbagai jangka masa P-Signal adalah strategi perdagangan algoritma mata wang kripto berdasarkan prinsip statistik dan analisis pelbagai jangka masa. Strategi ini menggunakan fungsi ralat Gaussian dan penunjuk P-Signal untuk memodelkan carta harian, mingguan dan bulanan Bitcoin, dan pergi lama pada salib penunjuk di atas 0 dan keluar pada salib di bawah 0, untuk memantau turun naik perdagangan.
Indikator teras strategi P-Signal adalah P-Signal itu sendiri, yang menggabungkan penyimpangan piawai statistik dan purata bergerak mudah dan memetakannya ke julat -1 hingga 1 menggunakan fungsi ralat Gaussian, untuk mengesan sama ada pasaran mematuhi pengedaran normal. Formula pengiraan khusus adalah seperti berikut:
fErf(x) = 1.0 - 1.0/(1.0 + 0.5*abs(x)) * exp(-x*x - 1.26551223 + ...) # Gaussian error function
fPSignal(ser, n) = fErf((stdev(ser, n) > 0 ? sma(ser, n)/stdev(ser, n)/sqrt(2) : 1)) # P-Signal indicator
Strategi ini mengira penunjuk P-Signal pada jangka masa harian, mingguan dan bulanan untuk Bitcoin, pergi lama apabila penunjuk melintasi di atas 0, dan keluar apabila melintasi kembali di bawah 0. Injap nilai penunjuk juga ditetapkan untuk mengawal kemasukan berulang.
Kelebihan terbesar strategi P-Signal adalah penggunaan pelbagai jangka masa untuk meningkatkan kestabilan strategi. carta harian menangkap turun naik pasaran jangka pendek, sementara carta mingguan dan bulanan menapis pecah palsu. Pada masa yang sama, penunjuk P-Signal itu sendiri juga mempunyai beberapa keupayaan ramalan untuk memperkuat turun naik pergerakan trend.
Berbanding dengan satu jangka masa, pelbagai jangka masa membolehkan penggunaan hentian harian untuk mengawal penarikan semasa masa yang tidak menentu, sambil mengurangkan kekerapan transaksi menggunakan jangka masa yang lebih tinggi semasa pasaran berkisar. Secara keseluruhan, kombinasi ini membolehkan memaksimumkan keuntungan sambil meminimumkan penarikan mutlak dan relatif.
Risiko terbesar strategi P-Signal adalah bahawa penunjuk itu sendiri adalah kotak hitam untuk peniaga kuant. Kami tidak mempunyai cara untuk menentukan kesesuaian penunjuk ini dengan pasaran tertentu, dan juga tidak dapat menentukan julat parameternya yang optimum. Ini boleh menyebabkan prestasi strategi yang buruk dalam perdagangan langsung.
Di samping itu, strategi itu sendiri mempunyai beberapa batasan. Sebagai contoh, ketidakupayaan untuk mengendalikan pergerakan ganas, isyarat yang tertinggal dari penyambungan penunjuk dan lain-lain. Semua ini boleh menjadi masalah tersembunyi semasa perdagangan langsung.
Untuk menyelesaikan masalah ini, kita boleh menyesuaikan parameter penunjuk, mengoptimumkan stop loss, memperkenalkan lebih banyak penunjuk tambahan dan lain-lain. Tetapi premisnya adalah untuk menguji kestabilan merentasi tempoh backtesting yang cukup besar.
Terdapat beberapa arah untuk mengoptimumkan strategi P-Signal:
Ubah parameter penunjuk P-Signal: nIntr_D, nIntr_W dan nIntr_M, mencari kombinasi parameter optimum
Tambah kaedah stop loss: trailing stop loss, time stop loss, ATR stop loss dan lain-lain, mencari stop loss optimum
Memperkenalkan penunjuk tambahan: meningkatkan penilaian keadaan pasaran tertentu, contohnya menggunakan MACD untuk menentukan trend
Mengoptimumkan saiz kedudukan: menetapkan saiz kedudukan dinamik berdasarkan kecekapan penggunaan akaun
Pengoptimuman pembelajaran mesin: gunakan rangkaian saraf, algoritma genetik untuk mencari parameter yang optimum secara global
Strategi perdagangan pelbagai jangka masa P-Signal secara keseluruhan adalah idea strategi yang sangat menjanjikan. Ia menggabungkan prinsip statistik dan penunjuk teknikal, dan menggunakan analisis pelbagai jangka masa untuk meningkatkan kestabilan.
/*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.