Strategi Pengesanan Trend Momentum

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

img

Ringkasan

Strategi ini berdasarkan analisis trend purata bergerak dan jumlah, menetapkan penunjuk momentum, dan membuat operasi beli dan jual dengan mengesan trend.

Prinsip Strategi

  1. Mengira EMA harga penutupan dan EMA jumlah kumulatif
  2. Apabila penutupan melintasi di atas EMA, ia dinilai sebagai trend menaik dan kedudukan panjang diambil
  3. Apabila terus menaik, tutup melintasi lebih daripada 2 kali daripada EMA kumulatif, tambah kepada kedudukan panjang
  4. Tetapkan penunjuk RSI, apabila RSI melebihi 90, tutup 1/3 kedudukan untuk mengambil keuntungan
  5. Apabila penutupan melintasi di bawah EMA, ia dinilai sebagai trend menurun, tutup semua kedudukan panjang
  6. Apabila penutupan melintasi di bawah EMA, ia dinilai sebagai trend menurun, mengambil kedudukan pendek
  7. Tetapkan barisan stop loss pada peratusan tetap daripada harga kemasukan
  8. Mengambil keuntungan dari kedudukan pendek adalah sama dengan kedudukan panjang

Analisis Kelebihan

Kelebihan utama strategi ini ialah:

  1. Menggunakan EMA untuk menilai trend boleh secara berkesan mengesan trend
  2. Menggunakan EMA kumulatif jumlah untuk menilai perubahan trend sebenar
  3. Indikator momentum pengesanan RSI untuk mengambil keuntungan
  4. Kawalan risiko yang baik dengan stop loss
  5. Boleh menyesuaikan diri dengan keadaan pasaran yang berbeza, parameter boleh diselaraskan dengan fleksibel

Analisis Risiko

Risiko utama strategi ini ialah:

  1. EMA telah ketinggalan, mungkin terlepas titik perubahan
  2. Jumlah mungkin tidak selalu mencerminkan trend sebenar
  3. Peratusan tetap stop loss mungkin terlalu mekanistik
  4. Terlalu banyak parameter membuat parameter penyesuaian sukar
  5. Kekerapan perdagangan yang tinggi membawa kepada kos perdagangan yang tinggi

Penyelesaian Risiko:

  1. Mengoptimumkan parameter EMA untuk mengurangkan ketinggalan
  2. Gabungkan dengan penunjuk lain untuk mengesahkan isyarat jumlah
  3. Mengoptimumkan titik stop loss berdasarkan keadaan pasaran
  4. Mempermudah parameter, menyimpan tetapan utama sahaja
  5. Relaks stop loss dan kekerapan perdagangan dengan sewajarnya

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Uji tetapan parameter EMA yang berbeza untuk mencari kombinasi optimum
  2. Tambah kelipatan jumlah sebagai penilaian kekuatan isyarat untuk kemasukan
  3. Gabungkan dengan MACD, KD dan penunjuk lain untuk mengesahkan kemasukan
  4. Mengoptimumkan peratusan stop loss mengikut ciri-ciri stok tertentu
  5. Mengoptimumkan kekerapan perdagangan untuk mengurangkan kos perdagangan

Ringkasan

Ringkasnya, ini adalah strategi pengesanan trend berdasarkan sistem purata bergerak. Idea utamanya adalah menggunakan EMA untuk menentukan arah trend, dan mengesahkan kemasukan dengan penunjuk momentum VOLUME. Ia boleh terus dioptimumkan melalui penyesuaian parameter, dan dibantu oleh penunjuk lain untuk pengesahan lanjut. Secara keseluruhan ia adalah strategi pengesanan trend yang fleksibel, yang boleh menghasilkan pulangan yang baik selepas penggunaan yang mahir.


/*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 lanjut