Stratégie de rupture de la moyenne mobile doublée

Auteur:ChaoZhang est là., Date: 2023-11-27 16:21:45 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie génère des signaux d'entrée LONG ou SHORT lorsque la moyenne mobile simple rapide de 30 jours et la moyenne mobile simple lente de 33 jours du prix de l'action se croisent.

Principe de stratégie

Le noyau de cette stratégie est de calculer le MA rapide de 30 jours et le MA lent de 33 jours. La ligne rapide peut répondre aux changements de prix plus rapidement tandis que la ligne lente a un meilleur effet de filtrage. Lorsque la ligne rapide traverse la ligne lente vers le haut, un signal d'achat est généré. Cela indique que le prix commence à augmenter et que la ligne rapide a répondu tandis que la ligne lente est toujours en retard. Lorsque la ligne rapide traverse la ligne lente vers le bas, un signal de vente est généré. Cela indique que le prix commence à diminuer tandis que la ligne rapide a répondu mais que la ligne lente est toujours en retard.

Grâce à une conception de croisement MA rapide et lente, il peut générer des signaux de trading lorsqu'une nouvelle tendance commence et quitter à des signaux opposés, capturant efficacement les tendances des prix à moyen et long terme.

Analyse des avantages

La stratégie présente les avantages suivants:

  1. En utilisant une moyenne mobile simple, il est facile à comprendre et à mettre en œuvre
  2. La combinaison de ligne rapide et de ligne lente peut répondre rapidement aux changements de prix et a également un effet de filtrage
  3. Les signaux de la croix d'or et de la croix de la mort sont simples et clairs, faciles à utiliser.
  4. Capable de détecter efficacement les tendances à moyen et long terme
  5. Sorties rapides à des signaux opposés pour contrôler les risques

Analyse des risques

Cette stratégie comporte également certains risques:

  1. Il peut générer de multiples faux signaux lorsque le prix est limité à une plage, ce qui provoque un sur-échange
  2. Ne peut pas gérer très bien les fluctuations extrêmes des prix causées par des événements inattendus
  3. Les paramètres tels que les périodes de MA peuvent nécessiter une optimisation, les paramètres incorrects affecteront les performances de la stratégie
  4. Les coûts de négociation ont une certaine incidence sur la rentabilité

Des méthodes telles que l'optimisation des paramètres, le réglage du niveau de stop loss, le trading uniquement lorsque la tendance est claire, etc. peuvent être utilisées pour contrôler et réduire ces risques.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Optimiser les périodes de MA et les types de croisement pour trouver la combinaison optimale de paramètres
  2. Ajouter d'autres filtres d'indicateurs techniques tels que le volume des transactions, le MACD, etc. pour réduire les faux signaux
  3. Ajouter un mécanisme d'arrêt de perte adaptatif au lieu d'une simple perte d'arrêt de signal opposé
  4. Ensembles de paramètres de conception et règles d'arrêt des pertes pour différents produits
  5. Incorporer des méthodes d'apprentissage automatique pour ajuster dynamiquement les paramètres

Grâce aux tests et à l'optimisation, les règles de stratégie peuvent être continuellement améliorées pour obtenir des signaux de trading plus fiables dans différents environnements de marché.

Résumé

En résumé, cette stratégie de rupture de double MA est assez simple et pratique. En combinant MA rapide et MA lente, elle peut identifier efficacement le début des tendances à moyen et long terme et générer des signaux de trading relativement fiables. En outre, sa règle de stop loss est facile à mettre en œuvre. Avec une optimisation supplémentaire, cette stratégie peut devenir un système quantitatif à long terme utile.


/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//future strategy
//strategy(title = "es1!_1minute_hull", default_qty_type = strategy.fixed, initial_capital=250000,  overlay = true, commission_type=strategy.commission.cash_per_contract,commission_value=2, calc_on_order_fills=false, calc_on_every_tick=false,pyramiding=0)
//strategy.risk.max_position_size(2)
//stock strategy
strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=1000000, overlay = false)//, calc_on_order_fills=true, calc_on_every_tick=true)
//forex strategy
//strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100,  overlay = true,initial_capital=250000, default_qty_type = strategy.percent_of_equity)
//crypto strategy
//strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100,  overlay = true, commission_type=strategy.commission.percent,commission_value=.005,default_qty_value=10000)
//strategy.risk.allow_entry_in(strategy.direction.long) // There will be no short entries, only exits from long.




testStartYear = 2010
testStartMonth = 1
testStartDay = 1
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)


testEndYear = 2039
testEndMonth = 1
testEndDay = 1
testPeriodEnd = timestamp(testEndYear,testEndMonth,testEndDay,0,0)


testPeriod() =>
    //true
    time >= testPeriodStart and time <= testPeriodEnd ? true : false

fast_length = 30
slow_length = 33

ema1 = 0.0
ema2 = 0.0

volumeSum1 = sum(volume, fast_length)
volumeSum2 = sum(volume, slow_length)

//ema1 := (((volumeSum1 - volume) * nz(ema1[1]) + volume * close) / volumeSum1)
ema1 :=  ema(close,fast_length)
//ema2 := (((volumeSum2 - volume) * nz(ema2[1]) + volume * close) / volumeSum2)
ema2 :=  ema(close,slow_length)



plot(ema1,color=#00ff00, linewidth=3)
plot(ema2, color=#ffff00, linewidth=3)

go_long = crossover(ema1,ema2)
go_short = crossunder(ema1,ema2)

if testPeriod()
    strategy.entry("long_ride", strategy.long, when=go_long)
    strategy.entry("short_ride", strategy.short,when=go_short)
    
        
    strategy.close("long_ride",when=go_short)
    strategy.close("short_ride",when=go_long)
    

Plus de