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.
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
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.
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.
Angesichts der vorstehenden Risiken kann diese Strategie in folgenden Aspekten optimiert werden:
Kombination von Volatilitätsindikatoren zur dynamischen Anpassung von Positionen anhand der Marktvolatilität.
Erhöhung der Beurteilung von Trendindikatoren, um unnötigen Umkehrhandel zu vermeiden.
Optimierung der gleitenden Durchschnittsparameter, um sie den aktuellen Marktmerkmalen näher zu bringen.
Verwenden Sie Zeitstopp, um übergroße Einzelverluste zu vermeiden.
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