Stratégie de trading quantitative bidirectionnelle avec croisement EMA


Date de création: 2024-01-24 17:31:41 Dernière modification: 2024-01-24 17:31:41
Copier: 0 Nombre de clics: 314
1
Suivre
1166
Abonnés

Stratégie de trading quantitative bidirectionnelle avec croisement EMA

Aperçu

Cette stratégie utilise l’indicateur EMA bidirectionnel pour déterminer la direction de la tendance principale du marché, et est associée à l’indicateur RSI comme option de timing d’entrée. Elle appartient à la stratégie de trading d’algorithme de type suivi de tendance.

Principe de stratégie

  1. Calculer les moyennes des EMA de plusieurs groupes de différentes périodes et identifier les principales tendances du marché en trois dimensions: à court, moyen et long terme
  2. Quand une EMA à court terme dépasse une EMA à moyen et à long terme, elle est considérée comme une tendance haussière.
  3. Lorsque l’EMA à court terme est inférieure à l’EMA à moyen terme, elle est considérée comme une tendance baissière.
  4. Le RSI, combiné à l’indicateur RSI, peut être utilisé pour déterminer les zones de sur-achat et de sur-vente.
  5. Dans une tendance haussière, l’indicateur RSI est plus long lorsque l’indicateur est bas; dans une tendance baissière, l’indicateur RSI intervient lorsque l’indicateur est élevé

Cette stratégie utilise principalement deux indicateurs EMA pour déterminer la direction de la tendance principale et utilise l’indicateur RSI comme signal d’entrée.

Analyse des forces stratégiques

Le plus grand avantage de cette stratégie réside dans la capacité de déterminer clairement la direction des principales tendances du marché et de choisir le meilleur moment d’entrée en fonction de l’indicateur RSI. Les avantages spécifiques sont les suivants:

  1. Utilisation de plusieurs ensembles de courbes d’EMA pour identifier les principales tendances du marché dans plusieurs dimensions temporelles
  2. L’indicateur EMA est simple à calculer, moins bruyant et plus fiable pour déterminer les principales tendances du marché
  3. L’indicateur RSI permet d’identifier efficacement les points d’entrée et de rupture, ce qui permet d’optimiser considérablement le ratio de récupération des gains et des pertes de la stratégie
  4. L’algorithme est structuré de manière claire, facile à comprendre et modifiable, ce qui est typique des stratégies de suivi de tendance.
  5. La flexibilité d’intégrer d’autres indicateurs techniques pour améliorer encore l’efficacité de la stratégie

Analyse stratégique des risques

Cette stratégie comporte également des risques, principalement dans les domaines suivants:

  1. Les points de rupture peuvent être trop idéalisés pour augmenter les pertes en cas de reprise de la tendance
  2. L’incapacité à évaluer efficacement le point de basculement de la tendance peut entraîner la perte d’une opportunité de sortie en temps opportun.
  3. Les paramètres EMA et RSI doivent être testés et optimisés à plusieurs reprises, sans quoi ils peuvent être instables
  4. Il n’y a pas de garantie que chaque entrée soit parfaitement synchronisée et il peut y avoir des opérations répétitives inutiles.
  5. Les sauts d’avion massifs sous l’effet d’un événement soudain sont difficiles à éviter efficacement

Les risques mentionnés ci-dessus peuvent être optimisés de la manière suivante:

  1. Il est important de définir des points de rupture raisonnables pour éviter des pertes excessives.
  2. Ajout d’autres indicateurs pour déterminer le renversement de tendance et assurer un arrêt des pertes en temps opportun
  3. Optimisation de la palette de paramètres pour une utilisation dans un marché plus large
  4. Modification de la logique d’entrée et d’arrêt pour réduire le nombre de répétitions
  5. Augmenter le jugement sur les situations exceptionnelles et éviter les effets négatifs des sauts de marché

Orientation de l’optimisation de la stratégie

En analysant les avantages et les risques de cette stratégie, nous pouvons tirer les conclusions suivantes:

  1. L’introduction d’autres indicateurs tels que le MACD, le BOLL et d’autres peuvent être utilisés pour déterminer le point de retournement de la tendance et ainsi optimiser les stratégies de stop-loss
  2. L’introduction de modèles d’apprentissage automatique pour prédire la probabilité d’un renversement de tendance améliore encore l’efficacité de la stratégie
  3. L’application de filtres avancés permet d’identifier automatiquement les situations anormales et de prévenir les pertes
  4. Utiliser des algorithmes génétiques, l’apprentissage en profondeur et d’autres méthodes pour optimiser automatiquement les paramètres et adapter les stratégies à plus de types de marchés
  5. Ajout d’un module d’arrêt automatique permettant d’ajuster dynamiquement le point d’arrêt en fonction de la situation réelle

Cette stratégie peut être encore améliorée par l’introduction de plus d’indicateurs, de modèles de prévision, d’optimisation de paramètres et de modules de contrôle des risques, afin de pouvoir s’adapter à des conditions de marché plus complexes et plus variables.

Résumer

Cet article présente en détail les principaux éléments d’une stratégie de trading quantifié bidirectionnel EMA croisée. Tout d’abord, un aperçu des principales idées et principes de fonctionnement de la stratégie. Ensuite, une analyse complète des avantages de la stratégie.

Code source de la stratégie
/*backtest
start: 2023-01-23 00:00:00
end: 2024-01-23 00:00:00
period: 4h
basePeriod: 15m
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/
// © Investoz
// Indikatorn är byggd som ett utbildningsyfte och är därför ingen rekommendation för köp/sälj av aktier. Tanken är att skapa en visuell form i en graf
// som visar om det finns någon trend såväl positiv som negativ. En dialogruta med en varning talar om vilken trend som råder. I koden finns en möjlighet
// att ta position eller gå ur position om man vill skapa en startegi kring denna trendindikator. Rekommenderar dock starkt att inte enbart förlita sig på denna
// indikator som beslut för köp/sälj då resultaten blir negativa om man köper på psoitiv trend och säljer på negativ trend. Det måste kombineras med andra idéer
// och därför fungerar denna skript mer som ett komplement till sin egen strategi.
// Det är fritt fram för vem som helst att använda sig av denna indikator.  
//@version=4
//Skapar en strategiskript med 5 % av eget kapital som ett exempel. Detta går att ändra i skriptets inställningar, välj egenskaper och sedan ändra orderstorlek
//till ett annat värde av % på eget kapital.
strategy("© Investoz trendvarningar", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=5)
//Lägger till inmatningar till skriptindikatorn. Användaren kan se och redigera inmatningar i objektdialogen efter eget val.
ema1 = input(21, minval=1, maxval=500, title="Lila linje")
valema1=input(true, title="Visa lila linje")
ema2 = input(34, minval=1, maxval=500, title="Blå linje")
valema2=input(true, title="Visa blå linje")
ema3 = input(55, minval=1, maxval=500, title="Grön linje")
valema3=input(true, title="Visa grön linje")
ema4 = input(89, minval=1, maxval=500, title="Gul linje")
valema4=input(true, title="Visa gul linje")
ema5 = input(141, minval=1, maxval=500, title="Orange linje")
valema5=input(true, title="Visa orange linje")
ema6 = input(230, minval=1, maxval=500, title="Röd linje")
valema6=input(true, title="Visa röd linje")
ema7 = input(371, minval=1, maxval=500, title="Röd linje")
valema7=input(true, title="Visa röd linje")
//Inmatningar för antal staplar
startbar = input(1, minval=1, maxval=1, title="Första stapeln")
Endbar = bar_index
//Källa input, stängning. Användaren kan själv byta till vilken källa som önskas.
src = input(close, title="Source")
//Antal staplar sedan den längsta ema började och framåt. 
tid=Endbar + startbar - 371
//EMA loop
aema1 = ema(src, ema1)
bema2 = ema(src, ema2)
cema3 = ema(src, ema3)
dema4 = ema(src, ema4)
eema5 = ema(src, ema5)
fema6 = ema(src, ema6)
gema7 = ema(src, ema7)
//Skriver ut linjer i diagrammet om förhållandet är sant, annars falskt.
h=plot(valema1 ? aema1 : na, title="Lila linje", style=plot.style_line, linewidth=1, color=color.purple)
i=plot(valema2 ? bema2 : na, title="Blå linje", style=plot.style_line, linewidth=1, color=color.blue)
j=plot(valema3 ? cema3 : na, title="Grön linje", style=plot.style_line, linewidth=1, color=color.green)
k=plot(valema4 ? dema4 : na, title="Gul linje", style=plot.style_line, linewidth=1, color=color.yellow)
l=plot(valema5 ? eema5 : na, title="Orange linje", style=plot.style_line, linewidth=1, color=color.orange)
m=plot(valema6 ? fema6 : na, title="Röd linje", style=plot.style_line, linewidth=1, color=color.red)
n=plot(valema7 ? gema7 : na, title="Brun linje", style=plot.style_line, linewidth=1, color=color.maroon)
//Fyller bakgrunden mellan två linjer med en viss färg.
fill(h, i, color = color.purple,transp=34)
fill(i, j, color = color.blue,transp=34)
fill(j, k, color = color.green,transp=34)
fill(k, l, color = color.yellow,transp=34)
fill(l, m, color = color.orange,transp=34)
fill(m, n, color = color.red,transp=34)
//Skapa en algoritm för positiv trend
PositivTrend = crossover(aema1,gema7)?1:0
TrendPositiv = ema(close,1) > aema1 and aema1 > bema2?1:0
//Skapa en algoritm för negativ trend
NegativTrend = crossunder(aema1,gema7)?1:0
TrendNegativ = ema(close,1) < aema1 and aema1 < bema2?1:0
//Skapar en textruta med varningstext för positiv trend
varningtextpositiv = "Varning för positiv trend."+"\n" + "Leta efter att ta position!"
// if PositivTrend
//     varningpositiv=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.green,
//      text=varningtextpositiv,
//      style=label.style_label_down,
//      textalign=text.align_left)
//Skapar en textruta med varningstext för negativ trend
varningtextnegativ = "Varning för negativ trend."+"\n" + "Leta efter utgången!"
// if NegativTrend
//     varningnegativ=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.red,
//      text=varningtextnegativ,
//      style=label.style_label_up,
//      textalign=text.align_left)
//Köp om positiv trend
if (PositivTrend) 
    strategy.entry("Ta position", strategy.long, when = PositivTrend)
//Sälj om negativ trend
if (NegativTrend)
    strategy.close("Ta position", when = NegativTrend, comment="Gå ur position")
//Beräkning av positiv trend
vspositiv(positiv)=>valuewhen(Endbar==startbar,positiv,0)
vepositiv(positiv)=>valuewhen(Endbar==Endbar,positiv,0)
positivmean(TrendPositiv)=>
    csumpositiv = cum(TrendPositiv)
//Slut//   
    a = vepositiv(csumpositiv)
//Start//
    b = vspositiv(csumpositiv)
//Slut - Start// 
    (a - b)/(tid)
positivmeanpositiv = positivmean(TrendPositiv) 
//Beräkning av negativ trend
vsnegativ(negativ)=>valuewhen(Endbar==startbar,negativ,0)
venegativ(negativ)=>valuewhen(Endbar==Endbar,negativ,0)
negativmean(TrendNegativ)=>
    csumnegativ = cum(TrendNegativ)
//Slut//   
    a = venegativ(csumnegativ)
//Start//
    b = vsnegativ(csumnegativ)
//Slut - Start// 
    (a - b)/(tid)
negativmeannegativ = negativmean(TrendNegativ) 
//Inmatning av text som ska in i texruta som visar antal staplar i trend
logga = "© Investoz: Trend i tid"+ "\n"
streck = "--------------------------------------------------------"
totalastaplar = "\n" + "Dagar totalt: " + tostring(tid)+ " dagar "+"\n"+ streck + "\n"
totalpositiv = "Dagar totalt i positiv trend "+" 📈 : "  +tostring(positivmeanpositiv*tid, "##.##") +" dagar " + "\n"
totalnegativ = "\n" + "Dagar totalt i negativ trend" + " 📉 : "  +tostring(negativmeannegativ*tid, "##.##") +" dagar " 
//Textruta för antal staplar i trend
// if barstate.ishistory
//     barcountlbl=label.new(
//      bar_index, 
//      low,  
//      xloc=xloc.bar_index, 
//      yloc=yloc.price,
//      color=color.black, 
//      textcolor=color.yellow,
//      text=logga+streck+totalastaplar+totalpositiv+streck+totalnegativ,
//      style=label.style_label_lower_left,
//      textalign=text.align_left)
//     label.delete(barcountlbl[1])
//////////////////////////////////