EMA dan Cumulative Volume Crossover Strategy untuk Long Short

Penulis:ChaoZhang, Tanggal: 2023-09-20 11:48:34
Tag:

Gambaran umum

Strategi ini menggabungkan indikator EMA dan kumulatif volume, menghasilkan sinyal beli dan jual berdasarkan situasi silang mereka untuk menentukan tren.

Logika Strategi

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.

Analisis Keuntungan

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.

Analisis Risiko

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.

Arahan Optimasi

  1. Uji dan optimalkan kombinasi parameter EMA untuk menemukan pengaturan optimal.

  2. Menggabungkan indikator teknis lainnya untuk membentuk sistem ensemble.

  3. Menerapkan pembelajaran mesin untuk memprediksi tren dan meningkatkan kinerja EMA.

  4. Mengoptimalkan strategi profit taking dan stop loss dengan menggabungkan trail stops, dynamic exits, dll.

  5. Memperkenalkan modul manajemen modal untuk ukuran posisi dinamis.

  6. Sesuaikan parameter berdasarkan karakteristik produk untuk membentuk keseluruhan strategi.

Ringkasan

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"   ) )




Lebih banyak