Chiến lược giao dịch trung bình di chuyển cầu vồng được thiết kế dựa trên chỉ số trung bình di chuyển cầu vồng. Chiến lược này được thiết kế bằng cách xây dựng một hệ thống trung bình di chuyển cầu vồng gồm 7 đường trung bình di chuyển để xác định xu hướng, kết hợp với chỉ số RSI để lọc các tín hiệu giả mạo và thực hiện giao dịch rủi ro thấp.
Chiến lược này chủ yếu tạo ra tín hiệu giao dịch thông qua các bước sau:
Xây dựng hệ thống trung bình di chuyển cầu vồng. Hệ thống này bao gồm 7 trung bình di chuyển, trong đó trung bình di chuyển đầu tiên có chu kỳ 12, dữ liệu nguồn là giá trị trung bình của giá đóng cửa.
Xác định xu hướng của xu hướng. Nếu đường trung bình di chuyển đầu tiên nằm ở trên cùng của đường trung bình di chuyển cầu vồng, nó được định nghĩa là xu hướng tăng; nếu nằm ở dưới cùng, nó được định nghĩa là xu hướng giảm; nếu nằm ở giữa, nó được định nghĩa là kết hợp.
Tạo tín hiệu giao dịch. Khi xu hướng của hệ thống trung bình di chuyển cầu vồng thay đổi từ lên xuống, tạo tín hiệu bán; Khi xu hướng thay đổi từ xuống lên, tạo tín hiệu mua; Khi xu hướng thay đổi từ cân bằng lên hoặc xuống, xóa vị trí hiện tại.
Bộ lọc RSI. Chỉ khi chỉ số RSI hiển thị bình thường, tín hiệu giao dịch sẽ được chấp nhận. Chỉ số RSI đầu tiên yêu cầu nằm giữa khu vực quá mua và bán, tránh phá vỡ giả; RSI thứ hai yêu cầu không thể nằm ở khu vực giữa, đảm bảo động lực phá vỡ là đủ.
Chiến lược này có những ưu điểm sau:
Hệ thống trung bình di chuyển của cầu vồng có thể xác định chính xác hướng của xu hướng. Nhiều kết hợp trung bình di chuyển có thể lọc hiệu quả tiếng ồn thị trường và nhận diện xu hướng đảo ngược.
RSI chỉ số có cơ chế lọc kép, có thể lọc hiệu quả các tín hiệu phá vỡ giả để tránh bị đặt. RSI đầu tiên đảm bảo nằm trong khu vực bình thường, RSI thứ hai đảm bảo sức mạnh phá vỡ đủ lớn.
Kết hợp với xu hướng và chỉ số đảo ngược, bạn có thể tham gia khi xu hướng đảo ngược và tránh theo đuổi đà giảm.
Các nhà đầu tư có thể chọn lựa một số phương pháp để giảm bớt rủi ro của thị trường.
Các tham số của chiến lược này có thể được tối ưu hóa rộng rãi, có thể được tối ưu hóa cho các giống và chu kỳ khác nhau bằng cách điều chỉnh chu kỳ trung bình di chuyển, tỷ lệ chiều dài, tham số RSI, v.v., để có hiệu quả tốt hơn.
Chiến lược này có những rủi ro:
Khi sự đảo ngược xu hướng không rõ ràng, có thể tạo ra tín hiệu đảo ngược ảo, do đó gây ra tổn thất giao dịch. Bạn có thể điều chỉnh chu kỳ trung bình di chuyển thích hợp để làm cho tín hiệu đảo ngược rõ ràng hơn.
Các chỉ số có thể xuất hiện trong một thời gian dài trong khu vực, thường xuyên mở các vị trí hòa bình, tăng chi phí giao dịch và mất điểm trượt. Bạn có thể tăng cường độ lọc trong giai đoạn thu hồi bằng cách tối ưu hóa các tham số RSI.
Khi quay ngược chậm, sau khi tín hiệu quay ngược được phát ra, mất mát mở rộng thời gian và không gian. Bạn có thể tăng chênh lệch chu kỳ trung bình di chuyển, để tín hiệu được phát ra kịp thời hơn.
Các tham số được thiết lập không đúng lúc, có thể lọc một số tín hiệu chính xác, hoặc làm cho tín hiệu bị trì hoãn. Cần điều chỉnh tham số theo đặc điểm của các giống khác nhau.
Chiến lược này có thể được tối ưu hóa theo các khía cạnh sau:
Tối ưu hóa tham số trung bình di chuyển. Các tham số như độ dài chu kỳ của trung bình di chuyển, tỷ lệ chênh lệch chu kỳ, phương thức trung bình di chuyển (SMA hoặc EMA) có thể được tối ưu hóa để có được phán đoán xu hướng chính xác hơn.
Tối ưu hóa tham số RSI: có thể tối ưu hóa các tham số như chiều dài chu kỳ của RSI, vùng quá mua, vùng quá bán, vùng trung lập, để lọc chính xác hơn và hiệu quả hơn.
Tối ưu hóa chu kỳ thời gian. Bạn có thể thử nghiệm các chu kỳ thời gian khác nhau, chọn chu kỳ thời gian phù hợp nhất với chiến lược để có hiệu quả tốt nhất.
Tối ưu hóa giống. Bạn có thể điều chỉnh các tham số hoặc quy tắc tùy thuộc vào đặc điểm của các giống khác nhau để chiến lược có hiệu quả tối ưu cho giống đó.
Tăng cơ chế dừng lỗ. Dựa trên kết quả đánh giá lại, có thể đặt mức dừng lỗ hợp lý, kiểm soát rủi ro và lợi nhuận của một giao dịch.
Chiến lược giao dịch đường trung bình di chuyển của cầu vồng sử dụng sự kết hợp giữa phán đoán xu hướng và lọc tín hiệu để thực hiện hiệu quả của việc bắt tín hiệu tại điểm biến đổi xu hướng. Chiến lược này có tính năng phán đoán chính xác, có thể kiểm soát rủi ro, có thể trở thành một chiến lược giao dịch định lượng rất thực tế thông qua tối ưu hóa tham số và hoàn thiện quy tắc.
/*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