Stratégie de croisement à double moyenne mobile


Date de création: 2023-11-16 17:50:52 Dernière modification: 2023-11-16 17:50:52
Copier: 0 Nombre de clics: 688
1
Suivre
1617
Abonnés

Stratégie de croisement à double moyenne mobile

Aperçu

La double stratégie de croisement des moyennes mobiles permet de suivre la tendance en calculant les moyennes mobiles de différentes périodes, en déterminant la direction de la tendance des prix. La stratégie de suivi de la tendance est typique lorsque la courte moyenne périodique traverse la longue moyenne périodique en faisant plus et la courte moyenne périodique en faisant moins.

Principe de stratégie

La stratégie est basée sur des moyennes mobiles indicielles à 9 cycles, 21 cycles et 50 cycles (EMA). Les EMA à 9 cycles représentent les tendances à court terme, les EMA à 21 cycles représentent les tendances à moyen terme et les EMA à 50 cycles représentent les tendances à long terme.

Lorsque l’EMA à 9 périodes traverse l’EMA à 21 périodes, la tendance à court terme est inversée à la hausse, ce qui donne un gain. Lorsque l’EMA à 9 périodes traverse l’EMA à 21 périodes, la tendance à court terme est inversée à la baisse, ce qui donne un vide.

Le code définit la logique d’ouverture, d’arrêt et d’arrêt des positions longues et vides. Les conditions d’ouverture des positions sont uniformes. Les arrêts à plusieurs têtes correspondent au prix d’entrée × ((1 + le rapport d’arrêt des entrées), les arrêts à vide correspondent au prix d’entrée × ((1- le rapport d’arrêt des entrées).

En outre, le code a ajouté des conditions de filtrage, telles que le filtrage tendanciel, qui exige que la ligne K ne puisse pas se déplacer avant de traverser la ligne médiane, et le filtrage de l’utilisation des fonds, qui exige que la stratégie d’intérêt ne soit pas inférieure à la ligne médiane de N jours, pour éviter de perdre trop souvent. Ces conditions de filtrage peuvent éviter les faux signaux dans une certaine mesure.

Dans l’ensemble, la stratégie utilise des croisements de deux EMA pour déterminer la direction de la tendance des prix, ainsi qu’une logique de stop-loss raisonnable pour capturer les tendances de la ligne moyenne et longue. Cependant, en tant que stratégie à facteur unique, son signal peut ne pas être suffisamment stable et peut être optimisé davantage.

Analyse des avantages

  • Le principe est simple et facile à comprendre.
  • L’utilisation d’EMA à différentes périodes permet de juger des tendances à court et à long terme.
  • La logique Stop Loss est configurée pour bloquer les profits et contrôler les risques.
  • En ajoutant des conditions de filtrage, on peut filtrer les fausses signaux dans une certaine mesure.
  • Les paramètres peuvent être réglés librement, optimiser la combinaison de cycles et s’adapter à différents environnements de marché.

Analyse des risques

  • En tant que stratégie à facteur unique, les signaux de transaction peuvent ne pas être suffisamment stables.
  • La crosse de l’EMA peut avoir été effectuée à une certaine distance, avec un risque de rattrapage.
  • Les bénéfices en temps réel peuvent être réduits sans tenir compte des coûts de transaction.
  • Il n’y a pas de stop-loss et il n’y a pas de contrôle sur les pertes en cas de situation extrême.

Comment réagir:

  1. Optimiser les paramètres de la période MA pour rendre le signal plus stable.
  2. Combiné à d’autres indicateurs, le signal de filtrage
  3. Augmenter le nombre de transactions et réduire les coûts.
  4. Il est possible de limiter les pertes en plaçant un stop loss.

Direction d’optimisation

Cette stratégie peut être optimisée dans les domaines suivants:

  1. Optimiser les paramètres de cycles de la moyenne mobile pour trouver la combinaison optimale de cycles. Des techniques d’optimisation adaptative peuvent être introduites.

  2. L’ajout d’autres indicateurs techniques pour filtrer les signaux, tels que MACD, KD, etc., améliore la qualité du signal. Ou l’introduction de l’apprentissage automatique pour évaluer le signal et filtrer automatiquement les faux signaux.

  3. En combinaison avec l’analyse du volume des transactions, le signal est supprimé lorsque la moyenne est franchie mais le volume des transactions est insuffisant.

  4. Lors d’une rupture, il faut examiner les fluctuations antérieures, comme une rupture dans une zone de choc, qui peut être une fausse rupture.

  5. Mettre en place des mécanismes d’arrêt dynamiques, tels que l’arrêt de type de suivi, la sortie de Chandelier, etc., pour réduire la distance d’arrêt, mais en veillant à ce que l’arrêt soit efficace.

  6. Optimiser la gestion des positions, telles que les positions fixes, les positions dynamiques, les positions à effet de levier, etc., afin de rendre le ratio profit/perte plus raisonnable.

  7. L’optimisation du stop-loss ratio garantit que la stratégie reste rentable en temps réel.

Résumer

La structure globale de la stratégie est raisonnable, le principe est simple, la direction de la tendance est jugée par le croisement de deux EMA, et la logique d’arrêt et de perte est configurée pour capturer la tendance. Mais en tant que stratégie à facteur unique, les paramètres de configuration, le filtrage des signaux, etc. peuvent être optimisés pour rendre la stratégie plus stable.

Code source de la stratégie
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
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/
// © TradingMentalist

//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")

//turn on/off / adjust trade filters (average range/average equity)
sidein2     = input(200, step=10, title='lookback for average range (bars)')
sidein      = input(1, title='filter trades if range is less than (%)')/100
equityIn    = input(40, title='filter trades if equity is below ema()')
sidewayssw  = input(true, title='sideways filter?')
equitysw    = input(true, title='equity filter?')
longtpin    = input(1,step=0.1, title='long TP %')/100
longslin    = input(0.4,step=0.1, title='long SL %')/100
shorttpin   = input(1,step=0.1, title='short TP %')/100
shortslin   = input(0.4,step=0.1, title='short SL %')/100

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1       = (close[1] + close[sidein2]) / 2
side2       = close[1] - close[sidein2] 
side3       = side2 / side1
notsideways = side3 > sidein
equityMa    = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon   = strategy.equity >= equityMa

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)

plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1  = crossover(ma2,ma3)
longCondition2  = close[5] > close[10]
longCondition3  = close[1] > close[2]

shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]

closelong       = shortCondition1
closeshort      = longCondition1
//-------------------------------------------

//(leave as is)
longCondition1in  = longCondition1
longCondition2in  = lConSw2 ? longCondition2 : true
longCondition3in  = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions    = longCondition1in and longCondition2in and longCondition3in
shortConditions   = shortCondition1in and shortCondition2in and shortCondition3in

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long            = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short           = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel     = strategy.position_avg_price * (1 + longtpin)
longsllevel     = strategy.position_avg_price * (1 - longslin)
shorttplevel    = strategy.position_avg_price * (1 - shorttpin)
shortsllevel    = strategy.position_avg_price * (1 + shortslin)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear   = 2000
startmonth  = 1
startday    = 1

stopyear    = 9999
stopmonth   = 12
stopday     = 31
//-------------------------------------------

//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop  = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe()    =>
    time >= startperiod and time <= periodstop ? true : false

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
    if longinc
        if strategy.position_size == 0 or strategy.position_size > 0 
            strategy.entry(id="long", long=true, when=long, comment=" ")
            strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
            strategy.close(id="long", when=closelong, comment = " ")
    if shotinc
        if strategy.position_size == 0 or strategy.position_size < 0 
            strategy.entry(id="short", long=false, when=short, comment = " ")
            strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
            strategy.close(id="short", when=closeshort, comment = " ")