Strategi Pelacakan Tren Momentum

Penulis:ChaoZhang, Tanggal: 2023-11-07 16:49:49
Tag:

img

Gambaran umum

Strategi ini didasarkan pada analisis tren rata-rata bergerak dan volume, menetapkan indikator momentum, dan membuat operasi beli dan jual dengan melacak tren.

Prinsip Strategi

  1. Menghitung EMA harga penutupan dan EMA kumulatif volume
  2. Ketika penutupan melintasi di atas EMA, itu dinilai sebagai tren naik dan posisi panjang diambil
  3. Ketika terus naik, tutup melintasi di atas 2 kali dari kumulatif EMA, tambahkan ke posisi panjang
  4. Tentukan indikator RSI, ketika RSI melebihi 90, tutup posisi 1/3 untuk mengambil keuntungan
  5. Ketika penutupan melintasi di bawah EMA, ini dinilai sebagai tren menurun, tutup semua posisi panjang
  6. Ketika menutup melintasi di bawah EMA, itu dinilai sebagai tren menurun, mengambil posisi pendek
  7. Setel garis stop loss pada persentase tetap dari harga masuk
  8. Mengambil keuntungan dari posisi pendek adalah sama dengan posisi panjang

Analisis Keuntungan

Keuntungan utama dari strategi ini adalah:

  1. Menggunakan EMA untuk menilai tren dapat secara efektif melacak tren
  2. Menggunakan EMA kumulatif volume untuk menilai perubahan tren yang sebenarnya
  3. Indikator momentum pelacakan RSI untuk pengambilan keuntungan
  4. Kontrol risiko yang baik dengan stop loss
  5. Dapat beradaptasi dengan kondisi pasar yang berbeda, parameter dapat disesuaikan secara fleksibel

Analisis Risiko

Risiko utama dari strategi ini adalah:

  1. EMA memiliki ketinggalan, mungkin melewatkan titik balik
  2. Volume mungkin tidak selalu mencerminkan tren nyata
  3. Persentase stop loss tetap mungkin terlalu mekanis
  4. Terlalu banyak parameter membuat pengaturan parameter sulit
  5. Frekuensi perdagangan yang tinggi menyebabkan biaya perdagangan yang tinggi

Solusi Risiko:

  1. Mengoptimalkan parameter EMA untuk mengurangi keterlambatan
  2. Gabungkan dengan indikator lain untuk mengkonfirmasi sinyal volume
  3. Optimalkan titik stop loss berdasarkan kondisi pasar
  4. Sederhanakan parameter, tetap pengaturan utama saja
  5. Relaksasi stop loss dan frekuensi perdagangan dengan tepat

Arahan Optimasi

Strategi ini dapat dioptimalkan dalam aspek berikut:

  1. Uji pengaturan parameter EMA yang berbeda untuk menemukan kombinasi optimal
  2. Tambahkan kelipatan volume sebagai penilaian kekuatan sinyal untuk masuk
  3. Gabungkan dengan MACD, KD dan indikator lainnya untuk mengkonfirmasi masuk
  4. Optimalkan persentase stop loss sesuai dengan karakteristik saham tertentu
  5. Mengoptimalkan frekuensi perdagangan untuk mengurangi biaya perdagangan

Ringkasan

Singkatnya, ini adalah strategi pelacakan tren berdasarkan sistem moving average. Ide utamanya adalah menggunakan EMA untuk menentukan arah tren, dan mengkonfirmasi entri dengan indikator momentum VOLUME. Ini dapat terus dioptimalkan melalui penyesuaian parameter, dan dibantu oleh indikator lain untuk konfirmasi lebih lanjut. Secara keseluruhan ini adalah strategi pelacakan tren yang fleksibel, yang dapat menghasilkan pengembalian yang baik setelah penggunaan yang terampil.


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



Lebih banyak