Momentum Moving Average Strategi Konsolidasi

Penulis:ChaoZhang, Tanggal: 2024-01-25 11:39:00
Tag:

img

Gambaran umum

Strategi ini terutama menggunakan konsolidasi yang terbentuk oleh garis rata-rata bergerak HMA dan EMA untuk menentukan waktu pembelian. Ketika HMA melintasi EMA, dianggap bahwa konsolidasi telah berakhir dan tren naik baru terbentuk, jadi beli ketika HMA melintasi EMA pada saat yang sama.

Strategi ini juga menggabungkan indikator RSI untuk mendeteksi kondisi overbought dan oversold.

Prinsip Strategi

Strategi ini menggunakan sistem rata-rata bergerak yang dibangun dengan EMA dan HMA 200 periode. Di antara mereka, indikator HMA adalah indikator rata-rata bergerak yang lebih sensitif yang dirancang berdasarkan EMA. Ketika HMA melintasi di atas EMA, itu berarti bahwa tahap konsolidasi telah berakhir dan harga saham mulai naik. Pada saat ini, jika indikator RSI tidak menunjukkan overbought, sinyal beli dihasilkan.

Dalam kasus posisi yang ada, jika harga saham jatuh kembali dan HMA melintasi di bawah EMA lagi, menunjukkan awal konsolidasi baru, seluruh posisi akan ditutup. Pada saat yang sama, jika RSI melintasi di atas 80, 20% dari keuntungan akan sebagian diambil untuk mencegah kerugian.

Logika transaksi dari strategi ini cukup sederhana, terutama mengandalkan persimpangan panjang dan pendek HMA dan EMA, dikombinasikan dengan RSIs tinggi dan rendah, untuk membentuk strategi perdagangan yang relatif kuat.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah bahwa dengan memanfaatkan pola perdagangan konsolidasi EMA dan HMA, sebagian besar False Break dapat disaring, sehingga meningkatkan tingkat keuntungan. Pada saat yang sama, alat bantu dari indikator RSI juga dapat secara efektif mengendalikan risiko. Kombinasi keduanya membuat strategi ini sangat cocok untuk pasar konsolidasi dan volatilitas.

Selain itu, strategi ini hanya menggunakan 3 indikator dan logika sederhana, yang memudahkan untuk mengoptimalkan parameter dan backtest, yang kondusif untuk verifikasi dan peningkatan strategi.

Analisis Risiko

Meskipun strategi ini memiliki beberapa keuntungan, masih ada beberapa risiko yang perlu dicatat. Misalnya, waktu kepemilikan mungkin relatif lama, membutuhkan dana yang cukup untuk mendukung. Jika ia mengalami periode konsolidasi sampingan, ia tidak dapat keluar dengan cepat dengan stop loss, yang dengan mudah mengarah pada situasi ekspansi kerugian.

Selain itu, strategi ini terutama bergantung pada indikator rata-rata bergerak. Jika ada terobosan yang tidak normal dalam harga, langkah-langkah stop-loss mungkin tidak dapat berlaku, yang akan membawa risiko yang lebih besar. Selain itu, pengaturan parameter juga akan mempengaruhi kinerja strategi dan memerlukan pengujian ekstensif untuk menemukan parameter optimal.

Arahan Optimasi

Mengingat risiko di atas, strategi ini dapat dioptimalkan dalam aspek berikut:

  1. Menggabungkan indikator volatilitas untuk menyesuaikan posisi secara dinamis berdasarkan volatilitas pasar.

  2. Meningkatkan penilaian indikator tren untuk menghindari perdagangan pembalikan yang tidak perlu.

  3. Mengoptimalkan parameter rata-rata bergerak agar lebih dekat dengan karakteristik pasar saat ini.

  4. Gunakan waktu berhenti untuk menghindari kerugian tunggal yang terlalu besar.

Ringkasan

Secara keseluruhan, ini adalah strategi konsolidasi dan volatilitas yang relatif sederhana. Ini terutama digunakan untuk perdagangan indeks saham dan saham panas jangka pendek dan menengah, dan dapat memperoleh nilai alfa yang relatif stabil. Dengan pengoptimalan parameter dan penguatan langkah-langkah pengendalian risiko, kinerja strategi ini masih memiliki banyak ruang untuk perbaikan.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
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(title="EMA_HMA_RSI_Strategy", overlay=true, pyramiding=2,     default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD)  //default_qty_value=10, default_qty_type=strategy.fixed, 

//longCondition = crossover(sma(close, 14), sma(close, 28))
//if (longCondition)
    //strategy.entry("My Long Entry Id", strategy.long)

//shortCondition = crossunder(sma(close, 14), sma(close, 28))
//if (shortCondition)
  //  strategy.entry("My Short Entry Id", strategy.short)

//HMA
HMA(src1, length1) =>  wma(2 * wma(src1, length1/2) - wma(src1, length1), round(sqrt(length1)))

var stopLossVal=0.00

//variables BEGIN
length=input(200,title="EMA and HMA Length")   //square root of 13

rsiLength=input(13, title="RSI Length")

takePartialProfits = input(true, title="Take Partial Profits (if this selected, RSI 13 higher reading over 80 is considered for partial closing ) ")

stopLoss = input(title="Stop Loss%", defval=8, minval=1)
//variables  END

//RSI 
rsi13=rsi(close,rsiLength)


ema200=ema(close,length)
hma200=HMA(close,length)

//exitOnAroonOscCrossingDown = input(true, title="Exit when Aroon Osc cross down zero ")


// Drawings

//Aroon oscillator

arronUpper = 100 * (highestbars(high, length+1) + length)/length
aroonLower = 100 * (lowestbars(low, length+1) + length)/length

aroonOsc  = arronUpper - aroonLower

aroonMidpoint = 0
//oscPlot = plot(aroonOsc, color=color.green)
//midLine= plot(aroonMidpoint, color=color.green)
//topLine = plot(90,style=plot.style_circles, color=color.green)
//bottomLine = plot(-90,style=plot.style_circles, color=color.red)

//fill(oscPlot, midLine, color=aroonOsc>0?color.green:color.red, transp=50)
//fill(topLine,bottomLine, color=color.blue)
//fill(topLine,oscPlot, color=aroonOsc>90?color.purple:na, transp=25)


// RSI 
//plot(rsi13, title="RSI", linewidth=2, color=color.purple)
//hline(50, title="Middle Line", linestyle=hline.style_dotted)
//obLevel = hline(80, title="Overbought", linestyle=hline.style_dotted)
//osLevel = hline(30, title="Oversold", linestyle=hline.style_dotted)
//fill(obLevel, osLevel, title="Background", color=rsi13 >=30 ? color.green:color.purple, transp=65)  // longTermRSI >=50

hullColor = hma200 > hma200[2] ? #00ff00 : #ff0000

plot(hma200, title="HULL 200", color=hullColor,  transp=25)
plot(ema200, title="EMA 200", color=color.orange)

//Entry--
strategy.initial_capital = 50000
strategy.entry(id="Long Entry", comment="LE", qty=(strategy.initial_capital * 0.10)/close, long=true,  when=strategy.position_size<1 and hma200 < ema200   and  hma200 > hma200[2]  and rsi13<70 )     //  // aroonOsc<0

//Add
if(strategy.position_size>=1 and  close < strategy.position_avg_price and  ( crossover(rsi13,30) or  crossover(rsi13,40) ) )   // hma200 < ema200   and  hma200 > hma200[2]   and hma200[2] < hma200[3] )  //and crossover(rsi13,30)  aroonOsc<0    //and hma200 > hma200[2]  and hma200[2] <= hma200[3]  //crossover(rsi13,30)
    qty1=(strategy.initial_capital * 0.10)/close
    //stopLossVal:= abs(strategy.position_size)>1 ?  ( (close > close[1] and close > open and close>strategy.position_avg_price) ? close[1]*(1-stopLoss*0.01) : stopLossVal ) : 0.00 
    strategy.entry(id="Long Entry", comment="Add", qty=qty1, long=true )     //crossover(close,ema34)  //and close>ema34  //crossover(rsi5Val,rsiBuyLine)  --   SL="+tostring(stopLossVal, "####.##")


//stopLossVal:= abs(strategy.position_size)>1 ? strategy.position_avg_price*(1-0.5) : 0.00 

stopLossVal:= abs(strategy.position_size)>1 ?  ( (close > close[1] and close > open and close>strategy.position_avg_price) ? close[1]*(1-stopLoss*0.01) : stopLossVal ) : 0.00 
//stopLossVal:= abs(strategy.position_size)>1 ?  strategy.position_avg_price*(1-stopLoss*0.01) :  0.00

barcolor(color=strategy.position_size>=1? rsi13>80 ? color.purple: color.blue:na)

//close partial
if(takePartialProfits==true)
    strategy.close(id="Long Entry", comment="Partial X  points="+tostring(close - strategy.position_avg_price, "####.##"),  qty_percent=20 , when=abs(strategy.position_size)>=1 and crossunder(rsi13, 80)  and close > strategy.position_avg_price  )   //close<ema55 and rsi5Val<20 //ema34<ema55



//close All
//if(exitOnAroonOscCrossingDown)
  //  strategy.close(id="Long Entry", comment="Exit All points="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and crossunder(aroonOsc, 0) )   //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89

//close All on stop loss
strategy.close(id="Long Entry", comment="Stoploss X points="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and close < stopLossVal  )  //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89

strategy.close(id="Long Entry", comment="hmaXema X points="+tostring(close - strategy.position_avg_price, "####.##"),  when=abs(strategy.position_size)>=1 and close > strategy.position_avg_price  and  crossunder(hma200,ema200)  )  //close<ema55 and rsi5Val<20 //ema34<ema55  //close<ema89
    

Lebih banyak