Strategi ini terutamanya menggunakan penyatuan yang dibentuk oleh garis purata bergerak HMA dan EMA untuk menentukan masa pembelian. Apabila HMA melintasi EMA, ia dianggap bahawa penyatuan telah berakhir dan trend menaik baru terbentuk, jadi beli apabila HMA melintasi EMA pada masa yang sama.
Strategi ini juga menggabungkan penunjuk RSI untuk mengesan keadaan overbought dan oversold. Ia membolehkan membeli apabila RSI di bawah 70 dan mempertimbangkan mengambil keuntungan separa apabila RSI di atas 80.
Strategi ini menggunakan sistem purata bergerak yang dibina dengan EMA dan HMA 200 tempoh. Di antara mereka, penunjuk HMA adalah penunjuk purata bergerak yang lebih sensitif yang direka berdasarkan EMA. Apabila HMA melintasi di atas EMA, ini bermakna peringkat penyatuan telah berakhir dan harga saham mula meningkat. Pada masa ini, jika penunjuk RSI tidak menunjukkan overbought, isyarat beli dihasilkan.
Dalam kes kedudukan yang sedia ada, jika harga saham jatuh kembali dan HMA menyeberangi di bawah EMA lagi, menunjukkan permulaan penyatuan baru, keseluruhan kedudukan akan ditutup. Pada masa yang sama, jika RSI menyeberangi di atas 80, 20% keuntungan akan diambil sebahagiannya untuk mengelakkan kerugian.
Logik urus niaga strategi ini agak mudah, terutamanya bergantung pada persimpangan panjang dan pendek HMA dan EMA, digabungkan dengan tinggi dan rendah RSI
Kelebihan terbesar strategi ini ialah dengan menggunakan corak perdagangan penyatuan EMA dan HMA, kebanyakan False Breaks dapat disaring, dengan itu meningkatkan kadar keuntungan. Pada masa yang sama, alat bantu penunjuk RSI juga dapat mengawal risiko dengan berkesan. Kombinasi kedua-duanya menjadikan strategi ini sangat sesuai untuk pasaran penyatuan dan turun naik.
Di samping itu, strategi ini hanya menggunakan 3 penunjuk dan logiknya mudah, yang memudahkan untuk mengoptimumkan parameter dan backtest, yang mendorong pengesahan dan peningkatan strategi.
Walaupun strategi ini mempunyai beberapa kelebihan, masih ada beberapa risiko yang perlu diperhatikan. Sebagai contoh, masa pegangan mungkin agak lama, memerlukan dana yang mencukupi untuk menyokong. Jika ia menghadapi tempoh penyatuan sampingan, ia tidak boleh keluar dengan cepat dengan stop loss, yang dengan mudah membawa kepada situasi peningkatan kerugian.
Di samping itu, strategi ini terutamanya bergantung pada penunjuk purata bergerak. Jika terdapat terobosan yang tidak normal dalam harga, langkah-langkah stop-loss mungkin tidak dapat berkuat kuasa, yang akan membawa risiko yang lebih besar. Di samping itu, tetapan parameter juga akan mempengaruhi prestasi strategi dan memerlukan ujian yang luas untuk mencari parameter yang optimum.
Memandangkan risiko di atas, strategi ini boleh dioptimumkan dalam aspek berikut:
Menggabungkan penunjuk turun naik untuk menyesuaikan kedudukan secara dinamik berdasarkan turun naik pasaran.
Meningkatkan penilaian penunjuk trend untuk mengelakkan perdagangan pembalikan yang tidak perlu.
Mengoptimumkan parameter purata bergerak untuk menjadikannya lebih dekat dengan ciri pasaran semasa.
Gunakan hentian masa untuk mengelakkan kerugian tunggal yang terlalu besar.
Secara keseluruhan, ini adalah strategi penyatuan dan turun naik yang agak klasik. Ia digunakan terutamanya untuk perdagangan indeks saham jangka pendek dan jangka menengah dan saham panas, dan boleh memperoleh nilai alfa yang agak stabil. Dengan pengoptimuman parameter dan penguatan langkah-langkah kawalan risiko, prestasi strategi ini masih mempunyai ruang yang besar untuk peningkatan.
/*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