
Strategi ini adalah strategi perdagangan kuantitatif berdasarkan fungsi Gaussian error untuk menghitung perubahan harga dari indikator P-Signal. Ini menggunakan indikator P-Signal untuk menilai tren harga dan titik balik, untuk menentukan kapan masuk dan keluar.
Indikator inti dari strategi ini adalah P-Signal. Rumus perhitungan untuk P-Signal adalah sebagai 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, yaitu melihat berapa banyak akar K. Rumus ini terdiri dari tiga bagian:
Seluruh rumus ini berarti bahwa harga dibagi rata-rata bergerak dengan harga standar deviasi, kemudian dibagi dengan sqrt ((2) untuk standar, dan kemudian dipetakan ke dalam interval ((-1, 1) melalui fungsi kesalahan Gaussian. Artinya, jika harga berfluktuasi lebih besar dari rata-rata, P-Signal mendekati 1; jika harga berfluktuasi lebih kecil dari 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)
Jika P-Signal lebih kecil dari 0 dan berubah menjadi positif, maka Anda harus melakukan perdagangan lebih banyak. Jika P-Signal lebih besar dari 0 dan berubah menjadi negatif, maka Anda harus melakukan perdagangan lebih sedikit.
Strategi ini memiliki keuntungan sebagai berikut:
Strategi ini juga memiliki beberapa risiko, terutama di:
Untuk mengurangi risiko ini, pertimbangkan untuk meningkatkan kondisi penyaringan, mengurangi frekuensi transaksi; mengoptimalkan kombinasi parameter dan pengaturan biaya transaksi; penggilingan cakram, memilih varietas yang sesuai.
Strategi ini memiliki ruang untuk optimalisasi lebih lanjut, terutama dalam hal:
Secara keseluruhan, strategi ini adalah konsep baru, menggunakan fungsi Gaussian untuk menyesuaikan distribusi harga dan menyesuaikan parameter secara otomatis. Namun, sebagai strategi perdagangan frekuensi tinggi, lebih banyak pengujian dan pengoptimalan diperlukan, terutama dalam hal pengendalian risiko dan penyesuaian parameter, untuk memastikan profitabilitas yang stabil di pasar.
/*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.