
Cette stratégie est une stratégie de trading quantitative basée sur la fonction d’erreur de Gauss pour calculer les variations de prix de l’indicateur P-Signal. Elle utilise l’indicateur P-Signal pour déterminer la tendance des prix et les points de basculement, afin de déterminer les moments d’entrée et de sortie.
L’indicateur central de la stratégie est le P-Signal. La formule de calcul du P-Signal est la suivante:
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
Ici, ser représente la séquence de prix, int représente le paramètre nPoints, c’est-à-dire combien de lignes K. La formule est composée de trois parties:
L’ensemble de la formule signifie que la moyenne mobile du prix divisée par la différence standard du prix, puis divisée par sqrt ((2) est normalisée, puis cartographiée par la fonction d’erreur de Gauss dans la plage ((-1, 1) ≠; c’est-à-dire que si la fluctuation des prix est supérieure à la moyenne, le signal P est proche de 1; si la fluctuation des prix est inférieure à la moyenne, le signal P est proche de −1 ≠.
Les stratégies utilisent les valeurs de P-Signal et les symboles qui les modifient pour décider de l’entrée et de la sortie:
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
Faire plus quand le P-Signal est inférieur à 0 et positif; faire plus quand le P-Signal est supérieur à 0 et négatif.
Cette stratégie présente les avantages suivants:
Cette stratégie comporte aussi des risques, principalement:
Pour réduire ces risques, on peut envisager d’augmenter les conditions de filtrage, de réduire la fréquence des transactions; d’optimiser la configuration des ensembles de paramètres et des coûts de transaction; d’affiner le disque réel et de choisir la variété appropriée.
Il y a encore de la place pour optimiser la stratégie, principalement dans les domaines suivants:
Dans l’ensemble, la stratégie est novatrice, utilisant la fonction Gauss pour adapter la distribution des prix et ajuster automatiquement la gamme de paramètres. Cependant, en tant que stratégie de trading à haute fréquence, elle nécessite des tests et des optimisations supplémentaires, en particulier en matière de contrôle des risques et d’ajustement des paramètres, pour assurer la stabilité des bénéfices sur le marché réel.
/*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.