Jupiter et Saturne Momentum MA Stratégie filtrée croisée

Auteur:ChaoZhang est là., Date: 2023-11-03 16:13:20 Le projet de loi est en cours d'adoption.
Les étiquettes:

img

Résumé

Cette stratégie utilise les croisements de moyennes mobiles comme signaux de négociation, combinés à l'indicateur de volatilité BB et à un indicateur de dynamique personnalisé pour la filtration, dans le but d'améliorer la fiabilité des signaux de croisement de MA et de réduire les faux signaux.

Principaux

  1. Utilisez une EMA à 50 périodes et une SMA à 200 périodes pour former des signaux de croix dorée et de croix de mort.

  2. Lorsque le prix est en hausse, il est nécessaire que le prix soit supérieur à la ligne de 200 jours et que la valeur de l'indicateur de dynamique personnalisé soit inférieure à 25 pour générer des signaux d'achat.

  3. Lorsque le prix est en baisse, il est nécessaire que le prix soit inférieur à la ligne de 200 jours et que la valeur de l'indicateur de dynamique personnalisé soit supérieure à 75 pour générer des signaux de vente.

  4. L'indicateur de dynamique personnalisé cartographie la ligne médiane et la distance de bande BB dans une plage de 0 à 100 en fonction des maxima et des minima historiques.

  5. L'indicateur de dynamique reflète la volatilité relative des prix, le filtrage des seuils aide à réduire les faux croisements.

Les avantages

  1. Utiliser les points forts de l'EMA et de l'SMA pour détecter les tendances à moyen et long terme.

  2. L'augmentation de la filtration avec indicateur de momentum améliore la fiabilité et réduit les faux signaux.

  3. La distance de bande BB reflète l'intensité de volatilité, la normalisation historique évite la dépendance des paramètres.

  4. Les périodes EMA, SMA et seuil de dynamique sont personnalisables et peuvent être adaptées à différents environnements de marché.

  5. Une logique simple avec une flexibilité d'optimisation, une grande praticité.

Analyse des risques

  1. L'EMA et la SMA ont un effet de retard, peuvent manquer des opportunités à court terme.

  2. Une tendance de nature inappropriée pour les marchés à fourchette.

  3. Le seuil de dynamique nécessite un backtesting itératif pour un paramètre optimal, il y a des risques de surajustement.

  4. Les systèmes à plus long terme offrent des rendements absolus stables mais potentiellement limités.

  5. Peut raccourcir les périodes d'AM ou ajouter des indicateurs complémentaires pour améliorer l'adaptabilité.

Des possibilités d'amélioration

  1. Testez différentes combinaisons d'AM pour obtenir les paramètres optimaux.

  2. Ajouter des indicateurs complémentaires tels que MACD, KD pour une validation supplémentaire.

  3. Optimisez les paramètres de l'indicateur de momentum comme la période de rétrospective, la plage de cartographie.

  4. Incorporer le stop loss pour contrôler les risques.

  5. Ajustez les paramètres spécifiques au symbole à l'aide de l'extraction des fonctionnalités d'apprentissage automatique.

  6. Ajouter des indicateurs de volume pour éviter les signaux de croisement déraisonnables.

Conclusion

Cette stratégie combine les atouts du suivi des tendances à long terme et du filtrage du seuil de double dynamique pour une fiabilité et une valeur pratiques élevées. Des améliorations supplémentaires sont possibles grâce à l'optimisation des paramètres et aux techniques complémentaires. Le concept innovant fournit des informations précieuses pour d'autres systèmes de tendance.


/*backtest
start: 2023-10-26 00:00:00
end: 2023-10-27 13:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="EMA Difference Mapping with Trades", shorttitle="EMA Diff Map", overlay=false)

// Inputs
emaLength = input(20, "EMA Length")
stdDevLength = input(2, "Standard Deviation Length")
priceSource = close
takeProfitPoints = input(1000, title="Take Profit (in Points)")
stopLossPoints = input(2500, title="Stop Loss (in Points)")

// Calculate EMA
ema = ema(priceSource, emaLength)

// Calculate Standard Deviation
stdDev = stdev(priceSource, stdDevLength)

// Calculate differences
diff1 = (ema + stdDev) - ema
diff2 = ema - (ema - stdDev)

// Calculate min and max differences from last year
lookbackPeriod = 504 // Number of trading days in a year
minDiff1 = lowest(diff1, lookbackPeriod)
maxDiff1 = highest(diff1, lookbackPeriod)
minDiff2 = lowest(diff2, lookbackPeriod)
maxDiff2 = highest(diff2, lookbackPeriod)

// Map differences based on requirements
mappedDiff1 = 50 + 50 * ((diff1 - minDiff1) / (maxDiff1 - minDiff1))
mappedDiff2 = 50 - 50 * ((diff2 - minDiff2) / (maxDiff2 - minDiff2))

// Combine mapped differences into a single line
mappedLine = if close > ema
    mappedDiff1
else
    mappedDiff2

// Plot 'mappedLine' in the main chart area conditionally
plot(mappedLine, title="EMA Difference Mapping", color=(close > ema ? color.blue : na), style=plot.style_line, linewidth=2)

// Calculate the 50EMA and 200SMA
ema50 = ema(close, 50)
sma200 = sma(close, 200)

// Plot the 50EMA and 200SMA on the main chart
plot(ema50, color=color.blue, title="50 SMA", linewidth=2)
plot(sma200, color=color.red, title="200 SMA", linewidth=2)

// Initialize trade variables
var bool waitingForBuy = na
var bool waitingForSell = na
var bool buyConditionMet = false
var bool sellConditionMet = false

if not sellConditionMet and crossunder(ema50, sma200)
    sellConditionMet := true
    waitingForBuy := false

if sellConditionMet 
    waitingForSell := true
    sellConditionMet := false

if waitingForSell and close < sma200 and mappedLine > 75
    strategy.entry("Sell", strategy.short)
    strategy.exit("Sell Exit", "Sell", profit=takeProfitPoints, loss=stopLossPoints)
    waitingForSell := false

// Define the strategy conditions and execute trades
if not buyConditionMet  and crossover(ema50, sma200)
    buyConditionMet := true
    waitingForSell := false

if buyConditionMet 
    waitingForBuy := true
    buyConditionMet := false

if waitingForBuy and close > sma200 and mappedLine < 25
    strategy.entry("Buy", strategy.long)
    strategy.exit("Buy Exit", "Buy", profit=takeProfitPoints, loss=stopLossPoints)
    waitingForBuy := false


Plus de