Stratégie de négociation sur plusieurs délais de P-Signal

Auteur:ChaoZhang est là., Date: 2023-11-28 16:32:36
Les étiquettes:

img

Résumé

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.

La logique de la stratégie

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.

Analyse des avantages

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.

Analyse des risques

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.

Directions d'optimisation

Il existe plusieurs directions pour optimiser la stratégie P-Signal:

  1. Modifier les paramètres de l'indicateur de signal P: nIntr_D, nIntr_W et nIntr_M, trouver les combinaisons optimales de paramètres

  2. Ajouter des méthodes de stop loss: stop loss de trailing, stop loss de temps, ATR stop loss, etc., trouver le stop loss optimal

  3. Introduire des indicateurs auxiliaires: améliorer le jugement des conditions spécifiques du marché, par exemple utiliser le MACD pour déterminer les tendances

  4. Optimiser la dimensionnement des positions: définir la dimensionnement dynamique des positions en fonction de l'efficacité de l'utilisation du compte

  5. Optimisation de l'apprentissage automatique: utiliser des réseaux de neurones, des algorithmes génétiques pour trouver des paramètres globalement optimaux

Conclusion

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.

Plus de