Cette stratégie implémente un système de trading typique de moyenne mobile exponentielle triple (EMA). Elle génère des signaux de trading en comparant une EMA rapide de 5 jours, une EMA moyenne de 20 jours et une EMA lente de 50 jours. Elle utilise également le prix de clôture de la barre actuelle par rapport aux barres précédentes pour filtrer les faux signaux.
Lorsque l'EMA à 5 jours dépasse l'EMA à 20 jours, et que les trois EMA sont alignées à la hausse (EMA à 5 jours > EMA à 20 jours > EMA à 50 jours), et que la fermeture actuelle des barres est supérieure aux barres précédentes près de certains tics, passez long. Lorsque l'EMA à 5 jours dépasse l'EMA à 20 jours, et que les trois EMA sont alignées à la baisse (EMA à 5 jours < EMA à 20 jours < EMA à 50 jours), et que la fermeture actuelle des barres est inférieure aux barres précédentes près de certains tics, passez court.
Après l'entrée, lorsque le prix atteint certains niveaux, un stop loss de trailing sera lancé pour continuer à ajuster le stop loss en fonction de la fluctuation des prix, afin d'obtenir des bénéfices plus importants.
L'utilisation de triple EMA pour générer des signaux peut filtrer efficacement le bruit du marché et identifier les tendances.
La comparaison des clôtures actuelles avec les clôtures précédentes filtre davantage les faux signaux et réduit les transactions inutiles.
Le stop loss de suivi ajuste dynamiquement le stop loss en fonction de l'action du prix pour maximiser le verrouillage des bénéfices.
Les paramètres flexibles de cette stratégie permettent l'optimisation sur différents produits et délais, de la barre journalière à la barre minute.
Les croisements fréquents entre les EMA peuvent entraîner des transactions excessives sur des marchés variés, ce qui augmente les coûts liés aux commissions et aux glissades.
Le stop loss peut sortir prématurément de la tendance lors d'énormes baisses.
Le décalage de l'EMA peut entraîner des points de basculement et des pertes majeurs.
Les paramètres tels que les périodes EMA, les tics de stop de trailing nécessitent une optimisation pour différents produits et délais.
Incorporer d'autres indicateurs tels que MACD, KD pour filtrer les signaux de trading.
Tester et optimiser les paramètres pour des produits et des délais spécifiques afin de trouver les meilleures combinaisons.
Ajustez dynamiquement les paramètres grâce à la supervision humaine ou à l'apprentissage automatique.
Considérez la possibilité de désactiver le trailing stop et de maintenir la position complète pour des conditions de marché spécifiques.
Remplacer le simple stop loss par des mécanismes de prise de profit automatique plus avancés.
Cette stratégie intègre trois techniques d'analyse technique courantes - EMA crossover, price breakout et trailing stop loss dans un système de trading assez complet et robuste suivant la tendance. Grâce à l'optimisation des paramètres, elle peut être adaptée à différents produits et délais et fonctionne bien sur des marchés à forte tendance. Mais elle présente également certaines faiblesses typiques des stratégies d'analyse technique qui nécessitent une optimisation supplémentaire pour gérer plus de situations de marché. Dans l'ensemble, cette stratégie fournit une idée simple et pratique pour le trading quantitatif en démontrant très bien certains concepts de stratégie courants.
/*backtest start: 2023-10-01 00:00:00 end: 2023-10-02 12:00:00 period: 1m basePeriod: 1m 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/ // © Matt Dearden - IndoPilot // @version=4 /////////////////////////////////////////////////////// Initial Parameters /////////////////////////////////////////////////////// SystemName = "Triple EMA Strategy" ShortSystemName = "TEMA" InitPosition = 0 InitCapital = 50000 InitCommission = 0.004 //approx value to compensate for Oanda spreads InitPyramidMax = 0 CalcOnorderFills = true strategy(title=SystemName, shorttitle=ShortSystemName, overlay=true, pyramiding=InitPyramidMax, default_qty_type=strategy.cash, default_qty_value=InitPosition, commission_type=strategy.commission.percent, commission_value=InitCommission, initial_capital=InitCapital, max_lines_count=500, max_labels_count=500, process_orders_on_close=false, calc_on_every_tick=false) ///////////////////////////////////////////////////////////// Inputs ///////////////////////////////////////////////////////////// DateFilter = input(false, "═════ Data Filtering ═════") InitYear = input(title="Year", type=input.integer, defval=2021, minval=2000, maxval=2021) InitMonth = input(title="Month (0=ALL)", type=input.integer, defval=0, minval=0, maxval=12) InitStopLoss = input(title="Stop Loss (ticks)", type=input.integer, defval=100, minval=0, maxval=1000) TrailingStopLoss = input(title="Trailing S/L (ticks)", type=input.integer, defval=130, minval=0, maxval=1000) InitBuffer = input(title="Buffer (ticks)", type=input.integer, defval=15, minval=0, maxval=1000) InitEMA1 = input(title="EMA 1", type=input.integer, defval=5, minval=0, maxval=1000) InitEMA2 = input(title="EMA 2", type=input.integer, defval=20, minval=0, maxval=1000) InitEMA3 = input(title="EMA 3", type=input.integer, defval=50, minval=0, maxval=1000) //////////////////////////////////////////////////////////// Variables /////////////////////////////////////////////////////////// var StopLoss = float(0.0) var StartPrice = float(0.0) //setup multipliers and catch JPY difference Multiplier = syminfo.currency == "JPY" ? 10 : 1000 //get the daily exchange rate from yesterday //X_rate = security(AccountCurrency+syminfo.currency, "D", close[1]) OrderQty = 1 Buffer = InitBuffer / (Multiplier * 100) /////////////////////////////////////////////////////// Triple EMA Strategy ////////////////////////////////////////////////////// EMA1 = ema(close, InitEMA1) EMA2= ema(close, InitEMA2) EMA3 = ema(close, InitEMA3) //entry conditions longCondition = crossover(EMA1, EMA2) and close > EMA3 and EMA1 > EMA3 and EMA2 > EMA3 and close > (close[1] + Buffer) shortCondition = crossunder(EMA1, EMA2) and close < EMA3 and EMA1 < EMA3 and EMA2 < EMA3 and close < (close[1] - Buffer) /////////////////////////////////////////////////////// Trailing Stoploss //////////////////////////////////////////////////////// if (strategy.position_size > 0 and (close > (StartPrice + (TrailingStopLoss / (100 * Multiplier))))) StopLoss := max(StopLoss, close - (TrailingStopLoss / (100 * Multiplier))) strategy.exit("Long Stoploss", "Long") if (strategy.position_size < 0 and (close < (StartPrice - (InitStopLoss / (100 * Multiplier))))) StopLoss := min(StopLoss, close + (TrailingStopLoss / (100 * Multiplier))) strategy.exit("Short Stoploss", "Short") ///////////////////////////////////////////////////////// Setup entries ///////////////////////////////////////////////////////// if (longCondition) StartPrice := close StopLoss := StartPrice - (InitStopLoss / (100 * Multiplier)) strategy.entry("Long", strategy.long, qty=OrderQty) strategy.exit("Long Stoploss", "Long") if (shortCondition) StartPrice := close StopLoss := StartPrice + (InitStopLoss / (100 * Multiplier)) strategy.entry("Short", strategy.short, qty=OrderQty) strategy.exit("Short Stoploss", "Short") ///////////////////////////////////////////////////////// Draw the EMAs ///////////////////////////////////////////////////////// plot(EMA1, "EMA1", color=#00FF00) plot(EMA2, "EMA2", color=#FF0000) plot(EMA3, "EMA3", color=#4040FF)