Strategi Dagangan Purata Bergerak Pelangi

Penulis:ChaoZhang, Tarikh: 2023-09-28 11:01:59
Tag:

Ringkasan

Strategi perdagangan Purata Bergerak Pelangi direka berdasarkan penunjuk Purata Bergerak Pelangi. Strategi ini mengenal pasti arah trend melalui sistem purata bergerak pelangi dengan 7 purata bergerak, dan menapis isyarat palsu dengan penunjuk RSI untuk mencapai kemasukan berisiko rendah.

Logika Strategi

Strategi menghasilkan isyarat perdagangan melalui langkah-langkah berikut:

  1. Membina sistem purata bergerak pelangi. Ia mengandungi 7 purata bergerak. Purata bergerak pertama mempunyai tempoh 12 dan mengambil harga penutupan sebagai data sumber. 6 purata bergerak yang lain mempunyai tempoh menurun secara progresif 3, dengan purata bergerak sebelumnya sebagai sumber.

  2. Tentukan arah trend. Jika purata bergerak pertama berada di atas pelangi, tentukan sebagai uptrend. Jika berada di bahagian bawah, tentukan sebagai downtrend. Jika berada di tengah, tentukan sebagai penyatuan.

  3. Menjana isyarat. Apabila trend berubah dari uptrend ke downtrend, isyarat jual dihasilkan. Apabila trend berubah dari downtrend ke uptrend, isyarat beli dihasilkan. Apabila trend berubah dari penyatuan ke uptrend atau downtrend, tutup kedudukan sedia ada.

  4. Penapis RSI. Hanya menerima isyarat apabila RSI menunjukkan status normal. RSI pertama harus berada di antara zon overbought dan oversold untuk mengelakkan pecah palsu. RSI kedua harus berada di luar zon tengah untuk memastikan momentum yang kuat.

Kelebihan

Kelebihan strategi ini termasuk:

  1. Sistem purata bergerak pelangi dengan tepat mengenal pasti arah trend. Pelbagai purata bergerak digabungkan untuk menapis bunyi pasaran dan pembalikan trend spot.

  2. Mekanisme penapis RSI berganda berkesan mengelakkan isyarat pecah palsu dan terperangkap. RSI pertama memastikan berada di zon normal sementara RSI kedua menjamin momentum yang cukup kuat.

  3. Menggabungkan penunjuk trend dan pembalikan membolehkan kemasukan tepat pada masa pembalikan trend, sambil mengelakkan mengejar momentum.

  4. Penutupan kedudukan aktif semasa penyatuan mengelakkan risiko pasaran yang terhad.

  5. Strategi ini menawarkan ruang pengoptimuman parameter yang besar, yang boleh disesuaikan untuk produk dan jangka masa yang berbeza untuk mencapai hasil yang lebih baik.

Risiko

Risiko utama strategi ini:

  1. Pembalikan trend yang tidak jelas boleh menghasilkan isyarat palsu dan menyebabkan kerugian.

  2. Pembukaan dan penutupan yang kerap semasa pengukuhan yang panjang meningkatkan kos dan slippage.

  3. Pembalikan yang tertunda meningkatkan kerugian selepas isyarat awal.

  4. Tetapan parameter yang tidak betul boleh menapis isyarat yang betul atau menyebabkan kelewatan isyarat.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Pengoptimuman parameter purata bergerak, termasuk panjang tempoh, nisbah tempoh, jenis MA dan lain-lain, untuk membuat penilaian trend lebih tepat.

  2. Pengoptimuman parameter RSI, termasuk tempoh, tahap overbought / oversold, zon neutral dan lain-lain, untuk membuat penapisan lebih tepat.

  3. Pengoptimuman jangka masa, untuk mencari jangka masa yang optimum.

  4. Pengoptimuman produk, untuk menyesuaikan parameter dan peraturan untuk sesuai dengan produk yang berbeza.

  5. Menambah stop loss dan mengambil keuntungan untuk mengawal risiko dan saiz keuntungan.

Kesimpulan

Strategi perdagangan purata bergerak pelangi menggabungkan penentuan trend dan penapisan isyarat untuk menangkap isyarat pembalikan dengan berkesan. Dengan penilaian yang tepat dan risiko yang boleh dikawal, strategi ini boleh menjadi sangat praktikal selepas penyesuaian parameter dan penyempurnaan logik. Secara keseluruhan, ia bernilai penyelidikan dan penerapan yang mendalam.


/*backtest
start: 2023-08-28 00:00:00
end: 2023-09-27 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//╔════════════════════════════════════════════════════════════════════════════╗
//║Rainbow Backtesting base on "Rainbow Moving Average" Strategy as below:     ║
//║1.Rainbow Moving Average setup                                              ║
//║- Source: source of 1st MA                                                  ║
//║- Type: SMA/EMA                                                             ║
//║- Period: period of 1st MA                                                  ║
//║- Displacement: period of 2nd MA to 7th MA with source is previous MA       ║
//║2.Trend Define                                                              ║
//║- Up Trend: Main MA moving at the top of Rainbow                            ║
//║- Down Trend: Main MA moving at the bottom of Rainbow                       ║
//║- Sideway: Main MA moving between the top and the bottom of Rainbow         ║
//║3.Signal                                                                    ║
//║- Buy Signal: When Rainbow change to Up Trend.                              ║
//║- Sell Signal: When Rainbow change to Down Trend.                           ║
//║- Exit: When Rainbow change to Sideway.                                     ║
//║4.RSI Filter                                                                ║
//║- "Enable": Only signals have 1st RSI moving between Overbought and Oversold║
//║and 2nd RSI moving outside Middle Channel are accepted.                     ║
//║- The filter may help trader avoid bull trap, bear trap and choppy market.  ║
//╚════════════════════════════════════════════════════════════════════════════╝

//@version=4
strategy("Rainbow Strategy Backtesting",overlay=false)
//++++++++++++++++++++++++++++++++++++++++++++++++++
//+++++++++++++ Rainbow Moving Average +++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++
rainbow_tt="=== Rainbow Moving Average ==="
ma1_source=input(hlc3,title="Source",type=input.source, inline="set1", group=rainbow_tt)
rb_type=input("SMA",title="Type",options=["SMA","EMA"], inline="set1", group=rainbow_tt)
ma1_len=input(12,title="Period", inline="set2", group=rainbow_tt)
dis_len=input(3,title="Displacement", inline="set2", group=rainbow_tt,minval=2)
trend_tt="=== Trend Color ==="
up_col=input(color.new(color.blue,0),title="Up",inline="Color",group=trend_tt)
dn_col=input(color.new(color.red,0),title="Down",inline="Color",group=trend_tt)
sw_col=input(color.new(color.yellow,0),title="No",inline="Color",group=trend_tt)
//1st
ma1=rb_type=="SMA"?sma(ma1_source,ma1_len):ema(ma1_source,ma1_len)
//2nd
ma2=rb_type=="SMA"?sma(ma1,dis_len):ema(ma1,dis_len)
//3rd
ma3=rb_type=="SMA"?sma(ma2,dis_len):ema(ma2,dis_len)
//4
ma4=rb_type=="SMA"?sma(ma3,dis_len):ema(ma3,dis_len)
//5
ma5=rb_type=="SMA"?sma(ma4,dis_len):ema(ma4,dis_len)
//6
ma6=rb_type=="SMA"?sma(ma5,dis_len):ema(ma5,dis_len)
//7
ma7=rb_type=="SMA"?sma(ma6,dis_len):ema(ma6,dis_len)
//MinMax
rb_max=max(ma1,ma2,ma3,ma4,ma5,ma6,ma7)
rb_min=min(ma1,ma2,ma3,ma4,ma5,ma6,ma7)
dir_col=
       ma1==rb_max?up_col:
       ma1==rb_min?dn_col:
       sw_col
dir_style=shape.circle
plotshape(dir_col[1]==dir_col?0:na,title="Trend",style=dir_style,color=dir_col,location=location.absolute)
//++++++++++++++++++++++++++++++++++++++
//+++++++++++++ RSI Filter +++++++++++++
//++++++++++++++++++++++++++++++++++++++
rsi_tt="=== RSI Filter ==="
rsi_filter=input("Enable",title="Filter",options=["Enable","Disable"],inline="set",group=rsi_tt)
over_tt="Over Filter"
rsi_len_1=input(12,title="Period",inline="set",group=over_tt)
rsi_ovb=input(65,title="Overbought",inline="set",group=over_tt)
rsi_ovs=input(35,title="Oversold",inline="set",group=over_tt)
rsi_1=rsi(close,rsi_len_1)
mid_tt="Middle Filter"
rsi_len_2=input(9,title="Period",inline="set",group=mid_tt)
rsi_mid_top=input(56,title="Upper",inline="set",group=mid_tt)
rsi_mid_bot=input(44,title="Lower",inline="set",group=mid_tt)
rsi_2=rsi(close,rsi_len_2)
//Status
var rsi_status="None"
if (rsi_1>rsi_ovs and rsi_1<rsi_ovb) and (rsi_2[1]<rsi_mid_bot or rsi_2[1]>rsi_mid_top)
    rsi_status:="Normal"
else
    rsi_status:="None"
//Signal
BuySignal= 
       rsi_filter=="Disable"?
       dir_col[1]!=up_col
       and
       dir_col[0]==up_col
       :
       dir_col[1]!=up_col
       and
       dir_col[0]==up_col
       and
       rsi_status=="Normal"
       
SellSignal= 
       rsi_filter=="Disable"?
       dir_col[1]!=dn_col
       and
       dir_col[0]==dn_col
       :
       dir_col[1]!=dn_col
       and
       dir_col[0]==dn_col
       and
       rsi_status=="Normal"
       
exit=
       (dir_col[1]!=sw_col
       and
       dir_col[0]==sw_col)
buycol =
       BuySignal?
       up_col: na

sellcol =
       SellSignal?
       dn_col: na

exitcol =
       exit?
       sw_col: na

buy_style=shape.arrowup
sell_style=shape.arrowdown
exit_style=shape.square
plotshape(BuySignal?0:na,title="Buy",text="Buy",style=buy_style,color=buycol,location=location.absolute)
plotshape(SellSignal?0:na,title="Sell",text="Sell",style=sell_style,color=sellcol,location=location.absolute)
plotshape(exit?0:na,title="Exit",text="Exit",style=exit_style,color=exitcol,location=location.absolute)

filter=
       rsi_filter=="Enable"?
       dir_col[1]!=dir_col 
       and BuySignal==false 
       and SellSignal==false 
       and exit==false:
       na
filter_style=shape.xcross
filtercol=
       filter?
       dir_col:na
plotshape(filter?0:na,title="Filter",text="Filter",style=filter_style,color=filtercol,location=location.absolute)

//+++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++++++ Backtesting ++++++++++++++++++
//+++++++++++++++++++++++++++++++++++++++++++++++++
strategy.entry("Long", strategy.long, when=BuySignal)
strategy.close("Long", when=exit or filter)
strategy.entry("Short", strategy.short, when=SellSignal)
strategy.close("Short", when=exit or filter)
//EOF

Lebih lanjut