La stratégie de croisement des moyennes mobiles doubles juge la direction de la tendance des prix en calculant les moyennes mobiles de différentes périodes et réalise la tendance suivante.
Cette stratégie est basée sur des moyennes mobiles exponentielles (EMA) de 9, 21 et 50 périodes.
Lorsque l'EMA à 9 périodes traverse l'EMA à 21 périodes, il indique une tendance haussière à court terme, donc une tendance longue.
La logique d'entrée longue/courte, de prise de profit et d'arrêt de perte est configurée. La condition d'entrée est le croisement des MAs. Le profit de prise de long est le prix d'entrée * (1 + ratio de prise de profit d'entrée), le profit de prise de court est le prix d'entrée * (1 - ratio de prise de profit d'entrée). Le stop-loss long est le prix d'entrée * (1 - ratio de stop-loss d'entrée), le stop-loss court est le prix d'entrée * (1 + ratio de stop-loss d'entrée).
Certains filtres sont également ajoutés, comme le filtre de tendance pour éviter les déviations latérales et le filtre d'équité pour éviter les transactions lorsque l'équité de la stratégie est trop faible.
En résumé, cette stratégie utilise des doubles croisements EMA pour déterminer la direction de la tendance des prix, avec une logique de prise de profit et de stop-loss appropriée, qui peut capturer les tendances à moyen et long terme.
L'utilisation de doubles croisements MA pour déterminer la direction de la tendance, la logique est simple et facile à comprendre.
L'adoption des EMA de périodes différentes permet de juger des tendances à court et à long terme.
La logique du profit et du stop-loss maintient le profit et contrôle le risque.
Les filtres permettent d'éviter certains faux signaux dans une certaine mesure.
Les paramètres peuvent être librement configurés, les périodes peuvent être optimisées pour différents environnements de marché.
En tant que stratégie à facteur unique, les signaux de trading peuvent ne pas être suffisamment stables.
Lorsqu'un croisement se produit, le prix peut avoir déjà augmenté ou diminué, avec un risque d'achat élevé et de vente faible.
Les coûts de négociation ne sont pas pris en compte, les rendements réels pourraient être inférieurs.
Aucun stop loss en place, risque de perte illimitée dans des conditions de marché extrêmes.
Les solutions:
Optimiser les périodes de MA pour des signaux plus stables.
Ajouter d'autres indicateurs aux signaux filtrés.
Augmenter la taille des échanges pour réduire l'impact sur les coûts.
Définir un stop-loss approprié pour limiter la perte maximale.
La stratégie peut être optimisée dans les aspects suivants:
Optimiser les périodes de MA pour trouver les meilleures combinaisons, ou utiliser l'optimisation adaptative pour sélectionner dynamiquement les meilleures périodes.
Ajoutez d'autres indicateurs techniques tels que MACD, KD, etc. pour filtrer les signaux et améliorer la qualité, ou utilisez l'apprentissage automatique pour noter les signaux et filtrer les faux.
Incorporer l'analyse du volume. Ne prenez pas le signal si le volume est insuffisant sur le croisement MA.
Vérifiez les fluctuations de prix avant que le croisement ne se produise.
Mettre en place des mécanismes de stop loss dynamiques tels que le stop loss à la traîne, le Chandelier Exit, etc., afin de réduire la distance de stop loss mais de la maintenir efficace.
Optimiser la taille des positions comme fixe/dynamique/effet de levier, afin d'obtenir des ratios bénéfice/perte plus raisonnables.
Considérez de manière exhaustive les coûts de négociation, le glissement, optimiser les ratios profit/stop loss pour assurer la rentabilité dans le trading en direct.
La structure globale de cette stratégie est solide, avec une logique simple de double croisement EMA pour déterminer la direction de la tendance, couplée à une logique de prise de profit et d'arrêt de perte pour capturer les tendances. En tant que stratégie à facteur unique, elle peut être optimisée sur les paramètres, les filtres de signal, etc. pour la rendre plus robuste. Avec un stop-loss et un dimensionnement de position appropriés, les risques peuvent être encore réduits. Dans l'ensemble, elle fournit une tendance solide en suivant le cadre de la stratégie, qui peut réaliser des profits cohérents après des optimisations et des ajustements.
/*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 = " ")