Stratégie de suivi de tendance à triple moyenne mobile


Date de création: 2024-02-01 11:02:17 Dernière modification: 2024-02-01 11:02:17
Copier: 2 Nombre de clics: 600
1
Suivre
1617
Abonnés

Stratégie de suivi de tendance à triple moyenne mobile

Aperçu

Cette stratégie combine les concepts de la méthode des crocodiles avec l’analyse de phases de Niko Bakkers et utilise trois moyennes mobiles de différentes périodes pour déterminer la direction d’une tendance, permettant de suivre la tendance pour en tirer un profit. Faites plus lorsque la moyenne rapide est traversée par la moyenne mobile rapide et que les trois moyennes mobiles sont dans la même tendance à la hausse ou à la baisse; et faites zéro lorsque la moyenne mobile est traversée par la moyenne rapide et que les trois moyennes mobiles sont dans la même tendance à la hausse ou à la baisse.

Principe de stratégie

  1. Calculer les moyennes mobiles de trois périodes différentes: les moyennes mobiles rapides de 8 jours, les moyennes mobiles moyennes de 21 jours et les moyennes mobiles lentes de 55 jours.

  2. Conditions d’entrée: faire plus lorsque la moyenne mobile est traversée par la moyenne mobile rapide sur la moyenne mobile rapide et que les trois moyennes mobiles sont en tendance haussière; faire moins lorsque la moyenne mobile est traversée par la moyenne mobile sous la moyenne mobile rapide et que les trois moyennes mobiles sont en tendance baissière.

  3. Conditions de sortie: la moyenne mobile rapide est inversée et la moyenne mobile rapide est équilibrée.

  4. Contrôle de position: position fixe, 1 main pour chaque ouverture de position. Il est également possible d’ajuster la position en fonction de la dynamique ATR.

Avantages stratégiques

  1. L’utilisation de trois moyennes mobiles aide à déterminer la direction de la tendance et à éviter les fausses ruptures.

  2. Le blogueur a écrit sur son blog:

  3. Les moyennes mobiles ont un rendement stable et un retrait relativement faible.

  4. Des stratégies de stop-loss contrôlables pour réduire la probabilité de pertes importantes.

Analyse des risques

  1. Il est facile de générer de petites pertes et de réduire l’efficacité des bénéfices.

  2. Les moyennes mobiles sont en retard et risquent de manquer le point de basculement.

  3. Les positions fixes ne permettent pas de contrôler efficacement les risques et peuvent être débloquées en cas de choc majeur.

  4. Une mauvaise optimisation des paramètres entraîne une ouverture trop fréquente des positions de gré à gré, augmentant les frais de transaction et la perte de points de glissement.

Direction d’optimisation

  1. Optimisation des paramètres cycliques des moyennes mobiles pour les rendre plus conformes aux caractéristiques des variétés négociées.

  2. Appliquer l’indicateur de volatilité ATR pour modifier dynamiquement la position.

  3. Adhérer à une stratégie de stop-loss.

  4. La fiabilité de la tendance est évaluée en fonction de l’indicateur du volume des transactions.

Résumer

Cette stratégie intègre les indicateurs d’analyse technique traditionnels et la méthode de trading des corbeaux. Elle utilise trois moyennes mobiles pour suivre la tendance et, si les paramètres sont optimisés, elle permet d’obtenir de meilleurs résultats. Cependant, cette stratégie comporte également des risques.

Code source de la stratégie
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL 
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © JoshuaMcGowan

//@version=4

// 1. Define strategy settings
strategy(title="Triple Moving Average", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=4, slippage=2)
     
fastMALen = input(title="Fast MA Length", type=input.integer, defval=8)
medMALen  = input(title="Medium MA Length", type=input.integer, defval=21)
slowMALen = input(title="Slow MA Length", type=input.integer, defval=55)

//endMonth = input(title="End Month Backtest", type=input.integer, defval=11)
//endYear  = input(title="End Year Backtest", type=input.integer, defval=2019)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 12, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2016, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc   = input(title="Risk %", type=input.float, defval=0.5, step=0.25)

// 2. Calculate strategy values
fastMA = sma(close, fastMALen)
medMA  = sma(close, medMALen)
slowMA = sma(close, slowMALen)

//Position Sizing
riskEquity  = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize     = usePosSize ? floor(riskEquity / atrCurrency) : 1

//Backtest Window
//tradeWindow = (time <= timestamp(endYear, endMonth, 1, 0, 0))

// 3. Determine long trading conditions
enterLong = crossover(fastMA, medMA) and
     (fastMA > slowMA) and (medMA > slowMA) and
     window() 

exitLong = crossunder(fastMA, medMA)

// 4. Code short trading conditions
enterShort = crossunder(fastMA, medMA) and
     (fastMA < slowMA) and (medMA < slowMA) and
     window() 

exitShort = crossover(fastMA, medMA)

// 5. Output strategy data
plot(series=fastMA, color=color.green, title="Fast MA")
plot(series=medMA, color=color.purple, title="Medium MA")
plot(series=slowMA, color=color.red, title="Slow MA",
     linewidth=2)
     
bgColour =
     enterLong and (strategy.position_size < 1) ? color.green :
     enterShort and (strategy.position_size > -1) ? color.red :
     exitLong and (strategy.position_size > 0) ? color.lime :
     exitShort and (strategy.position_size < 0) ? color.orange :
     na

bgcolor(color=bgColour, transp=85)

// 6. Submit entry orders
if (enterLong)
    strategy.entry(id="EL", long=true, qty=1)

if (enterShort)
    strategy.entry(id="ES", long=false, qty=1)

// 7. Submit exit orders
strategy.close_all(when=exitLong and
     (strategy.position_size > 0))
strategy.close_all(when=exitShort and
     (strategy.position_size < 0))

strategy.close_all(when=not window())

//END