Tendance à la suite d'une stratégie basée sur le croisement multi-temporel TEMA

Auteur:ChaoZhang est là., Date: 2023-12-25 14:20:36 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie identifie la direction de la tendance du marché en fonction du croisement de l'indicateur TEMA sur plusieurs délais, et utilise le croisement TEMA dans des délais plus courts pour trouver des points d'entrée et de sortie spécifiques.

La logique de la stratégie

La stratégie utilise deux indicateurs TEMA, l'un avec une ligne rapide et lente basée sur 5 et 15 périodes, l'autre basé sur un délai plus long défini par l'utilisateur tel que quotidien ou hebdomadaire.

Lorsqu'une ligne rapide TEMA d'un délai plus long traverse une ligne lente, une entrée longue peut être déclenchée lorsque la ligne rapide TEMA d'un délai inférieur traverse une ligne lente; un signal de sortie est donné lorsque la ligne rapide traverse une ligne lente.

Les avantages

  1. Basé sur le crossover TEMA, évite les interférences sonores
  2. La conception multi-temps combine des cycles élevés et inférieurs, améliorant la précision
  3. Configuration souple pour une conduite longue, courte ou dans les deux sens
  4. Des règles simples, faciles à comprendre et à mettre en œuvre

Analyse des risques

  1. TEMA a un effet de retard, peut manquer le changement de prix initial
  2. Les corrections à court terme sur les TF plus élevés peuvent entraîner des opérations inversées inutiles
  3. Le réglage incorrect de la TF supérieure ne reflète pas la tendance réelle
  4. Un réglage incorrect de la TF inférieure augmente le risque d'arrêt des pertes

Solution au risque:

  1. Paramètres TEMA de réglage fin pour l'équilibre
  2. Réduire modérément la marge de stop loss
  3. Optimiser les paramètres de cycle bas élevé
  4. Robustesse des paramètres d'essai pour tous les produits

Des possibilités d'amélioration

  1. Ajustez dynamiquement les paramètres TEMA pour optimiser la sensibilité
  2. Ajouter un filtre de dynamique pour éviter de manquer des tendances
  3. Ajout d'un indice de volatilité pour la dimensionnement dynamique du stop loss
  4. Apprentissage automatique pour l'optimisation des paramètres

Résumé

La stratégie globale est simple et claire en logique, identifiant le biais de tendance via le croisement TEMA sur plusieurs délais, et s'appuyant sur un croisement supplémentaire sur des entrées de temps inférieures à TF. Elle présente certains mérites tout en offrant une certaine marge d'amélioration.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-12-24 00:00:00
period: 1d
basePeriod: 1h
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/
// © Seltzer_

//@version=4
strategy(title="TEMA Cross +HTF Backtest", shorttitle="TEMA_X_+HTF_BT", overlay=true)

orderType = input("Longs+Shorts",title="What type of Orders", options=["Longs+Shorts","LongsOnly","ShortsOnly"])
isLong   = (orderType != "ShortsOnly")
isShort  = (orderType != "LongsOnly")

// Backtest Section {

// Backtest inputs
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2020, title="From Year", minval=2010)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2017)

// Define backtest timewindow
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)  // backtest finish window
window() => true

// }

//TEMA Section {

//LTF Section
xLength = input(20, minval=1, title="Fast Length")
xPrice = close
xEMA1 = ema(xPrice, xLength)
xEMA2 = ema(xEMA1, xLength)
xEMA3 = ema(xEMA2, xLength)
xnRes = (3 * xEMA1) - (3 * xEMA2) + xEMA3
xnResP = plot(xnRes, color=color.green, linewidth=2, title="TEMA1")

yLength = input(60, minval=1, title="Slow Length")
yPrice = close
yEMA1 = ema(yPrice, yLength)
yEMA2 = ema(yEMA1, yLength)
yEMA3 = ema(yEMA2, yLength)
ynRes = (3 * yEMA1) - (3 * yEMA2) + yEMA3
ynResP = plot(ynRes, color=color.red, linewidth=2, title="TEMA2")

fill(xnResP, ynResP, color=xnRes > ynRes ? color.green : color.red, transp=65, editable=true)

//HTF Section
HTFres = input(defval="D", type=input.resolution, title="HTF Resolution")

HTFxLength = input(5, minval=1, title="HTF Fast Length")
HTFxPrice = close
HTFxEMA1 = security(syminfo.tickerid, HTFres, ema(HTFxPrice, HTFxLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFxEMA2 = security(syminfo.tickerid, HTFres, ema(HTFxEMA1, HTFxLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFxEMA3 = security(syminfo.tickerid, HTFres, ema(HTFxEMA2, HTFxLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFxnRes = (3 * HTFxEMA1) - (3 * HTFxEMA2) + HTFxEMA3
HTFxnResP = plot(HTFxnRes, color=color.yellow, linewidth=1,transp=30, title="TEMA1")

HTFyLength = input(15, minval=1, title="HTF Slow Length")
HTFyPrice = close
HTFyEMA1 = security(syminfo.tickerid, HTFres, ema(HTFyPrice, HTFyLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFyEMA2 = security(syminfo.tickerid, HTFres, ema(HTFyEMA1, HTFyLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFyEMA3 = security(syminfo.tickerid, HTFres, ema(HTFyEMA2, HTFyLength), barmerge.gaps_off, barmerge.lookahead_on)
HTFynRes = (3 * HTFyEMA1) - (3 * HTFyEMA2) + HTFyEMA3
HTFynResP = plot(HTFynRes, color=color.purple, linewidth=1, transp=30, title="TEMA2")

fill(HTFxnResP, HTFynResP, color=HTFxnRes > HTFynRes ? color.yellow : color.purple, transp=90, editable=true)
bgcolor(HTFxnRes > HTFynRes ? color.yellow : na, transp=90, editable=true)
bgcolor(HTFxnRes < HTFynRes ? color.purple : na, transp=90, editable=true)

// }

// Buy and Sell Triggers
LongEntryAlert = xnRes > ynRes and HTFxnRes > HTFynRes and window()
LongCloseAlert = xnRes < ynRes and window()
ShortEntryAlert = xnRes < ynRes and HTFxnRes < HTFynRes and window()
ShortCloseAlert = xnRes > ynRes

// Entry & Exit signals
if isLong
    strategy.entry("Long", strategy.long, when = LongEntryAlert)
    strategy.close("Long", when = LongCloseAlert)

if isShort
    strategy.entry("Short", strategy.short, when = ShortEntryAlert)
    strategy.close("Short", when = ShortCloseAlert)

Plus de