La stratégie de négociation des moyennes mobiles arc-en-ciel est basée sur la conception des moyennes mobiles arc-en-ciel. La stratégie consiste à construire un système de moyennes mobiles arc-en-ciel contenant 7 moyennes mobiles pour déterminer la direction de la tendance, en combinaison avec l’indicateur RSI pour filtrer les faux signaux et permettre une entrée de négociation à faible risque.
La stratégie consiste principalement à générer des signaux de transaction par les étapes suivantes:
Construction d’un système de moyennes mobiles arc-en-ciel. Le système contient 7 moyennes mobiles, dont la première moyenne mobile a une période de 12, la source étant la moyenne du prix de clôture. Les 6 autres moyennes mobiles ont une période de 3 cycles décroissants, la source étant la valeur de la moyenne mobile précédente.
Déterminer la direction de la tendance. Si la première moyenne mobile est située au sommet de la moyenne mobile arc-en-ciel, elle est définie comme une tendance à la hausse; si elle est située au bas, elle est définie comme une tendance à la baisse; si elle est située au milieu, elle est définie comme un repli.
Générer un signal de transaction. Lorsque la tendance du système de moyenne mobile arc-en-ciel passe de hausse à baisse, générer un signal de vente. Lorsque la tendance passe de baisse à hausse, générer un signal d’achat.
Les filtres RSI acceptent les signaux de négociation uniquement lorsque l’indicateur RSI indique une situation normale. Le premier RSI exige qu’il soit situé entre les zones de survente et de vente, afin d’éviter de fausses ruptures. Le second RSI exige qu’il ne soit pas situé dans la zone intermédiaire, afin d’assurer une dynamique suffisante pour la rupture.
Cette stratégie présente les avantages suivants:
Le système de moyenne mobile Rainbow permet de déterminer avec précision la direction de la tendance. Plusieurs combinaisons de moyennes mobiles permettent de filtrer efficacement le bruit du marché et d’identifier le renversement de tendance.
Le RSI a un double mécanisme de filtrage qui permet de filtrer efficacement les faux signaux de rupture et d’éviter d’être piégé. Le premier RSI assure une zone normale et le second RSI assure une force de rupture suffisante.
La combinaison d’un indicateur de tendance et d’un indicateur d’inversion permet d’entrer en jeu en temps opportun lorsque la tendance se retourne et d’éviter de poursuivre la chute.
Le risque de liquidation du marché par la sélection régionale peut être évité en se positionnant activement au moment de la liquidation.
Il est possible d’optimiser les paramètres de la stratégie en ajustant les cycles des moyennes mobiles, le rapport de longueur, les paramètres RSI, etc., pour obtenir de meilleurs résultats pour différentes variétés et périodes.
La stratégie présente principalement les risques suivants:
Il est possible de générer des signaux de retournement illusoires lorsque le retournement de tendance n’est pas évident, ce qui entraîne des pertes de trading. Il est possible d’ajuster la période des moyennes mobiles de manière appropriée pour rendre les signaux de retournement plus clairs.
L’émergence d’un indicateur pendant une longue période de liquidation régionale entraîne une ouverture fréquente de positions de paix, augmentant les coûts de transaction et la perte de points de glissement. L’intensité de filtration de la phase de liquidation peut être augmentée en optimisant les paramètres du RSI.
Le retard de réversion augmente le temps et l’espace de perte après l’émission du signal de réversion. Il peut augmenter la différence de cycle de la moyenne mobile, ce qui rend le signal plus rapide.
Si les paramètres ne sont pas réglés à ce moment-là, ils peuvent filtrer une partie du signal correct ou entraîner un retard. Il est nécessaire d’ajuster les paramètres en fonction des caractéristiques des différentes variétés.
Cette stratégie peut être optimisée dans les domaines suivants:
Optimisation des paramètres des moyennes mobiles. Vous pouvez optimiser des paramètres tels que la longueur des cycles des moyennes mobiles, le taux de variation des cycles, la manière dont les moyennes mobiles (SMA ou EMA) sont calculées, afin d’obtenir un jugement de tendance plus précis.
Optimisation des paramètres RSI. Optimisation des paramètres tels que la longueur de cycle du RSI, les zones de survente, les zones de survente et les zones neutres, afin de rendre le filtrage plus précis et plus efficace.
Optimisation des cycles de temps. Vous pouvez tester différents cycles de temps et choisir celui qui convient le mieux à la stratégie pour obtenir les meilleurs résultats.
Optimisation des variétés: les stratégies peuvent être adaptées en fonction des caractéristiques, paramètres ou règles des différentes variétés afin d’obtenir les meilleurs résultats pour la variété concernée.
Augmentation du mécanisme d’arrêt des pertes. Selon les résultats des tests de retour, un niveau raisonnable d’arrêt des pertes peut être défini pour contrôler les risques et les bénéfices d’une seule transaction.
La stratégie Rainbow Moving Average utilise une combinaison de jugement de tendance et de filtrage de signal pour capturer les signaux aux points de basculement de la tendance. La stratégie a des caractéristiques de jugement précis, de contrôle du risque, d’optimisation des paramètres et de perfectionnement des règles, ce qui en fait une stratégie de trading quantitative très pratique.
/*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