Strategi perdagangan multi timeframe P-Signal adalah strategi perdagangan algoritma cryptocurrency berdasarkan prinsip statistik dan analisis multi timeframe. Strategi ini menggunakan fungsi kesalahan Gaussian dan indikator P-Signal untuk memodelkan grafik harian, mingguan dan bulanan Bitcoin, dan pergi panjang pada penyeberangan indikator di atas 0 dan keluar pada penyeberangan di bawah 0, untuk memperdagangkan volatilitas.
Indikator inti dari strategi P-Signal adalah P-Signal itu sendiri, yang menggabungkan penyimpangan standar statistik dan rata-rata bergerak sederhana dan memetakan ke kisaran -1 hingga 1 menggunakan fungsi kesalahan Gaussian, untuk mendeteksi apakah pasar sesuai dengan distribusi normal.
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 menghitung indikator P-Signal pada kerangka waktu harian, mingguan dan bulanan untuk Bitcoin, pergi panjang ketika indikator melintasi di atas 0, dan keluar ketika melintasi kembali di bawah 0. Katup nilai indikator juga diatur untuk mengontrol entri berulang.
Keuntungan terbesar dari strategi P-Signal adalah penggunaan beberapa kerangka waktu untuk meningkatkan stabilitas strategi. grafik harian menangkap fluktuasi pasar jangka pendek, sementara grafik mingguan dan bulanan menyaring breakout palsu.
Dibandingkan dengan satu timeframe, beberapa timeframe memungkinkan penggunaan stop harian untuk mengontrol penarikan selama periode volatilitas, sementara mengurangi frekuensi transaksi menggunakan timeframe yang lebih tinggi selama pasar berkisar. Secara keseluruhan, kombinasi ini memungkinkan memaksimalkan keuntungan sambil meminimalkan penarikan absolut dan relatif.
Risiko terbesar dari strategi P-Signal adalah bahwa indikator itu sendiri adalah kotak hitam bagi pedagang kuant. Kami tidak memiliki cara untuk menentukan kemampuan adaptasi indikator ini untuk pasar tertentu, juga tidak dapat menentukan rentang optimal parameternya. Ini dapat menyebabkan kinerja strategi yang buruk dalam perdagangan langsung.
Selain itu, strategi itu sendiri memiliki beberapa keterbatasan. Misalnya, ketidakmampuan untuk menangani gerakan kekerasan, sinyal tertinggal dari crossover indikator dll. Semua ini dapat menjadi masalah tersembunyi selama perdagangan langsung.
Untuk memecahkan masalah ini, kita dapat menyesuaikan parameter indikator, mengoptimalkan stop loss, memperkenalkan lebih banyak indikator tambahan dll. Tetapi premisnya adalah untuk menguji stabilitas di periode backtesting yang cukup besar.
Ada beberapa arah untuk mengoptimalkan strategi P-Signal:
Mengubah parameter indikator P-Signal: nIntr_D, nIntr_W dan nIntr_M, menemukan kombinasi parameter optimal
Tambahkan metode stop loss: trailing stop loss, time stop loss, ATR stop loss dll, temukan stop loss optimal
Memperkenalkan indikator tambahan: meningkatkan penilaian kondisi pasar tertentu, misalnya menggunakan MACD untuk menentukan tren
Mengoptimalkan ukuran posisi: mengatur ukuran posisi dinamis berdasarkan efisiensi penggunaan akun
Optimasi pembelajaran mesin: gunakan jaringan saraf, algoritma genetik untuk menemukan parameter yang optimal secara global
Strategi perdagangan multi timeframe P-Signal secara keseluruhan adalah ide strategi yang sangat menjanjikan. Ini menggabungkan prinsip-prinsip statistik dan indikator teknis, dan menggunakan analisis multi timeframe untuk meningkatkan stabilitas. Jika kita dapat memecahkan beberapa keterbatasan melalui backtesting dan optimasi yang ekstensif, sangat mungkin untuk mengubahnya menjadi strategi perdagangan algoritmik cryptocurrency yang nyata dan dapat digunakan.
/*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.