Stratégie de négociation de tendance basée sur une moyenne mobile dynamique

Auteur:ChaoZhang est là., Date: 2023-12-21 à 11h33.50
Les étiquettes:

img

Résumé

Cette stratégie génère des signaux de trading basés sur la moyenne mobile dynamique pour aller long lorsque les cours des actions augmentent et fermer des positions lorsque les prix baissent.

Principe

La stratégie s'appuie principalement sur trois variantes de HMA (Hull Moving Average) HMA régulière, HMA pondérée (WHMA) et HMA exponentielle (EHMA).

La formule de l'HMA est la suivante:

L'équipement doit être équipé d'un système de contrôle de la circulation des marchandises.

L'HMA répond plus rapidement aux changements de prix que l'SMA.

Les formules pour WHMA et EHMA sont similaires.

Après avoir calculé le HMA, la stratégie utilise la valeur de la ligne médiane du HMA comme signaux de trading. Elle va long lorsque le prix traverse au-dessus de la ligne médiane du HMA et ferme les positions lorsque le prix tombe en dessous de la ligne. Ainsi, elle suit les tendances à moyen terme en utilisant la ligne médiane du HMA pour les bénéfices.

Les avantages

Comparée aux stratégies traditionnelles d'AM, cette stratégie présente les avantages suivants:

  1. Une réponse plus rapide et une meilleure capacité de suivi des tendances pour des entrées et des arrêts en temps opportun
  2. Réduction de la fréquence des échanges inutiles, évitant de courir après les hausses et les arrêts
  3. Paramètres flexibles de l'AMH pour s'adapter à un plus grand nombre d'environnements de marché
  4. Variantes HMA commutables pour élargir l'applicabilité

Les risques

Il y a aussi des risques:

  1. Génération de multiples faux signaux sur les marchés à plage, augmentation de la fréquence des transactions et des coûts de glissement
  2. Manque de points d'inversion de tendance si les paramètres HMA ne sont pas correctement définis, ce qui entraîne des risques de perte plus élevés
  3. Risque de liquidité et dérapage énorme lors de la négociation d'actions à faible liquidité

Les solutions:

  1. Optimiser les paramètres HMA pour obtenir les meilleures valeurs
  2. Ajouter d'autres indicateurs pour déterminer les points d'inversion de tendance
  3. Sélectionner les stocks liquides dont le volume moyen quotidien est élevé

Améliorations

La stratégie peut également être améliorée par les aspects suivants:

  1. Ajouter du volume ou d'autres filtres pour assurer la fiabilité du signal
  2. Combinez MACD, KDJ pour un meilleur timing, améliorer le taux de victoire
  3. Adaptation des périodes d'HMA sur la base des tests de retour réalisés dans le commerce réel
  4. Passer à la WHMA ou à la EHMA ayant les meilleures performances pour des stocks spécifiques
  5. Ajouter des mécanismes de stop loss pour contrôler les pertes d'une seule transaction

Résumé

La stratégie de négociation dynamique de MA intègre la réponse rapide de HMA pour suivre efficacement les tendances des prix à moyen terme. En ouvrant des positions longues à des moments appropriés et en fermant des arrêts, elle a démontré de bons résultats de backtest. Des améliorations supplémentaires dans le réglage des paramètres et le filtrage des stocks conduiraient à des rendements excédentaires plus stables. C'est une stratégie quantitative facile à mettre en œuvre et contrôlable par le risque.


/*backtest
start: 2022-12-14 00:00:00
end: 2023-12-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Position Investing by SirSeff', overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_order_fills=false, slippage=0, commission_type=strategy.commission.percent, commission_value=0)
strat_dir_input = input.string(title='Strategy Direction', defval='long', options=['long', 'short', 'all'])
strat_dir_value = strat_dir_input == 'long' ? strategy.direction.long : strat_dir_input == 'short' ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2000, 'Backtest Start Year')
testStartMonth = input(1, 'Backtest Start Month')
testStartDay = input(1, 'Backtest Start Day')
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, 'Backtest Stop Year')
testStopMonth = input(12, 'Backtest Stop Month')
testStopDay = input(30, 'Backtest Stop Day')
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)


testPeriod() => true
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title='Source')
modeSwitch = input.string('Hma', title='Hull Variation', options=['Hma', 'Thma', 'Ehma'])
length = input(55, title='Length(180-200 for floating S/R , 55 for swing entry)')
switchColor = input(true, 'Color Hull according to trend?')
candleCol = input(false, title='Color candles based on Hull\'s Trend?')
visualSwitch = input(true, title='Show as a Band?')
thicknesSwitch = input(1, title='Line Thickness')
transpSwitch = input.int(40, title='Band Transparency', step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>
    ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>
    ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
//THMA    
THMA(_src, _length) =>
    ta.wma(ta.wma(_src, _length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length)

//SWITCH
Mode(modeSwitch, src, len) =>
    modeSwitch == 'Hma' ? HMA(src, len) : modeSwitch == 'Ehma' ? EHMA(src, len) : modeSwitch == 'Thma' ? THMA(src, len / 2) : na

//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? HULL > HULL[2] ? #00ff00 : #ff0000 : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title='MHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title='SHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title='Band Filler', color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color=candleCol ? switchColor ? hullColor : na : na)


if HULL[0] > HULL[2] and testPeriod()
    strategy.entry('Invest', strategy.long)
if HULL[0] < HULL[2] and testPeriod()
    strategy.entry('Pause', strategy.short)



Plus de