La stratégie de trading P-Signal multi-timeframe est une stratégie de trading algorithmique basée sur les principes statistiques et l'analyse multi-timeframe.
L'indicateur de base de la stratégie P-Signal est le P-Signal lui-même, qui combine l'écart-type statistique et la moyenne mobile simple et le cartographie dans la plage -1 à 1 en utilisant la fonction d'erreur de Gauss, pour détecter si le marché est conforme à la distribution normale.
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
La stratégie calcule l'indicateur P-Signal sur les échéanciers quotidien, hebdomadaire et mensuel pour Bitcoin, va long lorsque l'indicateur dépasse 0, et sort quand il dépasse de nouveau en dessous de 0, les vannes de valeur de l'indicateur sont également configurées pour contrôler les entrées répétées.
Le plus grand avantage de la stratégie P-Signal est l'utilisation de plusieurs délais pour améliorer la stabilité de la stratégie. Le graphique quotidien capture les fluctuations à court terme du marché, tandis que les graphiques hebdomadaires et mensuels filtrent les fausses ruptures.
Comparé à un seul délai, plusieurs délais permettent l'utilisation d'arrêts quotidiens pour contrôler le retrait pendant les périodes volatiles, tout en réduisant la fréquence des transactions en utilisant les délais plus élevés pendant les marchés variables.
Le plus grand risque de la stratégie P-Signal est que l'indicateur lui-même est une boîte noire pour les traders quant. Nous n'avons aucun moyen de déterminer l'adaptabilité de cet indicateur à des marchés spécifiques, ni ne pouvons déterminer la plage optimale de ses paramètres. Cela peut entraîner une mauvaise performance de la stratégie dans le trading en direct.
En outre, la stratégie elle-même présente certaines limitations. Par exemple, l'incapacité de gérer les mouvements violents, le retard du signal de l'intersection des indicateurs, etc. Tout cela peut devenir des problèmes cachés pendant le trading en direct.
Pour résoudre ces problèmes, nous pouvons ajuster les paramètres de l'indicateur, optimiser le stop loss, introduire plus d'indicateurs auxiliaires, etc. Mais la prémisse est de tester la stabilité sur des périodes de backtesting suffisamment grandes.
Il existe plusieurs directions pour optimiser la stratégie P-Signal:
Modifier les paramètres de l'indicateur de signal P: nIntr_D, nIntr_W et nIntr_M, trouver les combinaisons optimales de paramètres
Ajouter des méthodes de stop loss: stop loss de trailing, stop loss de temps, ATR stop loss, etc., trouver le stop loss optimal
Introduire des indicateurs auxiliaires: améliorer le jugement des conditions spécifiques du marché, par exemple utiliser le MACD pour déterminer les tendances
Optimiser la dimensionnement des positions: définir la dimensionnement dynamique des positions en fonction de l'efficacité de l'utilisation du compte
Optimisation de l'apprentissage automatique: utiliser des réseaux de neurones, des algorithmes génétiques pour trouver des paramètres globalement optimaux
La stratégie de trading multi-temps de P-Signal est globalement une idée de stratégie très prometteuse. Elle combine des principes statistiques et des indicateurs techniques, et utilise l'analyse multi-temps pour améliorer la stabilité.
/*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.