Momentum Moving Average Konsolidierungsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-25 11:39:00
Tags:

img

Übersicht

Diese Strategie verwendet hauptsächlich die Konsolidierung, die durch die gleitenden Durchschnittslinien HMA und EMA gebildet wird, um den Zeitpunkt des Kaufs zu bestimmen.

Die Strategie kombiniert auch den RSI-Indikator, um Überkauf- und Überverkaufszustände zu erkennen.

Strategieprinzip

Diese Strategie verwendet ein gleitendes Durchschnittssystem, das mit 200-Perioden-EMA und HMA konstruiert wurde. Unter ihnen ist der HMA-Indikator ein empfindlicherer gleitender Durchschnittsindikator, der auf EMA basiert. Wenn HMA über die EMA geht, bedeutet dies, dass die Konsolidierungssituation vorbei ist und der Aktienkurs steigt.

Im Falle einer bestehenden Position wird die gesamte Position geschlossen, wenn der Aktienkurs zurückfällt und die HMA wieder unter die EMA fällt, was den Beginn einer neuen Konsolidierung anzeigt.

Die Transaktionslogik dieser Strategie ist recht einfach und beruht hauptsächlich auf den langen und kurzen Kreuzungen von HMA und EMA, kombiniert mit den Höhen und Tiefen des RSI, um eine relativ robuste Handelsstrategie zu bilden.

Analyse der Vorteile

Der größte Vorteil dieser Strategie besteht darin, dass durch die Nutzung des Konsolidierungshandelsmusters von EMA und HMA die meisten False Breaks herausgefiltert werden können, wodurch die Gewinnrate verbessert wird. Gleichzeitig kann das Hilfsmittel des RSI-Indikators auch Risiken effektiv kontrollieren. Die Kombination der beiden macht diese Strategie sehr geeignet für Konsolidierung und Volatilitätsmärkte.

Darüber hinaus verwendet diese Strategie nur 3 Indikatoren und die Logik ist einfach, was die Optimierung von Parametern und Backtests erleichtert, was zur Überprüfung und Verbesserung von Strategien beiträgt.

Risikoanalyse

Obwohl diese Strategie einige Vorteile hat, gibt es immer noch einige Risiken zu beachten. Zum Beispiel kann die Haltedauer relativ lang sein und ausreichende Mittel zur Unterstützung erfordern. Wenn sie auf eine Periode der seitlichen Konsolidierung stößt, kann sie nicht schnell mit einem Stop-Loss aussteigen, was leicht zu einer Situation der Ausweitung von Verlusten führt.

Darüber hinaus stützt sich diese Strategie hauptsächlich auf gleitende Durchschnittsindikatoren. Wenn es einen abnormalen Preisdurchbruch gibt, können Stop-Loss-Maßnahmen möglicherweise nicht wirksam werden, was größere Risiken mit sich bringt. Darüber hinaus beeinflussen Parameter-Einstellungen auch die Strategieleistung und erfordern umfangreiche Tests, um optimale Parameter zu finden.

Optimierungsrichtlinien

Angesichts der vorstehenden Risiken kann diese Strategie in folgenden Aspekten optimiert werden:

  1. Kombination von Volatilitätsindikatoren zur dynamischen Anpassung von Positionen anhand der Marktvolatilität.

  2. Erhöhung der Beurteilung von Trendindikatoren, um unnötigen Umkehrhandel zu vermeiden.

  3. Optimierung der gleitenden Durchschnittsparameter, um sie den aktuellen Marktmerkmalen näher zu bringen.

  4. Verwenden Sie Zeitstopp, um übergroße Einzelverluste zu vermeiden.

Zusammenfassung

Insgesamt handelt es sich um eine relativ klassische einfache Konsolidierungs- und Volatilitätsstrategie. Sie wird hauptsächlich für den kurz- und mittelfristigen Handel mit Aktienindizes und Hot Stocks eingesetzt und kann relativ stabile Alpha-Werte erzielen. Mit der Optimierung der Parameter und der Stärkung der Risikokontrollmaßnahmen hat die Leistung dieser Strategie noch viel Verbesserungspotenzial.


/*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
    

Mehr