Strategi ini menggabungkan indikator EMA dan kumulatif volume, menghasilkan sinyal beli dan jual berdasarkan situasi silang mereka untuk menentukan tren.
EMA 50 hari dan indikator volume kumulatif 100 hari dihitung. Ketika EMA melintasi di atas volume kumulatif dari bawah, sinyal beli dihasilkan untuk pergi panjang. Ketika EMA melintasi di bawah volume kumulatif dari atas, sinyal jual dihasilkan untuk pergi pendek.
Selama posisi, strategi stop loss dan take profit tetap diterapkan. Stop loss ditetapkan pada 8% di bawah harga masuk. Take profit ditetapkan pada 8% di atas harga masuk, dengan penutupan posisi parsial ketika harga mencapai level take profit.
Strategi ini menggabungkan indikator tren EMA dan indikator aliran dana volume kumulatif, memanfaatkan informasi harga dan volume untuk secara efektif mengidentifikasi tren jangka menengah dan panjang.
Periode EMA dapat disesuaikan secara bebas untuk produk yang berbeda. Kedua perdagangan panjang dan pendek diterapkan untuk perdagangan linier.
Kepercayaan yang berlebihan pada rata-rata bergerak dapat mengakibatkan whipsaws selama konsolidasi yang terbatas pada kisaran. Mengambil keuntungan tetap dan stop loss juga dapat menyebabkan keluar dini atau stop out yang terlalu besar. Hanya faktor harga dan volume yang dipertimbangkan tanpa elemen lain.
Memperluas periode rata-rata bergerak dapat mengurangi sinyal palsu. Indikator tambahan seperti volatilitas, RSI juga dapat membantu penilaian. Mengoptimalkan mekanisme profit take dan stop loss, melalui trail stop, exit dinamis dll bisa bermanfaat.
Uji dan optimalkan kombinasi parameter EMA untuk menemukan pengaturan optimal.
Menggabungkan indikator teknis lainnya untuk membentuk sistem ensemble.
Menerapkan pembelajaran mesin untuk memprediksi tren dan meningkatkan kinerja EMA.
Mengoptimalkan strategi profit taking dan stop loss dengan menggabungkan trail stops, dynamic exits, dll.
Memperkenalkan modul manajemen modal untuk ukuran posisi dinamis.
Sesuaikan parameter berdasarkan karakteristik produk untuk membentuk keseluruhan strategi.
Ide strategi untuk menggabungkan EMA dan volume untuk identifikasi tren jelas. Tetapi ketergantungan yang berlebihan pada moving average dan exit tetap memiliki kelemahan. Menambahkan lebih banyak indikator penilaian dan mengoptimalkan exit dapat meningkatkan ketahanan. Secara keseluruhan memberikan gagasan untuk menggunakan data harga dan volume untuk pelacakan tren.
/*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" ) )