P-Signal-Handelsstrategie für mehrere Zeitrahmen

Schriftsteller:ChaoZhang, Datum: 2023-11-28 16:32:36
Tags:

img

Übersicht

Die P-Signal Multi-Timeframe-Handelsstrategie ist eine kryptogeld-algorithmische Handelsstrategie, die auf statistischen Prinzipien und Multi-Timeframe-Analyse basiert.

Strategie Logik

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.

Analyse der Vorteile

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.

Risikoanalyse

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.

Optimierungsrichtlinien

Es gibt mehrere Richtungen zur Optimierung der P-Signal-Strategie:

  1. Änderung der P-Signal-Indikatorparameter: nIntr_D, nIntr_W und nIntr_M, Suche nach optimalen Parameterkombinationen

  2. Hinzufügen von Stop-Loss-Methoden: Trailing Stop-Loss, Time Stop-Loss, ATR Stop-Loss usw., finden Sie den optimalen Stop-Loss

  3. Einführung von Hilfsindikatoren: Verbesserung der Bewertung spezifischer Marktbedingungen, z. B. Verwendung des MACD zur Bestimmung von Trends

  4. Optimierung der Positionsgröße: Setzen Sie dynamische Positionsgröße basierend auf der Kontonutzungseffizienz

  5. Optimierung des maschinellen Lernens: Nutzung neuronaler Netzwerke, genetischer Algorithmen zur Suche nach global optimalen Parametern

Schlussfolgerung

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.

Mehr