Il s'agit d'une stratégie de rupture à double dynamique. Il utilise deux indicateurs de dynamique avec des paramètres différents et génère des signaux de trading lorsque les deux indicateurs de dynamique franchissent la ligne zéro.
Le code définit d'abord les propriétés de la stratégie telles que le type d'ordre, le schéma de commission, etc. Il calcule ensuite deux indicateurs de dynamique:
// Momentum settings
****
i_len = input(defval = 12, title = "Length", minval = 1)
i_src = input(defval = close, title = "Source")
i_percent = input(defval = true, title = "Percent?")
i_mom = input(defval = "MOM2", title = "MOM Choice", options = ["MOM1", "MOM2"])
// Momentum code
mom0 = momentum(i_src, i_len, i_percent)
mom1 = momentum(mom0, 1, i_percent)
mom2 = momentum(i_src, 1, i_percent)
momX = mom1
if i_mom == "MOM2"
momX := mom2
mom0 est l'indicateur de momentum de base avec longueur i_len, source de données i_src, si calculer le pourcentage est décidé par i_percent.
mom1 est l'indicateur de momentum avec mom0 comme source de données et longueur 1.
mom2 est l'indicateur de momentum avec les données d'origine i_src comme source et longueur 1.
L'indicateur de momentum final momX par défaut pour mom1, peut également choisir mom2.
Lorsque mom0 et momX dépassent tous les deux la ligne zéro, passez long.
L'utilisation de deux indicateurs de momentum avec des réglages différents améliore la fiabilité du signal avec une double confirmation et moins de faux signaux.
Seules les entrées longues et les sorties courtes réduisent la fréquence des transactions et les coûts de transaction.
Des réglages flexibles des paramètres de momentum s'adaptent aux différents environnements du marché.
Structure de code propre, facile à comprendre et à modifier.
Messages de trading activés, s'intègre bien avec les systèmes de trading automatique.
Le double momentum peut manquer les signaux de tendance plus faibles tout en réduisant les faux signaux.
Manquer des opportunités commerciales courtes avec seulement de longues entrées.
Les paramètres de dynamique mal réglés entraînent une survente ou des signaux retardés.
Les données insuffisantes des tests antérieurs entraînent un surajustement des paramètres.
La double confirmation réduit mais n'élimine pas les faux signaux, il faut surveiller la validité dans le trading en direct.
Testez des combinaisons de paramètres de longueur et de pourcentage pour trouver l'optimum.
Envisagez d'ajouter des signaux de trading à court terme après la confirmation de la tendance pour capturer plus de transactions.
Testez différents calculs de momentum comme ROC, RSI etc. pour de meilleurs résultats.
Ajoutez le filtrage des tendances pour éviter les marchés à piqûre.
Optimiser le stop loss pour une rentabilité maximale dans les limites du risque.
Il s'agit d'une stratégie typique de rupture de double dynamique. Il utilise la double confirmation pour réduire les faux signaux et seulement de longues entrées pour réduire la fréquence des transactions. Les avantages sont la simplicité et la facilité de mise en œuvre, avec beaucoup de place pour des améliorations dans l'optimisation des paramètres et le contrôle des risques.
/*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"}] */ //@version=4 strategy("Momentum Long Strategy", overlay = false, precision = 2, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = 0, calc_on_every_tick = true) // There will be no short entries, only exits from long. strategy.risk.allow_entry_in(strategy.direction.long) // Calculate start/end date and time condition startDate = input(timestamp("2021-01-02T00:00:00"), title = "Start Date", type = input.time) finishDate = input(timestamp("2021-12-31T00:00:00"), title = "End Date",type = input.time) time_cond =true // Momentum settings i_len = input(defval = 12, title = "Length", minval = 1) i_src = input(defval = close, title = "Source") i_percent = input(defval = true, title = "Percent?") i_mom = input(defval = "MOM2", title = "MOM Choice", options = ["MOM1", "MOM2"]) // Messages for buy and sell message_buy = input("{{strategy.order.alert_message}}", title="Buy message") message_sell = input("{{strategy.order.alert_message}}", title="Sell message") // Momentum code momentum(seria, length, percent) => _mom = percent ? ( (seria / seria[length]) - 1) * 100 : seria - seria[length] _mom mom0 = momentum(i_src, i_len, i_percent) mom1 = momentum(mom0, 1, i_percent) mom2 = momentum(i_src, 1, i_percent) momX = mom1 if i_mom == "MOM2" momX := mom2 // Strategy Alerts if (mom0 > 0 and momX > 0 and time_cond) strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE", alert_message = message_buy) else strategy.cancel("MomLE") if (mom0 < 0 and momX < 0 and time_cond) strategy.entry("MomExit", strategy.short, stop = low - syminfo.mintick, comment = "MomSE", alert_message = message_sell) else strategy.cancel("MomExit") // Plotting plot(0, color = #5d606b, title = "ZERO") plot(mom0, color = #00bcd4, title = "MOM") plot(mom1, color = #00FF00, title = "MOM1", display = display.none) plot(mom2, color = #00FF00, title = "MOM2")