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.
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 RSI
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.
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.
Mengingat risiko di atas, strategi ini dapat dioptimalkan dalam aspek berikut:
Menggabungkan indikator volatilitas untuk menyesuaikan posisi secara dinamis berdasarkan volatilitas pasar.
Meningkatkan penilaian indikator tren untuk menghindari perdagangan pembalikan yang tidak perlu.
Mengoptimalkan parameter rata-rata bergerak agar lebih dekat dengan karakteristik pasar saat ini.
Gunakan waktu berhenti untuk menghindari kerugian tunggal yang terlalu besar.
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