Momentum-Trend-Tracking-Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-07 16:49:49
Tags:

img

Übersicht

Diese Strategie basiert auf der Trendanalyse von gleitenden Durchschnitten und Volumen, legt Dynamikindikatoren fest und führt Kauf- und Verkaufsaktionen durch Trends.

Strategieprinzipien

  1. Berechnung der EMA des Schlusskurses und der kumulativen EMA des Volumens
  2. Wenn der Schlusskreuz über der EMA liegt, wird er als Aufwärtstrend beurteilt und eine Long-Position eingenommen.
  3. Bei fortlaufendem Anstieg, schließen Kreuzungen über das 2-fache der kumulierten EMA, hinzufügen zu Long Position
  4. Einstellung des RSI-Indikators, wenn der RSI 90 übersteigt, Schließung der 1/3-Position für die Gewinnnahme
  5. Wenn der Schlusskurs unterhalb der EMA liegt, wird er als Abwärtstrend beurteilt. Alle Longpositionen werden geschlossen.
  6. Wenn der Schlusskurs unterhalb der EMA liegt, wird er als Abwärtstrend beurteilt, und man nimmt eine Leerposition ein.
  7. Festlegung der Stop-Loss-Linie zu einem festen Prozentsatz des Einstiegspreises
  8. Die Gewinnentnahme einer Short-Position ist die gleiche wie bei einer Long-Position

Analyse der Vorteile

Die wichtigsten Vorteile dieser Strategie sind:

  1. Die Verwendung der EMA zur Beurteilung von Trends kann Trends wirksam verfolgen
  2. Verwendung der kumulativen EMA des Volumens zur Beurteilung der tatsächlichen Trendänderungen
  3. Indikator für die Verfolgung der Dynamik RSI für die Gewinnentnahme
  4. Gute Risikokontrolle mit Stop-Loss
  5. Kann sich an verschiedene Marktbedingungen anpassen, die Parameter können flexibel angepasst werden

Risikoanalyse

Die wichtigsten Risiken dieser Strategie sind:

  1. Die EMA ist zurückgeblieben, kann Wendepunkte verpassen
  2. Volumen spiegelt möglicherweise nicht immer den tatsächlichen Trend wider
  3. Festverzinsung kann zu mechanistisch sein
  4. Zu viele Parameter erschweren die Einstellung von Parametern
  5. Hohe Handelsfrequenz führt zu hohen Handelskosten

Risikolösungen:

  1. Optimierung der EMA-Parameter zur Verringerung der Verzögerungen
  2. Kombination mit anderen Indikatoren zur Bestätigung der Lautstärksignale
  3. Optimierung der Stop-Loss-Punkte basierend auf den Marktbedingungen
  4. Vereinfachen Sie die Parameter, halten Sie nur die Haupt-Einstellungen
  5. Entspannen Sie den Stop-Loss und die Handelsfrequenz angemessen

Optimierungsrichtlinien

Diese Strategie kann in folgenden Aspekten optimiert werden:

  1. Versuche verschiedene EMA-Parameter Einstellungen, um eine optimale Kombination zu finden
  2. Zusätzliche Lautstärkungsmultiplikatoren als Beurteilung der Signalstärke für die Eingabe
  3. Kombination mit MACD, KD und anderen Indikatoren zur Bestätigung des Eintritts
  4. Optimierung des Stop-Loss-Prozentsatzes entsprechend den Merkmalen bestimmter Bestände
  5. Optimierung der Handelshäufigkeit zur Senkung der Handelskosten

Zusammenfassung

Zusammenfassend ist dies eine Trendverfolgungsstrategie, die auf einem gleitenden Durchschnittssystem basiert. Die Kernidee besteht darin, die EMA zu verwenden, um die Trendrichtung zu bestimmen und den Eintritt mit dem VOLUME-Impulsindikator zu bestätigen. Es kann durch Parameter-Tuning kontinuierlich optimiert und durch andere Indikatoren zur weiteren Bestätigung unterstützt werden. Insgesamt ist es eine flexible Trendverfolgungsstrategie, die nach kompetentem Einsatz gute Renditen erzielen kann.


/*backtest
start: 2023-10-30 00:00:00
end: 2023-11-06 00:00:00
period: 5m
basePeriod: 1m
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("EMA_cumulativeVolume_crossover[Strategy]", overlay=true, pyramiding=5, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(25, title="EMA Length", minval=1, maxval=200)
cumulativePeriod = input(100,  title="cumulative volume Period", minval=1, maxval=200)


riskCapital = input(title="Risk % of capital", defval=10, minval=1)
stopLoss=input(8,title="Stop Loss",minval=1)
takePartialProfits=input(true, title="take partial profits  (percentage same as stop loss)")

tradeDirection=input(title="Trade Direction", defval="LONG", options=["LONG", "SHORT"])

avgPrice = (high + low + close) / 3
avgPriceVolume = avgPrice * volume

cumulPriceVolume = sum(avgPriceVolume, cumulativePeriod)
cumulVolume = sum(volume, cumulativePeriod)

cumValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

emaCumValue1=ema(cumValue, emaLength)
emaCumValue2=ema(cumValue, emaLength*2)

emaCumValueHistory=ema(cumValue[emaLength], emaLength)


//vwapVal1=vwap(hlc3)

rsiVal=rsi(close,5)

plotEma=plot(emaVal, title="EMA", color=color.green,  transp=25)
//plot(vwapValue, title="Cumulate Volumne", color=color.orange,  linewidth=2, transp=25)
//plot(vwapVal1, title="vwapVal1", color=color.purple,  linewidth=1, transp=25)
plotCum=plot(emaCumValue1, title="emaVwapValue", color=color.purple,  linewidth=2, transp=35)
plot(emaCumValue2, title="emaVwapValue", color=color.yellow,  linewidth=3, transp=25)
fill(plotEma,plotCum, color=emaVal>emaCumValue1 ? color.lime : color.red, transp=35, title="ema and cum area")

plot(emaCumValueHistory, title="emaCumValueHistory", color=color.black,  linewidth=2, transp=25)



//bgcolor(emaVal>vwapValue?color.blue:color.purple)    

//Entry--
//Echeck how many units can be purchased based on risk manage ment and stop loss
qty1 = (strategy.equity  * riskCapital / 100 ) /  (close*stopLoss/100)  

//check if cash is sufficient  to buy qty1  , if capital not available use the available capital only
qty1:= (qty1 * close >= strategy.equity ) ? (strategy.equity / close) : qty1

//strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=crossover(emaVal, vwapValue)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

strategy.entry(id="LE",comment="LE", long=true, qty=qty1, when=strategy.position_size==0 and crossover(emaVal, emaCumValue1)  and (tradeDirection=="LONG") )    //emaVal>vwapValue and crossover(close , emaVal)

//re-entry
rentryCondition1=strategy.position_size>1 and emaVal > emaCumValue1 and emaCumValue1>emaCumValue2 and crossover(close, emaCumValue2) and close>open and  (tradeDirection=="LONG")
strategy.entry(id="LE",comment="LE RE", long=true, qty=qty1, when=rentryCondition1 )

rentryCondition2=strategy.position_size>1 and emaVal > emaCumValue1 and emaCumValue1>emaCumValueHistory and crossover(close, emaCumValueHistory) and close>open and  (tradeDirection=="LONG")
//strategy.entry(id="LE",comment="LE RE", long=true, qty=qty1, when=rentryCondition2 )    


//stoploss
stopLossVal=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00

//draw initil stop loss
//plot(strategy.position_size>=1 ? stopLossVal : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
takeProfit=  strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(1*0.01) )) : ( close[1] * 2 )
//if(takePartialProfits==true)
    //strategy.close(id="LE", comment="Partial"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and close>takeProfit and crossunder(close, emaVal) )    //close<close[1] and close[1]<close[2] and close[2]<close[3])

strategy.close(id="LE", comment="PExit Points=>"+tostring(close-strategy.position_avg_price, "###.##") , qty=strategy.position_size/3 , when = (tradeDirection=="LONG" ) and  takePartialProfits == true and close>=takeProfit and crossunder(rsiVal,90) )

profitVal=    strategy.position_size>=1 ?  (strategy.position_avg_price * (1+(1*0.01) )) : ( close[1] * 2 )

//strategy.close(id="LE" , comment="LE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossunder(emaVal, vwapValue) and (tradeDirection=="LONG") )

strategy.close(id="LE" , comment="Exit Points=>"+tostring(close-strategy.position_avg_price, "###.##"), when=  crossunder(emaVal, emaCumValue1) and (tradeDirection=="LONG") )


strategy.close(id="LE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= close < stopLossVal   and (tradeDirection=="LONG") )


//for short  you dont have to wait crossodown of ema, falling is speed , so just check if close crossing down vwapVal
strategy.entry(id="SE",comment="SE", long=false, qty=qty1, when=crossunder(emaVal, emaCumValue1) and (tradeDirection=="SHORT") )    //emaVal>vwapValue and crossover(close , emaVal)


//stoploss
stopLossValUpside=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1+(stopLoss*0.01) )) : 0.00

//draw initil stop loss
//plot(abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ? stopLossValUpside : na, color = color.purple , style=plot.style_linebr,  linewidth = 2, title = "stop loss")

//partial exits
shortTakeProfit=  abs(strategy.position_size)>=1 and tradeDirection=="SHORT" ?  (strategy.position_avg_price * (1-(stopLoss*0.01) )) : 0.00
if(takePartialProfits==true)
    strategy.close(id="SE", comment="Partial" , qty=strategy.position_size/3 , when = (tradeDirection=="SHORT"   ) and  crossover(rsiVal,15) )  //close<takeProfit and (emaVal - close)>8 )
  
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossover(emaVal, vwapValue) and (tradeDirection=="SHORT") )
//strategy.close(id="SE" , comment="SE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and ( (emaVal<emaCumValue1 and close>emaCumValue1 and open>emaCumValue1 and close>open )   or (crossover(emaVal,emaCumValue1))  ) and (tradeDirection=="SHORT") )

//strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  close > stopLossValUpside   and (tradeDirection=="SHORT"   ) )
strategy.close(id="SE" , comment="SL Exit Loss="+tostring(close-strategy.position_avg_price, "###.##"), when= abs(strategy.position_size)>=1 and  crossover(emaVal, emaCumValue1)   and (tradeDirection=="SHORT"   ) )



Mehr