EMA und kumulative Volumen-Crossover-Strategie für die lang-kurze

Schriftsteller:ChaoZhang, Datum: 2023-09-20 11:48:34
Tags:

Übersicht

Diese Strategie kombiniert die EMA und die kumulativen Volumenindikatoren und erzeugt Kauf- und Verkaufssignale auf der Grundlage ihrer Querschnittssituationen, um Trends zu bestimmen.

Strategie Logik

Die 50-Tage-EMA und die 100-Tage-kumulative Volumenindikatoren werden berechnet. Wenn die EMA über das kumulative Volumen von unten geht, wird ein Kaufsignal generiert, um lang zu gehen. Wenn die EMA unter das kumulative Volumen von oben geht, wird ein Verkaufssignal generiert, um kurz zu gehen.

Während der Positionen werden feste Stop-Loss- und Take-Profit-Strategien implementiert. Der Stop-Loss wird auf 8% unter dem Einstiegspreis festgelegt. Der Take-Profit wird auf 8% über dem Einstiegspreis festgelegt, wobei die Position teilweise geschlossen wird, wenn der Preis das Take-Profit-Niveau erreicht.

Analyse der Vorteile

Die Strategie kombiniert den Trendindikator EMA mit dem kumulativen Volumen des Fondsflussindikators und nutzt sowohl Preis- als auch Volumeninformationen, um mittelfristige Trends effektiv zu identifizieren.

Die EMA-Periode kann für verschiedene Produkte frei angepasst werden. Sowohl lange als auch kurze Trades werden für den linearen Handel implementiert.

Risikoanalyse

Eine übermäßige Abhängigkeit von gleitenden Durchschnitten kann bei der Konsolidierung von Bandbreiten zu Whipsaws führen. Festgewinne und Stop-Loss können auch zu vorzeitigen Exits oder übergroßen Stop-Out führen. Nur Preis- und Volumenfaktoren werden ohne andere Elemente berücksichtigt.

Die Erweiterung der gleitenden Durchschnittsperioden könnte falsche Signale reduzieren. Zusätzliche Indikatoren wie Volatilität, RSI können auch bei den Urteilen helfen. Die Optimierung der Profit-Take- und Stop-Loss-Mechanismen über Trail-Stops, dynamische Exits usw. könnte von Vorteil sein.

Optimierungsrichtlinien

  1. Testen und optimieren Sie EMA-Parameterkombinationen, um optimale Einstellungen zu finden.

  2. Einbeziehung anderer technischer Indikatoren zur Bildung eines Ensemblesystems.

  3. Anwendung von maschinellem Lernen zur Vorhersage von Trends und Verbesserung der EMA-Leistung.

  4. Optimieren Sie Profit- und Stop-Loss-Strategien durch Kombination von Trail-Stopps, dynamischen Exits usw.

  5. Einführung von Modulen für das Kapitalmanagement zur dynamischen Positionsgrößerung.

  6. Anpassung von Parametern auf der Grundlage von Produktmerkmalen zur Bildung eines Strategie-Ensembles.

Zusammenfassung

Die Idee der Strategie, EMA und Volumen für die Trendidentifizierung zu kombinieren, ist klar. Aber die übermäßige Abhängigkeit von gleitenden Durchschnitten und festen Ausgängen hat Mängel. Das Hinzufügen von mehr Beurteilungsindikatoren und die Optimierung von Ausgängen können die Robustheit verbessern. Insgesamt bietet es eine Idee, Preis- und Volumendaten für die Trendverfolgung zu verwenden.


/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 2h
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("EMA_cumulativeVolume_crossover[Strategy]", overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity,  default_qty_value=20, initial_capital=10000)


emaLength= input(50, 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(false, 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)

vwapValue = cumulPriceVolume / cumulVolume

emaVal=ema(close, emaLength)

plot(emaVal, title="EMA", color=color.green,  transp=25)
plot(vwapValue, title="Cumulate Volumne / VWAP", color=color.orange,  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)

//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+(stopLoss*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="LE Exit Points="+tostring(close-strategy.position_avg_price, "###.##"), when=crossunder(emaVal, vwapValue) 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=(close<vwapValue and close<open  and close[1] < vwapValue  and close[1]<open[1] and close<close[1])  and emaVal>=vwapValue 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  close<shortTakeProfit )  //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<vwapValue and close>vwapValue and open>vwapValue and close>open )   or (crossover(emaVal,vwapValue))  ) 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"   ) )




Mehr