Stratégie de négociation des moyennes mobiles arc-en-ciel

Auteur:ChaoZhang est là., Date: le 28 septembre 2023 à 11h01
Les étiquettes:

Résumé

La stratégie de trading de la moyenne mobile arc-en-ciel est conçue sur la base de l'indicateur de moyenne mobile arc-en-ciel.

La logique de la stratégie

La stratégie génère des signaux de trading à travers les étapes suivantes:

  1. Construisez le système de moyenne mobile arc-en-ciel. Il contient 7 moyennes mobiles. La première moyenne mobile a une période de 12 et prend le prix de clôture comme données de source. Les 6 autres moyennes mobiles ont des périodes décroissantes progressives de 3, avec la moyenne mobile précédente comme source.

  2. Déterminez la direction de la tendance. Si la première moyenne mobile est au sommet de l'arc-en-ciel, définissez-la comme tendance haussière. Si elle est au bas, définissez-la comme tendance baissière. Si elle est au milieu, définissez-la comme consolidation.

  3. Générer des signaux. Lorsque la tendance change de tendance haussière à tendance baissière, un signal de vente est généré. Lorsque la tendance change de tendance haussière à tendance haussière, un signal d'achat est généré. Lorsque la tendance change de consolidation à tendance haussière ou à tendance baissière, fermer la position existante.

  4. Le premier RSI doit être situé entre la zone de surachat et de survente pour éviter une fausse rupture. Le second RSI doit être en dehors de la zone moyenne pour assurer une forte dynamique.

Les avantages

Les avantages de cette stratégie sont les suivants:

  1. Le système de moyenne mobile arc-en-ciel identifie avec précision la direction de la tendance. Plusieurs moyennes mobiles se combinent pour filtrer le bruit du marché et l'inversion de tendance.

  2. Le mécanisme de double filtre RSI évite efficacement de faux signaux de rupture et de se retrouver piégé.

  3. La combinaison d'indicateurs de tendance et d'inversion permet une entrée en temps opportun à l'inversion de tendance, tout en évitant de poursuivre l'élan.

  4. La clôture active des positions lors de la consolidation évite le risque de marchés à fourchette.

  5. La stratégie offre un grand espace d'optimisation des paramètres, qui peut être ajusté pour différents produits et délais afin d'obtenir de meilleurs résultats.

Les risques

Les principaux risques de cette stratégie:

  1. Une inversion de tendance peu claire peut générer de faux signaux et causer des pertes.

  2. L'optimisation des paramètres RSI peut renforcer la filtration dans la consolidation.

  3. L'inversion retardée augmente les pertes après le signal initial.

  4. Des paramètres incorrects peuvent filtrer les signaux corrects ou provoquer un retard de signal.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Optimisation des paramètres de la moyenne mobile, y compris la durée de la période, le ratio de la période, le type de MA, etc., pour rendre le jugement de la tendance plus précis.

  2. Optimisation des paramètres du RSI, y compris la période, les niveaux de surachat/survente, la zone neutre, etc., pour rendre la filtration plus précise.

  3. Optimisation du délai, pour trouver le délai optimal.

  4. Optimisation des produits, afin d'ajuster les paramètres et les règles pour les adapter au mieux aux différents produits.

  5. Ajout d'un stop-loss et d'une prise de profit pour contrôler le risque et la taille du profit.

Conclusion

La stratégie de trading de la moyenne mobile arc-en-ciel combine la détermination de la tendance et le filtrage des signaux pour capturer efficacement les signaux d'inversion.


/*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

Plus de