Strategi ini adalah strategi perdagangan kuantitatif berdasarkan penunjuk P-Signal yang dikira oleh fungsi ralat Gaussian untuk mengukur perubahan harga.
Indikator teras strategi ini adalah P-Signal. Rumus pengiraan P-Signal adalah:
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
Di sini ser mewakili siri harga, int mewakili parameter nPoints, yang merupakan bilangan bar untuk melihat kembali.
Maksud keseluruhan formula adalah untuk mengambil purata bergerak harga dibahagikan dengan penyimpangan standard harga, kemudian dibahagikan dengan sqrt(2) untuk standardisasi, dan akhirnya dipetakan ke (-1, 1) julat oleh fungsi ralat Gaussian.
Strategi menggunakan nilai Isyarat P dan tanda perubahannya untuk menentukan kemasukan dan keluar:
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
Ia pergi panjang apabila P-Signal kurang daripada 0 dan berubah menjadi positif. Ia menutup kedudukan apabila P-Signal lebih besar daripada 0 dan berubah menjadi negatif.
Kelebihan strategi ini termasuk:
Terdapat juga beberapa risiko dengan strategi ini:
Untuk mengurangkan risiko tersebut, beberapa langkah boleh dipertimbangkan: menambah penapis untuk mengurangkan kekerapan perdagangan; mengoptimumkan kombinasi parameter dan penetapan kos transaksi; ujian langsung dan memilih produk yang sesuai.
Terdapat ruang untuk penambahbaikan lanjut:
Kesimpulannya, idea teras strategi ini adalah inovasi, pembahagian harga yang sesuai dengan fungsi Gaussian dan menyesuaikan parameter secara automatik. Tetapi sebagai strategi perdagangan frekuensi tinggi, ia memerlukan ujian dan pengoptimuman lanjut mengenai kawalan risiko dan penyesuaian parameter sebelum keuntungan yang stabil dalam perdagangan langsung, terutama sebagai strategi perdagangan frekuensi tinggi.
/*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.