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

저자:차오장, 날짜: 2023-09-28 11:01:59
태그:

전반적인 설명

레인보우 이동 평균 거래 전략은 레인보우 이동 평균 지표에 기반하여 설계되었습니다. 이 전략은 7 개의 이동 평균을 가진 레인보우 이동 평균 시스템을 통해 트렌드 방향을 식별하고 낮은 위험 진입을 달성하기 위해 RSI 지표로 잘못된 신호를 필터합니다.

전략 논리

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

  1. 무지개 이동 평균 시스템을 구축하십시오. 7 개의 이동 평균을 포함합니다. 첫 번째 이동 평균은 12의 기간을 가지고 있으며 종료 가격을 원천 데이터로 사용합니다. 나머지 6 개의 이동 평균은 이전 이동 평균을 원천으로 3의 점차 감소 기간을 가지고 있습니다.

  2. 트렌드 방향을 결정합니다. 첫 이동 평균이 무지개 위에 있다면 상승 추세로 정의하십시오. 밑에 있다면 하락 추세로 정의하십시오. 중간에 있다면 통합으로 정의하십시오.

  3. 신호를 생성한다. 트렌드가 상승세에서 하락세로 변할 때 판매 신호가 생성된다. 트렌드가 하락세에서 상승세로 변할 때 구매 신호가 생성된다. 트렌드가 통합에서 상승세 또는 하락세로 변할 때 기존 포지션을 닫는다.

  4. RSI 필터. RSI가 정상적인 상태를 표시 할 때만 신호를 받아 들인다. 첫 번째 RSI는 거짓 브레이크오웃을 피하기 위해 과소매와 과소매 구역 사이에 있어야합니다. 두 번째 RSI는 강한 추진력을 보장하기 위해 중부 구역 밖에서 있어야합니다.

장점

이 전략의 장점은 다음과 같습니다.

  1. 무지개 이동 평균 시스템은 트렌드 방향을 정확하게 식별합니다. 여러 이동 평균은 시장 소음과 스팟 트렌드 반전을 필터링하기 위해 결합됩니다.

  2. 이중 RSI 필터 메커니즘은 잘못된 브레이크아웃 신호와 함락되는 것을 효과적으로 방지합니다. 첫 번째 RSI는 정상적인 구역에 있음을 보장하고 두 번째 RSI는 충분히 강한 추진력을 보장합니다.

  3. 트렌드와 역전 지표를 결합하면 트렌드 역전 시점에 적시에 진입 할 수 있으며, 추진력을 쫓는 것을 피합니다.

  4. 연립 중 적극적인 포지션 폐쇄는 범위 제한 시장의 위험을 피합니다.

  5. 이 전략은 더 나은 결과를 얻기 위해 다양한 제품과 시간 프레임에 맞춰 큰 매개 변수 최적화 공간을 제공합니다.

위험성

이 전략의 주요 위험은:

  1. 불분명한 트렌드 반전은 잘못된 신호를 생성하고 손실을 유발할 수 있습니다. 이동 평균 기간을 조정하면 반전 신호가 더 명확해질 수 있습니다.

  2. 긴 통합 중 빈번하게 열고 닫는 것은 비용과 미끄러짐을 증가시킵니다. RSI 매개 변수를 최적화하면 통합에서 필터레이션을 강화 할 수 있습니다.

  3. 지연된 반전은 초기 신호 이후 손실을 증가시킵니다. 이동 평균 기간 차이를 증가하면 신호가 시간적으로 증가합니다.

  4. 잘못된 매개 변수 설정은 올바른 신호를 필터링하거나 신호 지연을 유발할 수 있습니다. 매개 변수는 제품 캐릭터에 따라 조정해야합니다.

최적화 방향

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

  1. 이동 평균 매개 변수 최적화, 기간 길이, 기간 비율, MA 유형 등, 추세 판단을 더 정확하게 하기 위해.

  2. 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

더 많은