Die P-Signal Multi-Timeframe-Handelsstrategie ist eine kryptogeld-algorithmische Handelsstrategie, die auf statistischen Prinzipien und Multi-Timeframe-Analyse basiert.
Der Kernindikator der P-Signal-Strategie ist das P-Signal selbst, das statistische Standardabweichung und einfachen gleitenden Durchschnitt kombiniert und mit der Gauss-Fehlerfunktion auf den Bereich -1 bis 1 abbildet, um festzustellen, ob der Markt der Normalverteilung entspricht.
fErf(x) = 1.0 - 1.0/(1.0 + 0.5*abs(x)) * exp(-x*x - 1.26551223 + ...) # Gaussian error function
fPSignal(ser, n) = fErf((stdev(ser, n) > 0 ? sma(ser, n)/stdev(ser, n)/sqrt(2) : 1)) # P-Signal indicator
Die Strategie berechnet den P-Signal-Indikator auf den täglichen, wöchentlichen und monatlichen Zeitrahmen für Bitcoin, geht lang, wenn der Indikator über 0 geht, und geht aus, wenn er wieder unter 0 geht.
Der größte Vorteil der P-Signal-Strategie ist die Verwendung mehrerer Zeitrahmen zur Verbesserung der Strategie-Stabilität. Das tägliche Chart erfasst kurzfristige Marktschwankungen, während die wöchentlichen und monatlichen Charts falsche Ausbrüche filtern. Gleichzeitig hat der P-Signal-Indikator selbst auch eine gewisse vorausschauende Fähigkeit, die Schwankungen von Trendbewegungen zu verstärken.
Im Vergleich zu einem einzigen Zeitrahmen ermöglichen mehrere Zeitrahmen die Verwendung von täglichen Stopps, um den Drawdown in volatilen Zeiten zu kontrollieren und gleichzeitig die Transaktionsfrequenz mit den höheren Zeitrahmen während der unterschiedlichen Märkte zu reduzieren.
Das größte Risiko der P-Signal-Strategie besteht darin, dass der Indikator selbst für Quant-Händler eine schwarze Box ist. Wir haben keine Möglichkeit, die Anpassungsfähigkeit dieses Indikators an bestimmte Märkte zu bestimmen, noch können wir den optimalen Bereich seiner Parameter bestimmen. Dies kann zu einer schlechten Performance der Strategie im Live-Handel führen.
Darüber hinaus hat die Strategie selbst einige Einschränkungen. Zum Beispiel die Unfähigkeit, gewalttätige Bewegungen zu bewältigen, ein verzögertes Signal aus dem Indikator-Crossover usw. All dies kann zu versteckten Problemen beim Live-Handel werden.
Um diese Probleme zu lösen, können wir die Indikatorparameter anpassen, den Stop-Loss optimieren, mehr Hilfsindikatoren einführen usw. Die Prämisse besteht jedoch darin, die Stabilität über ausreichend große Backtesting-Perioden hinweg zu testen.
Es gibt mehrere Richtungen zur Optimierung der P-Signal-Strategie:
Änderung der P-Signal-Indikatorparameter: nIntr_D, nIntr_W und nIntr_M, Suche nach optimalen Parameterkombinationen
Hinzufügen von Stop-Loss-Methoden: Trailing Stop-Loss, Time Stop-Loss, ATR Stop-Loss usw., finden Sie den optimalen Stop-Loss
Einführung von Hilfsindikatoren: Verbesserung der Bewertung spezifischer Marktbedingungen, z. B. Verwendung des MACD zur Bestimmung von Trends
Optimierung der Positionsgröße: Setzen Sie dynamische Positionsgröße basierend auf der Kontonutzungseffizienz
Optimierung des maschinellen Lernens: Nutzung neuronaler Netzwerke, genetischer Algorithmen zur Suche nach global optimalen Parametern
Die P-Signal Multi-Timeframe-Handelsstrategie ist insgesamt eine sehr vielversprechende Strategieidee. Sie kombiniert statistische Prinzipien und technische Indikatoren und verwendet eine Multi-Timeframe-Analyse, um die Stabilität zu verbessern. Wenn wir einige Einschränkungen durch umfangreiches Backtesting und Optimierung lösen können, ist es durchaus möglich, sie in eine echte, nutzbare kryptogeld-algorithmische Handelsstrategie zu verwandeln.
/*backtest start: 2022-11-21 00:00:00 end: 2023-11-27 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 // A good strategy should be able to handle backtesting. // @version=4 // ********************************************************************************************************** strategy("P-Signal Strategy:", precision = 3, pyramiding = 3) // // Parameters and const of P-Signal. // nPoints_D = input(title = "Number of D Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.") nPoints_W = input(title = "Number of W Bars", type = input.integer, defval = 4, minval = 4, maxval = 100, group = "Parameters of observation.") nPoints_M = input(title = "Number of M Bars", type = input.integer, defval = 6, minval = 4, maxval = 100, group = "Parameters of observation.") int nIntr_D = nPoints_D - 1 int nIntr_W = nPoints_W - 1 int nIntr_M = nPoints_M - 1 bool bDValveOpen = true bool bWValveOpen = true bool bMValveOpen = true // // 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) // // Signals for the strategy. // float nPSignal_D = sma(fPSignal(change(ohlc4), nIntr_D), nIntr_D) float ndPSignal_D = sign(nPSignal_D[0] - nPSignal_D[1]) // float nPSignal_W = sma(security(syminfo.tickerid, "W",fPSignal(change(ohlc4), nIntr_W)), nIntr_W) float ndPSignal_W = sign(nPSignal_W[0] - nPSignal_W[1]) // float nPSignal_M = sma(security(syminfo.tickerid, "M",fPSignal(change(ohlc4), nIntr_M)), nIntr_M) float ndPSignal_M = sign(nPSignal_M[0] - nPSignal_M[1]) // // P-Signal 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_D, color = color.blue, style = plot.style_line) // // Multi Frame Strategy // ... Day if(nPSignal_D < 0 and ndPSignal_D > 0 and bDValveOpen) strategy.entry("long_D", strategy.long, 1) bDValveOpen := false if(nPSignal_D > 0 and ndPSignal_D < 0) strategy.close("long_D") bDValveOpen := true // ... Week if(nPSignal_W < 0 and ndPSignal_W > 0 and bWValveOpen) strategy.entry("long_W", strategy.long, 1) bWValveOpen := false if(nPSignal_W > 0 and ndPSignal_W < 0) strategy.close("long_W") bWValveOpen := true // ... Month if(nPSignal_M < 0 and ndPSignal_M > 0 and bMValveOpen) strategy.entry("long_M", strategy.long, 1) bMValveOpen := false if(nPSignal_M > 0 and ndPSignal_M < 0) strategy.close("long_M") bMValveOpen := true // The end.