Chiến lược giao dịch trung bình chuyển động cầu vồng

Tác giả:ChaoZhang, Ngày: 2023-09-28 11:01:59
Tags:

Tổng quan

Chiến lược giao dịch Mức trung bình chuyển động cầu vồng được thiết kế dựa trên chỉ số Mức trung bình chuyển động cầu vồng. Chiến lược này xác định hướng xu hướng thông qua hệ thống Mức trung bình chuyển động cầu vồng với 7 mức trung bình chuyển động, và lọc ra các tín hiệu sai với chỉ số RSI để đạt được bước nhập rủi ro thấp.

Chiến lược logic

Chiến lược tạo ra tín hiệu giao dịch thông qua các bước sau:

  1. Xây dựng hệ thống trung bình chuyển động cầu vồng. Nó chứa 7 trung bình chuyển động. Trung bình chuyển động đầu tiên có khoảng thời gian 12 và lấy giá đóng như dữ liệu nguồn. 6 trung bình chuyển động khác có khoảng thời gian giảm dần 3, với trung bình chuyển động trước đó là nguồn.

  2. Xác định hướng xu hướng. Nếu đường trung bình động đầu tiên nằm trên đỉnh cầu vồng, hãy định nghĩa nó là xu hướng tăng. Nếu ở dưới, hãy định nghĩa nó là xu hướng giảm. Nếu ở giữa, hãy định nghĩa nó là củng cố.

  3. Tạo tín hiệu. Khi xu hướng thay đổi từ xu hướng tăng lên xu hướng giảm, một tín hiệu bán được tạo ra. Khi xu hướng thay đổi từ xu hướng giảm lên xu hướng tăng, một tín hiệu mua được tạo ra. Khi xu hướng thay đổi từ hợp nhất sang xu hướng tăng hoặc xu hướng giảm, đóng vị trí hiện có.

  4. Bộ lọc RSI. Chỉ chấp nhận tín hiệu khi RSI hiển thị trạng thái bình thường. RSI đầu tiên nên nằm giữa vùng mua quá mức và bán quá mức để tránh đột phá sai. RSI thứ hai nên nằm ngoài vùng giữa để đảm bảo đà tăng mạnh.

Ưu điểm

Những lợi thế của chiến lược này bao gồm:

  1. Hệ thống đường trung bình chuyển động cầu vồng xác định chính xác hướng xu hướng. Nhiều đường trung bình chuyển động kết hợp để lọc tiếng ồn thị trường và đảo ngược xu hướng.

  2. Cơ chế lọc RSI kép có hiệu quả tránh các tín hiệu đột phá sai và bị mắc kẹt. RSI đầu tiên đảm bảo ở trong vùng bình thường trong khi RSI thứ hai đảm bảo động lực đủ mạnh.

  3. Kết hợp các chỉ số xu hướng và đảo ngược cho phép nhập vào kịp thời khi đảo ngược xu hướng, trong khi tránh theo đuổi đà.

  4. Việc đóng thế tích cực trong quá trình củng cố tránh rủi ro của các thị trường giới hạn phạm vi.

  5. Chiến lược cung cấp không gian tối ưu hóa tham số lớn, có thể được điều chỉnh cho các sản phẩm và khung thời gian khác nhau để đạt được kết quả tốt hơn.

Rủi ro

Những rủi ro chính của chiến lược này:

  1. Sự đảo ngược xu hướng không rõ ràng có thể tạo ra các tín hiệu sai và gây ra tổn thất.

  2. Việc mở và đóng thường xuyên trong quá trình hợp nhất dài làm tăng chi phí và trượt.

  3. Sự đảo ngược chậm làm tăng tổn thất sau tín hiệu ban đầu.

  4. Cài đặt tham số không chính xác có thể lọc các tín hiệu chính xác hoặc gây ra sự chậm trễ tín hiệu.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Tối ưu hóa tham số trung bình động, bao gồm độ dài giai đoạn, tỷ lệ giai đoạn, loại MA v.v., để đánh giá xu hướng chính xác hơn.

  2. Tối ưu hóa tham số RSI, bao gồm thời gian, mức mua quá mức / bán quá mức, vùng trung tính vv, để làm lọc chính xác hơn.

  3. Tối ưu hóa khung thời gian, để tìm khung thời gian tối ưu.

  4. Tối ưu hóa sản phẩm, để điều chỉnh các tham số và quy tắc phù hợp nhất với các sản phẩm khác nhau.

  5. Thêm dừng lỗ và lấy lợi nhuận để kiểm soát rủi ro và kích thước lợi nhuận.

Kết luận

Chiến lược giao dịch trung bình chuyển động cầu vồng kết hợp xác định xu hướng và lọc tín hiệu để nắm bắt các tín hiệu đảo ngược một cách hiệu quả. Với phán đoán chính xác và rủi ro có thể kiểm soát được, chiến lược này có thể trở nên rất thực tế sau khi điều chỉnh tham số và tinh chỉnh logic. Nhìn chung, nó đáng nghiên cứu và áp dụng sâu sắ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

Thêm nữa