Strategi perdagangan purata bergerak pelangi direka berdasarkan indikator purata bergerak pelangi. Strategi ini menilai arah trend dengan membina sistem purata bergerak pelangi yang mengandungi 7 purata bergerak, bekerjasama dengan indikator RSI untuk menyaring isyarat palsu, untuk memasuki perdagangan berisiko rendah.
Strategi ini menghasilkan isyarat dagangan melalui beberapa langkah:
Membina sistem purata bergerak pelangi. Sistem ini mengandungi 7 purata bergerak, di mana purata bergerak pertama adalah 12, dan data sumber adalah purata harga penutupan.
Mengetahui arah trend. Jika rata-rata bergerak pertama terletak di atas rata-rata bergerak pelangi, ia ditakrifkan sebagai trend naik; jika terletak di bawah, ia ditakrifkan sebagai trend menurun; jika terletak di tengah, ia ditakrifkan sebagai penyusunan.
Menjana isyarat dagangan. Apabila trend dalam sistem purata bergerak pelangi berubah dari naik ke bawah, menghasilkan isyarat jual; Apabila trend berubah dari turun ke atas, menghasilkan isyarat beli; Apabila trend berubah dari berkurung ke atas atau ke bawah, menebus kedudukan semasa.
Penapis RSI. Hanya menerima isyarat perdagangan apabila RSI menunjukkan keadaan normal. RSI pertama memerlukan berada di antara kawasan yang terlalu dibeli dan dijual, untuk mengelakkan pecah palsu; RSI kedua tidak boleh berada di kawasan tengah, untuk memastikan momentum yang cukup untuk pecah.
Strategi ini mempunyai kelebihan berikut:
Sistem purata bergerak pelangi dapat menentukan arah trend dengan tepat. Berbagai kombinasi purata bergerak dapat menyaring bunyi pasaran dengan berkesan dan mengenali pembalikan trend.
RSI menunjukkan mekanisme penapis ganda, yang dapat menyaring dengan berkesan isyarat penembusan palsu, untuk mengelakkan tersandung. RSI pertama memastikan berada di kawasan normal, dan RSI kedua memastikan kekuatan penembusan yang cukup besar.
Gabungan trend dan penunjuk pembalikan, anda boleh masuk ke dalam permainan tepat pada masanya apabila trend bertukar, dan anda boleh mengelakkan mengejar kejatuhan.
Mengambil tindakan untuk melonggarkan kedudukan semasa proses penukaran, anda boleh mengelakkan risiko penukaran pasaran oleh pemilihan wilayah.
Terdapat banyak ruang untuk mengoptimumkan parameter strategi ini, yang dapat dioptimumkan dengan menyesuaikan kitaran purata bergerak, nisbah panjang, parameter RSI, dan lain-lain, untuk varieti dan kitaran yang berbeza, untuk mendapatkan kesan yang lebih baik.
Strategi ini mempunyai risiko utama:
Apabila pembalikan trend tidak jelas, isyarat pembalikan palsu mungkin dihasilkan, yang menyebabkan kerugian perdagangan. Anda boleh menyesuaikan kitaran purata bergerak dengan betul untuk menjadikan isyarat pembalikan lebih jelas.
Tanda-tanda ini muncul apabila pengiraan zon jangka panjang, sering membuka kedudukan damai, meningkatkan kos perdagangan dan kehilangan titik tergelincir. Anda boleh meningkatkan intensiti penapisan pada tahap pengiraan dengan mengoptimumkan parameter RSI.
Apabila pembalikan lambat, selepas isyarat pembalikan dihantar, masa dan ruang kerugian diperluaskan. Perbezaan kitaran purata bergerak dapat diperbesar, sehingga isyarat dihantar lebih tepat pada masanya.
Parameter yang ditetapkan tidak tepat pada masanya, mungkin menyaring sebahagian daripada isyarat yang betul, atau menyebabkan isyarat menghasilkan kelewatan. Perlu menyesuaikan parameter mengikut ciri-ciri pelbagai jenis.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Pengoptimuman parameter purata bergerak. Anda boleh mengoptimumkan parameter seperti panjang kitaran purata bergerak, nisbah perbezaan kitaran, dan cara purata bergerak (SMA atau EMA) untuk mendapatkan penilaian trend yang lebih tepat.
Pengoptimuman parameter RSI. Anda boleh mengoptimumkan parameter seperti panjang kitaran RSI, kawasan overbought, kawasan oversold, kawasan neutral, dan sebagainya untuk membuat penapisan lebih tepat dan berkesan.
Pengoptimuman kitaran masa. Anda boleh menguji kitaran masa yang berbeza dan memilih kitaran masa yang paling sesuai dengan strategi untuk mendapatkan kesan terbaik.
Pengoptimuman varieti. Anda boleh menyesuaikan parameter atau peraturan mengikut ciri-ciri varieti yang berbeza, supaya strategi berfungsi dengan baik untuk varieti tersebut.
Menambah mekanisme penangguhan kerugian. Berdasarkan keputusan tinjauan semula, tahap penangguhan kerugian yang munasabah boleh ditetapkan untuk mengawal risiko dan keuntungan perdagangan tunggal.
Strategi perdagangan rata-rata bergerak pelangi menggunakan strategi penilaian trend dan penapisan isyarat yang digabungkan untuk menangkap isyarat pada titik perubahan trend. Strategi ini mempunyai ciri-ciri penilaian yang tepat, risiko yang boleh dikawal, dan dengan pengoptimuman parameter dan aturan yang sempurna, ia boleh menjadi strategi perdagangan kuantitatif yang sangat praktikal. Secara keseluruhan, strategi ini patut dikaji dan digunakan.
/*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