레인보우 이동 평균 거래 전략


생성 날짜: 2023-09-28 11:01:59 마지막으로 수정됨: 2023-09-28 11:01:59
복사: 0 클릭수: 757
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

무지개 이동 평균 거래 전략은 무지개 이동 평균 지표에 기반하여 설계되었다. 이 전략은 7 개의 이동 평균을 포함하는 무지개 이동 평균 시스템을 구축하여 트렌드 방향을 판단하고 RSI 지표와 함께 가짜 신호를 필터링하여 낮은 위험 거래 입장을 구현한다.

전략 원칙

이 전략은 주로 다음과 같은 몇 가지 단계를 통해 거래 신호를 생성합니다.

  1. 무지개 이동 평균 시스템을 구축한다. 이 시스템은 7 개의 이동 평균을 포함하고 있는데, 그 중 첫 번째 이동 평균의 주기는 12이며, 소스 데이터는 종결 가격의 평균이다. 나머지 6 개의 이동 평균의 주기는 3 개의 주기를 연속으로 감소시키고, 소스 데이터는 전의 이동 평균의 값이다.

  2. 트렌드 방향을 판단한다. 첫 번째 이동 평균이 무지개 이동 평균의 가장 위에 있다면, 상승 추세로 정의된다. 가장 아래에 있다면, 하향 추세로 정의된다.

  3. 거래 신호를 생성한다. 무지개 이동 평균 시스템의 추세가 상승에서 하락으로 바뀌면 판매 신호를 생성한다. 추세가 하락에서 상승으로 바뀌면 구매 신호를 생성한다. 추세가 정렬에서 상승 또는 하락으로 바뀌면 현재 위치를 평행한다.

  4. RSI 필터. RSI 지표가 정상적으로 표시될 때만 거래 신호를 받아들인다. 첫 번째 RSI 지표는 가짜 브레이크를 피하기 위해 상위권과 상위권 사이에 위치하도록 요구한다. 두 번째 RSI는 중간 영역에 위치하지 않도록 요구하며, 브레이크의 동력이 충분하다는 것을 보장한다.

전략적 이점

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 무지개 이동 평균 시스템은 트렌드 방향을 정확하게 판단할 수 있다. 여러 이동 평균 조합은 시장 소음을 효과적으로 필터링하고 트렌드 반전을 식별할 수 있다.

  2. RSI 지표는 듀얼 필터링 메커니즘으로, 가짜 돌파 신호를 효과적으로 필터링하여, 을 피할 수 있다. 첫 번째 RSI는 정상 영역에 위치하고, 두 번째 RSI는 돌파 힘이 충분히 크다는 것을 보장한다.

  3. 트렌드와 반전 지표가 결합되어 트렌드가 변할 때 적시에 입금할 수 있고, 추락을 쫓는 것을 피할 수 있다.

  4. 정리 단계에 적극적으로 평지 포지션을 설정하면 region selection가 시장을 정리하는 위험을 피할 수 있습니다.

  5. 이 전략의 매개 변수를 최적화 할 수있는 공간이 넓고, 이동 평균 주기, 길이 비율, RSI 매개 변수 등을 조정하여 다른 품종과 주기에 대해 최적화 할 수 있으므로 더 나은 효과를 얻을 수 있습니다.

전략적 위험

이 전략에는 다음과 같은 위험들이 있습니다.

  1. 트렌드 반전이 눈에 띄지 않을 때, 잘못된 반전 신호가 발생하여 거래 손실이 발생할 수 있습니다. 이동 평균 주기를 적절히 조정하여 반전 신호를 더 명확하게 할 수 있습니다.

  2. 지표의 출현은 장기간 지역 정리할 때, 빈번하게 평화 포지션을 열고 거래 비용과 슬라이드 포인트 손실을 증가시킨다. RSI 파라미터를 최적화함으로써 정리 단계의 필터링 강도를 증가시킬 수 있다.

  3. 반전 지연 시, 반전 신호가 발송된 후, 손실이 확대되는 시간과 공간. 이동 평균의 주기적 차이는 커질 수 있어 신호가 발송되는 시간이 더 적당하다.

  4. 매개 변수가 설정되어 있지 않으면 일부 올바른 신호를 필터링하거나 신호를 지연시킬 수 있습니다. 다양한 품종의 특성에 따라 매개 변수를 조정해야 합니다.

최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 이동 평균 파라미터 최적화. 이동 평균의 주기 길이나, 주기 차이의 비율, 이동 평균 방식 (SMA 또는 EMA) 과 같은 파라미터를 최적화하여 보다 정확한 추세 판단을 얻을 수 있다.

  2. RSI 매개 변수 최적화. RSI의 주기 길이, 오버 바이 지역, 오버 셀 지역, 중립 지역 등의 매개 변수를 최적화하여 필터링을 더 정확하고 효과적으로 할 수 있다.

  3. 시간주기 최적화. 다양한 시간주기를 테스트하여 전략에 가장 적합한 시간주기를 선택하여 최적의 효과를 얻을 수 있습니다.

  4. 품종 최적화. 다양한 품종의 특성에 따라, 매개 변수 또는 규칙을 조정하여 그 품종에 최적의 효과를 줄 수 있습니다.

  5. 추가된 스톱스톱 메커니즘. 재검토 결과에 따라 합리적인 스톱스톱 레벨을 설정하여 단일 거래의 위험과 수익의 크기를 제어할 수 있다.

요약하다

무지개 이동 평균 거래 전략은 트렌드 판단과 신호 필터링을 결합하여 트렌드 전환점에서 신호를 잡는 효과를 달성합니다. 이 전략은 판단 정확도, 위험 제어 가능한 특징을 가지고 있으며, 매개 변수 최적화 및 규칙 개선을 통해 매우 실용적인 정량 거래 전략이 될 수 있습니다.

전략 소스 코드
/*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