
Die Strategie ist eine quantitative Trading-Strategie, die P-Signal-Indikatoren für die Berechnung von Preisänderungen basierend auf der Gauss-Fehlerfunktion verwendet. Sie verwendet P-Signal-Indikatoren, um Preistrends und Wendepunkte zu ermitteln und so die Ein- und Ausstiegszeiten zu bestimmen.
Das Kernindikator der Strategie ist das P-Signal. Die Berechnungsformel für das P-Signal lautet wie folgt:
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
Die Formel besteht aus drei Teilen:
Die gesamte Formel bedeutet, dass der Moving Average der Preise durch die Standarddifferenz der Preise geteilt wird, dann durch sqrt ((2) standardisiert und dann durch die Gauss-Fehlerfunktion auf den Bereich ((-1, 1) abgebildet wird. Das heißt, wenn die Preisschwankungen größer als der Durchschnitt sind, ist das P-Signal nahe bei 1; wenn die Preisschwankungen kleiner als der Durchschnitt sind, ist das P-Signal nahe bei −1.
Die Strategie nutzt die P-Signal-Werte und ihre wechselnden Symbole, um Ein- und Ausstieg zu bestimmen:
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
Wenn das P-Signal kleiner als 0 ist und sich positiv verändert, dann ist das Plus; wenn das P-Signal größer als 0 ist und sich negativ verändert, dann ist das Negativ.
Diese Strategie hat folgende Vorteile:
Die Strategie birgt auch einige Risiken, die sich in folgenden Punkten widerspiegeln:
Um diese Risiken zu verringern, kann man überlegen, die Filterbedingungen zu erhöhen und die Handelsfrequenz zu reduzieren; Optimierung der Parameterpalette und der Handelskosten-Einstellung; Festplatten-Gehärte, die Wahl der richtigen Sorten.
Die Strategie bietet Raum für weitere Optimierungen, insbesondere in folgenden Bereichen:
Insgesamt ist die Kernidee der Strategie neu, indem die Gauss-Funktion zur Anpassung der Preisverteilung verwendet wird, um die Parameterklasse automatisch anzupassen. Als Hochfrequenz-Handelsstrategie erfordert es jedoch weitere Tests und Optimierungen, insbesondere in Bezug auf Risikokontrolle und Parameteranpassung, um die Gewinne im realen Markt zu stabilisieren.
/*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.