A estratégia de negociação da Rainbow Moving Average é baseada no design do indicador Rainbow Moving Average. A estratégia determina a direção da tendência através da construção de um sistema de média móvel Rainbow Moving Average que contém 7 médias móveis, em conjunto com o indicador RSI para filtrar os falsos sinais e permitir a entrada de negociação de baixo risco.
A estratégia consiste na geração de sinais de negociação através das seguintes etapas:
Construir um sistema de médias móveis em arco-íris. O sistema contém 7 médias móveis, sendo que a primeira média móvel tem um período de 12, e a fonte é a média do preço de fechamento. As outras 6 médias móveis têm um período de 3 ciclos decrescente, e a fonte é o valor da média móvel anterior.
Determine a direção da tendência. Se a primeira média móvel estiver na parte superior da média móvel arco-íris, é definida como tendência ascendente; se estiver na parte inferior, é definida como tendência descendente; se estiver no meio, é definida como equilíbrio.
Geração de sinais de negociação. Quando a tendência do sistema de médias móveis do arco-íris muda de alta para baixa, gera um sinal de venda; Quando a tendência muda de baixa para alta, gera um sinal de compra; Quando a tendência muda de equilíbrio para alta ou baixa, compensa a posição atual.
O filtro RSI. Só aceita sinais de negociação quando o indicador RSI mostra uma situação normal. O primeiro indicador RSI exige que ele esteja entre as áreas de sobrecompra e venda, evitando falsas rupturas; o segundo RSI exige que ele não esteja na região intermédia, garantindo que a dinâmica de ruptura seja suficiente.
A estratégia tem as seguintes vantagens:
O sistema de média móvel do arco-íris pode determinar com precisão a direção da tendência. A combinação de várias médias móveis pode filtrar eficazmente o ruído do mercado e identificar a reversão da tendência.
O RSI indica um mecanismo de dupla filtragem, que pode filtrar de forma eficaz os falsos sinais de ruptura, evitando ser encaixado. O primeiro RSI garante que esteja na região normal, o segundo RSI garante que a ruptura seja grande o suficiente.
A combinação de tendências e indicadores de reversão permite a entrada em tempo hábil em caso de reversão de tendências, evitando assim a busca de quedas.
O risco de uma regionseleção para liquidar o mercado pode ser evitado com a eliminação de posições na fase de liquidação.
A estratégia tem um amplo espaço para otimização de parâmetros, que podem ser melhorados para diferentes variedades e períodos, ajustando o ciclo da média móvel, a proporção de duração, os parâmetros do RSI, etc., para obter melhores resultados.
A estratégia tem os seguintes riscos:
Quando a reversão de tendência não é visível, pode-se gerar um falso sinal de reversão, resultando em perdas de negociação. Pode-se ajustar adequadamente o ciclo da média móvel para tornar o sinal de reversão mais claro.
A ocorrência de indicadores de longo período de liquidação regional, com a abertura frequente de posições de paz, aumenta os custos de negociação e a perda de ponto de deslizamento. Pode-se aumentar a intensidade de filtragem da fase de liquidação, otimizando os parâmetros RSI.
Quando a inversão é retardada, o tempo e o espaço de expansão dos prejuízos após a emissão do sinal de inversão podem aumentar a diferença de ciclo da média móvel, fazendo com que o sinal seja mais oportuno.
Se os parâmetros não forem definidos no momento, eles podem filtrar parte do sinal correto ou gerar atraso no sinal. Os parâmetros devem ser ajustados de acordo com as características de diferentes variedades.
A estratégia pode ser melhorada em vários aspectos:
Otimização de parâmetros de média móvel. Pode-se otimizar o comprimento do ciclo da média móvel, a proporção de diferença de ciclo, a maneira como a média móvel (SMA ou EMA) para obter um julgamento de tendência mais preciso.
Otimizar os parâmetros do RSI. Pode otimizar o RSI em termos de comprimento de ciclo, zona de sobrecompra, zona de sobrevenda, zona de neutralidade, etc., para que a filtragem seja mais precisa e eficaz.
Otimização do ciclo de tempo. Você pode testar diferentes períodos de tempo e escolher o período de tempo mais adequado para a estratégia para obter o melhor resultado.
Optimização de variedades. Pode-se ajustar parâmetros ou regras de acordo com as características de diferentes variedades, para que a estratégia tenha o melhor efeito para a variedade.
Aumentar o mecanismo de stop loss. De acordo com os resultados do teste de retorno, pode-se definir um nível razoável de stop loss para controlar o risco e a receita de cada transação.
A estratégia de negociação de média móvel do arco-íris usa a combinação de julgamento de tendência e filtragem de sinal para capturar sinais em pontos de mudança de tendência. A estratégia possui características de julgamento preciso, controle de risco e otimização de parâmetros e aperfeiçoamento de regras, podendo ser uma estratégia de negociação quantitativa muito prática.
/*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