
Strategi ini adalah strategi perdagangan kuantitatif P-Signal berdasarkan fungsi kesilapan Gaussian untuk mengira perubahan harga. Ia menggunakan P-Signal untuk menilai trend harga dan titik perubahan untuk menentukan masa masuk dan keluar.
Indikator utama strategi ini adalah P-Signal. Formula pengiraan P-Signal adalah seperti berikut:
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
Di sini ser mewakili urutan harga, int mewakili parameter nPoints, iaitu melihat berapa banyak K-root. Formula ini terdiri daripada tiga bahagian:
Keseluruhan formula ini bermaksud bahawa harga bergerak rata-rata dibahagikan dengan perbezaan piawai harga, kemudian dibahagikan dengan sqrt ((2) untuk piawaian, dan kemudian dipetakan ke dalam interval ((-1, 1) melalui fungsi kesilapan Gaussian. Iaitu, jika harga bergerak lebih besar daripada rata-rata, P-Signal mendekati 1; jika harga bergerak lebih kecil daripada rata-rata, P-Signal mendekati -1.
Strategi menggunakan nilai P-Signal dan simbol perubahannya untuk menentukan masuk dan keluar:
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
Apabila P-Signal lebih kecil daripada 0 dan berubah menjadi positif, anda boleh melakukan perdagangan lebih banyak; apabila P-Signal lebih besar daripada 0 dan berubah menjadi negatif, anda boleh melakukan perdagangan yang sama.
Strategi ini mempunyai kelebihan berikut:
Strategi ini juga mempunyai beberapa risiko, seperti:
Untuk mengurangkan risiko ini, anda boleh mempertimbangkan untuk menambah syarat penapisan, mengurangkan frekuensi perdagangan; mengoptimumkan set parameter dan kos perdagangan; pengisar cakera, memilih varieti yang sesuai.
Strategi ini masih mempunyai ruang untuk pengoptimuman yang lebih lanjut, dengan tujuan utama:
Secara keseluruhannya, konsep teras strategi ini adalah baru, menggunakan fungsi Gaussian untuk menyesuaikan penyebaran harga dan menyesuaikan parameter secara automatik. Tetapi sebagai strategi perdagangan frekuensi tinggi, lebih banyak ujian dan pengoptimuman diperlukan, terutamanya dalam mengawal risiko dan menyesuaikan parameter, untuk memastikan keuntungan yang stabil di pasaran.
/*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.