Stratégie de croisement des moyennes mobiles doubles

Auteur:ChaoZhang est là., Date: 2023-12-11 15h21 et 58 min
Les étiquettes:

img

Résumé

La double moyenne mobile est une stratégie de suivi de tendance qui utilise le croisement de deux moyennes mobiles de différentes périodes comme signaux de trading. Elle entre dans des positions longues ou courtes lorsque le MA rapide traverse au-dessus ou en dessous du MA lent et détermine la direction de la tendance après le croisement.

La logique de la stratégie

La stratégie utilise deux moyennes mobiles: un MA rapide avec une période plus courte (par exemple 15 périodes) pour capturer les mouvements de prix à court terme, et un MA lent avec une période plus longue (par exemple 21 périodes) pour identifier la direction de la tendance majeure.

En ajustant les combinaisons de périodes de MA, la stratégie peut ajuster le calendrier des tendances à capturer.

La stratégie intègre également des modules de gestion des risques, y compris les modules de prise de profit, de stop-loss et de stop-loss de suivi.

Les avantages

La stratégie de double MA présente les avantages suivants:

  1. logique simple et facile à comprendre/mettre en œuvre;
  2. la flexibilité d'adaptation aux conditions du marché par la régulation des périodes d'établissement de l'AM;
  3. La stabilité résulte d'une diminution du nombre de signaux commerciaux;
  4. un contrôle efficace des risques par le biais de stop-loss;
  5. Facilité d'optimisation sur l'AM, les paramètres de risque, etc.

Les risques

Il y a aussi quelques risques à prendre en considération:

  1. Des croisements excessifs et une fréquence de négociation excessive sur les marchés à plage;
  2. Les AMP en retard peuvent manquer les points d'inversion des prix et ne pas pouvoir arrêter les pertes à temps;
  3. vulnérabilité à de fausses fuites entraînant des pertes inutiles;
  4. Inaccuracies générales du suivi des prix dues au retard des AMS.

Ces faiblesses peuvent être atténuées grâce à des optimisations telles que le filtrage des signaux, le stop-loss à la traîne, etc.

Des possibilités d'amélioration

La stratégie peut être améliorée dans des aspects tels que:

  1. Ajout de filtres sur le volume ou la volatilité pour éviter les coupes de fouet;
  2. Test d'un plus grand nombre de types d'autorisation et de périodes/formules de réglage afin de les adapter à différents produits et délais;
  3. Examiner les types d'AM comme l'EMA, la LWMA pour le suivi des prix le plus rapide;
  4. Automatiser le réglage MA et le dimensionnement des pertes d'arrêt avec l'apprentissage automatique;
  5. Les prix de référence sont les prix de référence de l'établissement.

Une augmentation significative du taux de réussite et des rendements ajustés au risque sont attendus de ces augmentations.

Conclusion

Dans l'ensemble, la double stratégie de croisement des moyennes mobiles offre simplicité, flexibilité et risques contrôlables. Sa facilité de mise en œuvre et d'optimisation en fait une stratégie quantitative initiale idéale.


/*backtest
start: 2022-12-10 00:00:00
end: 2023-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "Silent Trader Strategy", shorttitle = "Silent Trader", overlay = true, pyramiding = 0, default_qty_type = strategy.cash, default_qty_value = 1000, commission_value = 0.0675, initial_capital = 1000, currency = currency.USD, calc_on_order_fills = true, calc_on_every_tick = true)

maFastSource   = input(defval = ohlc4, title = "Fast MA Source")
maFastLength   = input(defval = 15, title = "Fast MA Period", minval = 1)
maSlowSource   = input(defval = ohlc4, title = "Slow MA Source")
maSlowLength   = input(defval = 21, title = "Slow MA Period", minval = 1)

tradeInvert     = input(defval = false, title = "Invert Trade Direction?")
inpTakeProfit   = input(defval = 100, title = "Take Profit percentage(0.1%)", minval = 0)
inpStopLoss     = input(defval = 100, title = "Stop Loss", minval = 0)
inpTrailStop    = input(defval = 0, title = "Trailing Stop Loss", minval = 0)
inpTrailOffset  = input(defval = 0, title = "Trailing Stop Loss Offset", minval = 0)

useTakeProfit   = inpTakeProfit  >= 1 ? inpTakeProfit  : na
useStopLoss     = inpStopLoss    >= 1 ? inpStopLoss    : na
useTrailStop    = inpTrailStop   >= 1 ? inpTrailStop   : na
useTrailOffset  = inpTrailOffset >= 1 ? inpTrailOffset : na

useTimeLimit    = input(defval = true, title = "Use Start Time Limiter?")
startYear       = input(defval = 2018, title = "Start From Year",  minval = 0, step = 1)
startMonth      = input(defval = 05, title = "Start From Month",  minval = 0,step = 1)
startDay        = input(defval = 01, title = "Start From Day",  minval = 0,step = 1)
startHour       = input(defval = 00, title = "Start From Hour",  minval = 0,step = 1)
startMinute     = input(defval = 00, title = "Start From Minute",  minval = 0,step = 1)

startTimeOk() =>
    inputTime = timestamp(syminfo.timezone, startYear, startMonth, startDay, startHour, startMinute)
    timeOk = time > inputTime ? true : false
    r = (useTimeLimit and timeOk) or not useTimeLimit

maFast = ema(maFastSource, maFastLength)
maSlow = sma(maSlowSource, maSlowLength)

fast = plot(maFast, title = "Fast MA", color = #26A69A, linewidth = 1, style = line, transp = 50)
slow = plot(maSlow, title = "Slow MA", color = #EF5350, linewidth = 1, style = line, transp = 50)

aboveBelow = maFast >= maSlow ? true : false
tradeDirection = tradeInvert ? aboveBelow ? false : true : aboveBelow ? true : false

if( startTimeOk() )
    enterLong = not tradeDirection[1] and tradeDirection
    exitLong = tradeDirection[1] and not tradeDirection
    strategy.entry( id = "Long", long = true, when = enterLong )
    //strategy.close( id = "Long", when = exitLong )
    
    enterShort = tradeDirection[1] and not tradeDirection
    exitShort = not tradeDirection[1] and tradeDirection
    strategy.entry( id = "Short", long = false, when = enterShort )
    //strategy.close( id = "Short", when = exitShort )
    
    strategy.exit("Exit Long", from_entry = "Long",  profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)
    strategy.exit("Exit Short", from_entry = "Short", profit = close * useTakeProfit / 1000 / syminfo.mintick, loss = close * useStopLoss / 1000 / syminfo.mintick, trail_points = close * useTrailStop / 1000 / syminfo.mintick, trail_offset = close * useTrailOffset / 1000 / syminfo.mintick)

Plus de