Stratégie de consolidation de la moyenne mobile dynamique

Auteur:ChaoZhang est là., Date: 2024-01-25 à 11h39
Les étiquettes:

img

Résumé

Cette stratégie utilise principalement la consolidation formée par les lignes moyennes mobiles HMA et EMA pour déterminer le moment de l'achat.

La stratégie combine également l'indicateur RSI pour détecter les conditions de surachat et de survente.

Principe de stratégie

Cette stratégie utilise un système de moyenne mobile construit avec 200 périodes EMA et HMA. Parmi eux, l'indicateur HMA est un indicateur de moyenne mobile plus sensible conçu sur la base de EMA. Lorsque HMA traverse au-dessus de EMA, cela signifie que le stade de consolidation est terminé et que le prix de l'action commence à augmenter.

Dans le cas d'une position existante, si le cours de l'action chute et que le HMA franchit à nouveau le seuil inférieur à l'EMA, ce qui indique le début d'une nouvelle consolidation, l'ensemble de la position sera fermé.

La logique de transaction de cette stratégie est assez simple, s'appuyant principalement sur les croisements longs et courts de HMA et EMA, combinés aux hauts et bas du RSI, pour former une stratégie de trading relativement robuste.

Analyse des avantages

Le plus grand avantage de cette stratégie est qu'en utilisant le modèle de négociation de consolidation de l'EMA et de l'HMA, la plupart des faux écarts peuvent être filtrés, améliorant ainsi le taux de profit.

En outre, cette stratégie n'utilise que 3 indicateurs et la logique est simple, ce qui facilite l'optimisation des paramètres et le backtest, ce qui favorise la vérification et l'amélioration des stratégies.

Analyse des risques

Bien que cette stratégie présente certains avantages, il y a encore quelques risques à noter. Par exemple, le temps de détention peut être relativement long, nécessitant suffisamment de fonds pour le soutenir. Si elle rencontre une période de consolidation latérale, elle ne peut pas sortir rapidement avec un stop loss, ce qui conduit facilement à une situation de pertes croissantes.

En outre, cette stratégie repose principalement sur des indicateurs de moyenne mobile. S'il y a une percée anormale des prix, les mesures de stop-loss peuvent ne pas être en mesure d'avoir effet, ce qui entraînera des risques plus importants. En outre, les paramètres affectent également les performances de la stratégie et nécessitent des tests approfondis pour trouver des paramètres optimaux.

Directions d'optimisation

Compte tenu des risques susmentionnés, cette stratégie peut être optimisée dans les aspects suivants:

  1. Combiner les indicateurs de volatilité pour ajuster dynamiquement les positions en fonction de la volatilité du marché.

  2. Augmenter les jugements sur les indicateurs de tendance afin d'éviter des opérations de renversement inutiles.

  3. Optimiser les paramètres des moyennes mobiles pour les rapprocher des caractéristiques actuelles du marché.

  4. Utilisez des temps d'arrêt pour éviter des pertes individuelles de taille excessive.

Résumé

Dans l'ensemble, il s'agit d'une stratégie de consolidation et de volatilité relativement simple et classique. Elle est principalement utilisée pour la négociation à court et moyen terme d'indices boursiers et de stocks chauds, et peut obtenir des valeurs alpha relativement stables.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
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/
// © mohanee

//@version=4
strategy(title="EMA_HMA_RSI_Strategy", overlay=true, pyramiding=2,     default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD)  //default_qty_value=10, default_qty_type=strategy.fixed, 

//longCondition = crossover(sma(close, 14), sma(close, 28))
//if (longCondition)
    //strategy.entry("My Long Entry Id", strategy.long)

//shortCondition = crossunder(sma(close, 14), sma(close, 28))
//if (shortCondition)
  //  strategy.entry("My Short Entry Id", strategy.short)

//HMA
HMA(src1, length1) =>  wma(2 * wma(src1, length1/2) - wma(src1, length1), round(sqrt(length1)))

var stopLossVal=0.00

//variables BEGIN
length=input(200,title="EMA and HMA Length")   //square root of 13

rsiLength=input(13, title="RSI Length")

takePartialProfits = input(true, title="Take Partial Profits (if this selected, RSI 13 higher reading over 80 is considered for partial closing ) ")

stopLoss = input(title="Stop Loss%", defval=8, minval=1)
//variables  END

//RSI 
rsi13=rsi(close,rsiLength)


ema200=ema(close,length)
hma200=HMA(close,length)

//exitOnAroonOscCrossingDown = input(true, title="Exit when Aroon Osc cross down zero ")


// Drawings

//Aroon oscillator

arronUpper = 100 * (highestbars(high, length+1) + length)/length
aroonLower = 100 * (lowestbars(low, length+1) + length)/length

aroonOsc  = arronUpper - aroonLower

aroonMidpoint = 0
//oscPlot = plot(aroonOsc, color=color.green)
//midLine= plot(aroonMidpoint, color=color.green)
//topLine = plot(90,style=plot.style_circles, color=color.green)
//bottomLine = plot(-90,style=plot.style_circles, color=color.red)

//fill(oscPlot, midLine, color=aroonOsc>0?color.green:color.red, transp=50)
//fill(topLine,bottomLine, color=color.blue)
//fill(topLine,oscPlot, color=aroonOsc>90?color.purple:na, transp=25)


// RSI 
//plot(rsi13, title="RSI", linewidth=2, color=color.purple)
//hline(50, title="Middle Line", linestyle=hline.style_dotted)
//obLevel = hline(80, title="Overbought", linestyle=hline.style_dotted)
//osLevel = hline(30, title="Oversold", linestyle=hline.style_dotted)
//fill(obLevel, osLevel, title="Background", color=rsi13 >=30 ? color.green:color.purple, transp=65)  // longTermRSI >=50

hullColor = hma200 > hma200[2] ? #00ff00 : #ff0000

plot(hma200, title="HULL 200", color=hullColor,  transp=25)
plot(ema200, title="EMA 200", color=color.orange)

//Entry--
strategy.initial_capital = 50000
strategy.entry(id="Long Entry", comment="LE", qty=(strategy.initial_capital * 0.10)/close, long=true,  when=strategy.position_size<1 and hma200 < ema200   and  hma200 > hma200[2]  and rsi13<70 )     //  // aroonOsc<0

//Add
if(strategy.position_size>=1 and  close < strategy.position_avg_price and  ( crossover(rsi13,30) or  crossover(rsi13,40) ) )   // hma200 < ema200   and  hma200 > hma200[2]   and hma200[2] < hma200[3] )  //and crossover(rsi13,30)  aroonOsc<0    //and hma200 > hma200[2]  and hma200[2] <= hma200[3]  //crossover(rsi13,30)
    qty1=(strategy.initial_capital * 0.10)/close
    //stopLossVal:= abs(strategy.position_size)>1 ?  ( (close > close[1] and close > open and close>strategy.position_avg_price) ? close[1]*(1-stopLoss*0.01) : stopLossVal ) : 0.00 
    strategy.entry(id="Long Entry", comment="Add", qty=qty1, long=true )     //crossover(close,ema34)  //and close>ema34  //crossover(rsi5Val,rsiBuyLine)  --   SL="+tostring(stopLossVal, "####.##")


//stopLossVal:= abs(strategy.position_size)>1 ? strategy.position_avg_price*(1-0.5) : 0.00 

stopLossVal:= abs(strategy.position_size)>1 ?  ( (close > close[1] and close > open and close>strategy.position_avg_price) ? close[1]*(1-stopLoss*0.01) : stopLossVal ) : 0.00 
//stopLossVal:= abs(strategy.position_size)>1 ?  strategy.position_avg_price*(1-stopLoss*0.01) :  0.00

barcolor(color=strategy.position_size>=1? rsi13>80 ? color.purple: color.blue:na)

//close partial
if(takePartialProfits==true)
    strategy.close(id="Long Entry", comment="Partial X  points="+tostring(close - strategy.position_avg_price, "####.##"),  qty_percent=20 , when=abs(strategy.position_size)>=1 and crossunder(rsi13, 80)  and close > strategy.position_avg_price  )   //close<ema55 and rsi5Val<20 //ema34<ema55



//close All
//if(exitOnAroonOscCrossingDown)
  //  strategy.close(id="Long Entry", comment="Exit All points="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and crossunder(aroonOsc, 0) )   //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89

//close All on stop loss
strategy.close(id="Long Entry", comment="Stoploss X points="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and close < stopLossVal  )  //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89

strategy.close(id="Long Entry", comment="hmaXema X points="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and close > strategy.position_avg_price  and  crossunder(hma200,ema200)  )  //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89
    

Plus de