Stratégie de rupture à double dynamique

Auteur:ChaoZhang est là., Date: 2023-11-16 17h54
Les étiquettes:

img

Résumé

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.

La logique de la stratégie

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.

Les avantages de la stratégie

  1. 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.

  2. Seules les entrées longues et les sorties courtes réduisent la fréquence des transactions et les coûts de transaction.

  3. Des réglages flexibles des paramètres de momentum s'adaptent aux différents environnements du marché.

  4. Structure de code propre, facile à comprendre et à modifier.

  5. Messages de trading activés, s'intègre bien avec les systèmes de trading automatique.

Risques liés à la stratégie

  1. Le double momentum peut manquer les signaux de tendance plus faibles tout en réduisant les faux signaux.

  2. Manquer des opportunités commerciales courtes avec seulement de longues entrées.

  3. Les paramètres de dynamique mal réglés entraînent une survente ou des signaux retardés.

  4. Les données insuffisantes des tests antérieurs entraînent un surajustement des paramètres.

  5. La double confirmation réduit mais n'élimine pas les faux signaux, il faut surveiller la validité dans le trading en direct.

Directions d'optimisation

  1. Testez des combinaisons de paramètres de longueur et de pourcentage pour trouver l'optimum.

  2. Envisagez d'ajouter des signaux de trading à court terme après la confirmation de la tendance pour capturer plus de transactions.

  3. Testez différents calculs de momentum comme ROC, RSI etc. pour de meilleurs résultats.

  4. Ajoutez le filtrage des tendances pour éviter les marchés à piqûre.

  5. Optimiser le stop loss pour une rentabilité maximale dans les limites du risque.

Conclusion

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")

Plus de