Stratégie de négociation croisée de la moyenne mobile double

Auteur:ChaoZhang est là., Date: 2023-12-27 16:07:49 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie génère des signaux d'achat et de vente basés sur la croix d'or et la croix de mort des moyennes mobiles. Plus précisément, elle utilise une moyenne mobile exponentielle de 5 jours (EMA) et une moyenne mobile exponentielle double de 34 jours (DEMA). Lorsque l'EMA à court terme de 5 jours franchit le sommet de la DEMA à long terme de 34 jours, un signal d'achat est généré. Lorsque l'EMA à court terme de 5 jours franchit le sommet de la DEMA à long terme de 34 jours, un signal de vente est généré.

La logique de la stratégie

  1. Calculer l'EMA à 5 jours et la DEMA à 34 jours
  2. Générer un signal d'achat lorsque l'EMA à court terme de 5 jours dépasse la DEMA à long terme de 34 jours
  3. Générer un signal de vente lorsque l'EMA à court terme de 5 jours dépasse la DEMA à long terme de 34 jours
  4. Option de négocier uniquement lors de sessions de négociation spécifiques
  5. Option d'utilisation d'un arrêt de perte à la traîne

Cette stratégie combine à la fois les facteurs de croisement des moyennes mobiles et des moyennes mobiles pour une performance stable. Les moyennes mobiles en tant qu'indicateur de suivi des tendances peuvent identifier efficacement les tendances du marché; La combinaison EMA et DEMA peut efficacement lisser les données de prix pour générer des signaux de trading; Les croisements entre les moyennes mobiles à court et à long terme peuvent fournir des signaux de trading précoces lorsque des changements de tendance majeurs se produisent.

Analyse des avantages

  1. Logie stratégique simple et claire, facile à comprendre et à mettre en œuvre
  2. L'utilisation combinée de moyennes mobiles prend en considération à la fois le jugement de tendance et l'assouplissement des données sur les prix
  3. Les croisements entre les moyennes mobiles à court terme et à long terme peuvent fournir des signaux précoces à des moments marquants
  4. Les paramètres peuvent être optimisés pour ajuster les longueurs moyennes mobiles pour différents produits et délais
  5. L'intégration de deux facteurs peut améliorer la stabilité de la stratégie

Analyse des risques

  1. Plus de faux signaux peuvent se produire sur les marchés de gamme
  2. Des longueurs moyennes mobiles inappropriées peuvent entraîner un retard du signal
  3. Des horaires de négociation et des paramètres de stop loss inappropriés peuvent affecter la rentabilité de la stratégie

Ces risques peuvent être réduits en ajustant les longueurs de moyenne mobile, en optimisant les heures de négociation et en définissant un stop loss raisonnable.

Directions d'optimisation

  1. Ajuster les paramètres de longueur moyenne mobile pour différents produits de négociation et délais
  2. Optimiser les paramètres de session de négociation pour négocier pendant les périodes les plus actives
  3. Comparer le stop-loss fixe et le stop-loss suivant
  4. Test de l'impact des différentes options de source de prix sur la stratégie

Conclusion

Cette stratégie génère des signaux de trading grâce à des doubles croisements de moyennes mobiles, combinés à des techniques de suivi des tendances et de lissage des données. C'est une stratégie de suivi des tendances simple et pratique.


/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_1",false]]
*/

//@version=2
strategy(title='[STRATEGY][RS]MicuRobert EMA cross V2', shorttitle='S', overlay=true)
USE_TRADESESSION = input(title='Use Trading Session?', type=bool, defval=true)
USE_TRAILINGSTOP = input(title='Use Trailing Stop?', type=bool, defval=true)
trade_session = input(title='Trade Session:',  defval='0400-1500', confirm=false)
istradingsession = not USE_TRADESESSION ? false : not na(time('1', trade_session))
bgcolor(istradingsession?gray:na)
trade_size = input(title='Trade Size:', type=float, defval=1)
tp = input(title='Take profit in pips:', type=float, defval=55.0) * (syminfo.mintick*10)
sl = input(title='Stop loss in pips:', type=float, defval=22.0) * (syminfo.mintick*10)
ma_length00 = input(title='EMA length:', defval=5)
ma_length01 = input(title='DEMA length:',  defval=34)
price = input(title='Price source:', defval=open)

//  ||--- NO LAG EMA, Credit LazyBear:  ---||
f_LB_zlema(_src, _length)=>
    _ema1=ema(_src, _length)
    _ema2=ema(_ema1, _length)
    _d=_ema1-_ema2
    _zlema=_ema1+_d
//  ||-------------------------------------||

ma00 = f_LB_zlema(price, ma_length00)
ma01 = f_LB_zlema(price, ma_length01)
plot(title='M0', series=ma00, color=black)
plot(title='M1', series=ma01, color=black)

isnewbuy = change(strategy.position_size)>0 and change(strategy.opentrades)>0
isnewsel = change(strategy.position_size)<0 and change(strategy.opentrades)>0

buy_entry_price = isnewbuy ? price : buy_entry_price[1]
sel_entry_price = isnewsel ? price : sel_entry_price[1]
plot(title='BE', series=buy_entry_price, style=circles, color=strategy.position_size <= 0 ? na : aqua)
plot(title='SE', series=sel_entry_price, style=circles, color=strategy.position_size >= 0 ? na : aqua)
buy_appex = na(buy_appex[1]) ? price : isnewbuy ? high : high >= buy_appex[1] ? high : buy_appex[1]
sel_appex = na(sel_appex[1]) ? price : isnewsel ? low : low <= sel_appex[1] ? low : sel_appex[1]
plot(title='BA', series=buy_appex, style=circles, color=strategy.position_size <= 0 ? na : teal)
plot(title='SA', series=sel_appex, style=circles, color=strategy.position_size >= 0 ? na : teal)
buy_ts = buy_appex - sl
sel_ts = sel_appex + sl
plot(title='Bts', series=buy_ts, style=circles, color=strategy.position_size <= 0 ? na : red)
plot(title='Sts', series=sel_ts, style=circles, color=strategy.position_size >= 0 ? na : red)

buy_cond1 = crossover(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
buy_cond0 = crossover(price, ma00) and ma00 > ma01 and (USE_TRADESESSION ? istradingsession : true)
buy_entry = buy_cond1 or buy_cond0
buy_close = (not USE_TRAILINGSTOP ? low <= buy_entry_price - sl: low <= buy_ts) or high>=buy_entry_price+tp//high>=last_traded_price + tp or low<=last_traded_price - sl //high >= hh or 
sel_cond1 = crossunder(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
sel_cond0 = crossunder(price, ma00) and ma00 < ma01 and (USE_TRADESESSION ? istradingsession : true)
sel_entry = sel_cond1 or sel_cond0
sel_close = (not USE_TRAILINGSTOP ? high >= sel_entry_price + sl : high >= sel_ts) or low<=sel_entry_price-tp//low<=last_traded_price - tp or high>=last_traded_price + sl //low <= ll or 

strategy.entry('buy', long=strategy.long, qty=trade_size, comment='buy', when=buy_entry)
strategy.close('buy', when=buy_close)
strategy.entry('sell', long=strategy.short, qty=trade_size, comment='sell', when=sel_entry)
strategy.close('sell', when=sel_close)

Plus de