Diese Strategie kombiniert die EMA und die kumulativen Volumenindikatoren und erzeugt Kauf- und Verkaufssignale auf der Grundlage ihrer Querschnittssituationen, um Trends zu bestimmen.
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.
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.
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.
Testen und optimieren Sie EMA-Parameterkombinationen, um optimale Einstellungen zu finden.
Einbeziehung anderer technischer Indikatoren zur Bildung eines Ensemblesystems.
Anwendung von maschinellem Lernen zur Vorhersage von Trends und Verbesserung der EMA-Leistung.
Optimieren Sie Profit- und Stop-Loss-Strategien durch Kombination von Trail-Stopps, dynamischen Exits usw.
Einführung von Modulen für das Kapitalmanagement zur dynamischen Positionsgrößerung.
Anpassung von Parametern auf der Grundlage von Produktmerkmalen zur Bildung eines Strategie-Ensembles.
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" ) )