Diese Strategie ist eine quantitative Handelsstrategie, die auf dem P-Signal-Indikator basiert, der durch die Gauss-Fehlerfunktion berechnet wird, um Preisveränderungen zu messen.
Der Kernindikator dieser Strategie ist P-Signal.
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
Hier stellt ser die Preisreihe dar, int stellt den Parameter nPoints dar, der die Anzahl der zurückblickenden Balken darstellt.
Die Bedeutung der gesamten Formel besteht darin, den gleitenden Durchschnitt des Preises durch die Standardabweichung des Preises zu dividieren, dann durch sqrt(2) für die Standardisierung zu dividieren und schließlich durch die Gauss-Fehlerfunktion auf (-1, 1) -Bereich abzubilden. Das heißt, wenn die Preisschwankung größer als der Durchschnitt ist, ist das P-Signal nahe 1; wenn die Preisschwankung kleiner als der Durchschnitt ist, ist das P-Signal nahe -1.
Die Strategie verwendet den Wert des P-Signals und das Zeichen seiner Änderung, um Ein- und Ausgänge zu bestimmen:
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
Es geht lang, wenn das P-Signal kleiner als 0 ist und sich auf positiv ändert. Es schließt die Position, wenn das P-Signal größer als 0 ist und sich auf negativ ändert.
Zu den Vorteilen dieser Strategie gehören:
Diese Strategie birgt auch einige Risiken:
Zur Verringerung dieser Risiken können einige Maßnahmen in Betracht gezogen werden: Hinzufügen von Filtern zur Verringerung der Handelsfrequenz; Optimierung der Parameterkombination und Festlegung der Transaktionskosten; Live-Tests und Auswahl geeigneter Produkte.
Es gibt Raum für weitere Verbesserungen:
Zusammenfassend ist die Kernidee dieser Strategie eine innovative, passende Preisverteilung mit Gauss-Funktion und automatische Anpassung von Parametern. Aber als Hochfrequenz-Handelsstrategie erfordert sie weitere Tests und Optimierungen bei der Risikokontrolle und Parameter-Ausrichtung, bevor sie im Live-Handel stabil profitabel ist, insbesondere als Hochfrequenz-Handelsstrategie.
/*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.