Cet article vous présentera une stratégie de trading quantitative appelée
Cette stratégie intègre quatre stratégies de négociation quantitatives communes:
Stratégie de rupture de canal: Construire des canaux supérieurs et inférieurs basés sur les prix les plus élevés et les plus bas au cours d'une certaine période et prendre des positions lorsque le prix sort du canal.
Stratégie de dynamique: déterminer la dynamique en fonction des variations de prix sur une certaine période, aller long lorsque les prix augmentent en accélération, aller court lorsque les prix baissent en accélération.
Stratégie MACD: Déterminer les positions longues et courtes en fonction de la croix dorée et de la croix morte du MACD.
Stratégie de modèle Harami: Identifier les revers futurs potentiels en reconnaissant des modèles de chandeliers spécifiques et en faisant des transactions autour des points tournants.
Chacune de ces stratégies présente des avantages qui, combinés, permettent d'obtenir des rendements plus stables.
La stratégie de rupture de canal peut capturer les tendances du marché; la stratégie de dynamique peut suivre en temps opportun les tendances à court terme; la stratégie MACD peut détecter les renversements de tendance à moyen terme; la stratégie Harami peut déterminer les points clés d'inversion.
En les intégrant dans une stratégie, vous pouvez poursuivre les hausses et tuer les chutes pendant les marchés tendance et ouvrir des positions inverses autour des points d'inflexion.
Bien entendu, ces combinaisons multi-stratégies présentent également certains inconvénients:
La stratégie est trop complexe et les paramètres sont difficiles à ajuster.
Certaines stratégies peuvent être en conflit.
Il augmente la fréquence des transactions et les coûts de transaction.
Les résultats des tests de retour peuvent être pires qu'une seule stratégie.
Par conséquent, lors de l'utilisation de cette combinaison de stratégies multiples, les utilisateurs doivent prêter attention à la difficulté d'ajustement des paramètres, tester l'interaction entre les conflits, contrôler la fréquence des transactions et effectuer un backtesting suffisant pour assurer sa stabilité à long terme.
En général, ce système de trading quantitatif multi-stratégie intégré peut obtenir des combinaisons de trading très riches et fonctionne très bien dans les grandes tendances. Il combine les avantages de différentes stratégies et peut obtenir des rendements positifs à long terme plus stables.
/*backtest start: 2023-09-07 00:00:00 end: 2023-09-14 00:00:00 period: 45m basePeriod: 5m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 //Channel breakout strategy("all_strategy", overlay=true) length = input(title="Length", minval=1, maxval=1000, defval=5) upBound = highest(high, length) downBound = lowest(low, length) if (not na(close[length])) strategy.entry("ChBrkLE", strategy.long, stop=upBound + syminfo.mintick, comment="ChBrkLE") strategy.entry("ChBrkSE", strategy.short, stop=downBound - syminfo.mintick, comment="ChBrkSE") //plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr) //Momentum length1 = input(12) price = close momentum(seria, length) => mom = seria - seria[length1] mom mom0 = momentum(price, length1) mom1 = momentum( mom0, 1) if (mom0 > 0 and mom1 > 0) strategy.entry("MomLE", strategy.long, stop=high+syminfo.mintick, comment="MomLE") else strategy.cancel("MomLE") if (mom0 < 0 and mom1 < 0) strategy.entry("MomSE", strategy.short, stop=low-syminfo.mintick, comment="MomSE") else strategy.cancel("MomSE") //plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr) //MACD Strategy fastLength = input(12) slowlength = input(26) MACDLength = input(9) MACD = ema(close, fastLength) - ema(close, slowlength) aMACD = ema(MACD, MACDLength) delta = MACD - aMACD if (crossover(delta, 0)) strategy.entry("MacdLE", strategy.long, comment="MacdLE") if (crossunder(delta, 0)) strategy.entry("MacdSE", strategy.short, comment="MacdSE") //plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr) //Harami pctDw = input(60,minval=0,maxval=90,title="Doji, Min % of Range of Candle for Wicks") pipMin= input(0,minval=0,title="Doji, Previous Candle Min Pip Body Size") sname=input(true,title="Show Price Action Bar Names") cbar = input(false,title="Highlight Harami & Doji Bars") sHm = input(false,title="Show Only Harami Style Doji's") setalm = input(true, title="Generate Alert for Harami & Doji Bars") uha =input(true, title="Use Heikin Ashi Candles for Calculations") bars = input(3,minval=1,maxval=3,step=1, title="Doji, Number of Lookback Bars") // // Use only Heikinashi Candles for all calculations srcclose = uha ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close srcopen = uha ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open srchigh = uha ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high srclow = uha ?security(heikinashi(syminfo.tickerid), timeframe.period, low) : low // pip = syminfo.mintick range = srchigh - srclow // Calculate Doji/Harami Candles pctCDw = (pctDw/2) * 0.01 pctCDb = (100-pctDw) * 0.01 //Lookback Candles for bulls or bears lbBull = bars==1? srcopen[1]>srcclose[1]: bars==2? (srcopen[1]>srcclose[1] and srcopen[2]>srcclose[2]): bars==3?(srcopen[1]>srcclose[1] and srcopen[2]>srcclose[2] and srcopen[3]>srcclose[3]):false lbBear = bars==1? srcopen[1]<srcclose[1]: bars==2? (srcopen[1]<srcclose[1] and srcopen[2]<srcclose[2]): bars==3?(srcopen[1]<srcclose[1] and srcopen[2]<srcclose[2] and srcopen[3]<srcclose[3]):false //Lookback Candle Size only if mininum size is > 0 lbSize = pipMin==0? true : bars==1 ? (abs(srcopen[1]-srcclose[1])>pipMin*pip) : bars==2 ? (abs(srcopen[1]-srcclose[1])>pipMin*pip and abs(srcopen[2]-srcclose[2])>pipMin*pip) : bars==3 ? (abs(srcopen[1]-srcclose[1])>pipMin*pip and abs(srcopen[2]-srcclose[2])>pipMin*pip and abs(srcopen[3]-srcclose[3])>pipMin*pip) : false dojiBu = (srcopen[1] >= max(srcclose,srcopen) and srcclose[1]<=min(srcclose,srcopen)) and lbSize and (abs(srcclose-srcopen)<range*pctCDb and (srchigh-max(srcclose,srcopen))>(pctCDw*range) and (min(srcclose,srcopen)-srclow)>(pctCDw*range))? 1 : 0 dojiBe = (srcclose[1] >= max(srcclose,srcopen) and srcopen[1]<=min(srcclose,srcopen)) and lbSize and (abs(srcclose-srcopen)<range*pctCDb and (srchigh-max(srcclose,srcopen))>(pctCDw*range) and (min(srcclose,srcopen)-srclow)>(pctCDw*range))? 1 : 0 haramiBull = (srcopen<=srcclose or (max(srcclose,srcopen)-min(srcclose,srcopen))<pip*0.5) and lbBull and dojiBu haramiBear = (srcopen>=srcclose or (max(srcclose,srcopen)-min(srcclose,srcopen))<pip*0.5) and lbBear and dojiBe dojiBull = not sHm and not haramiBull and not haramiBear and lbBull and dojiBu dojiBear = not sHm and not haramiBull and not haramiBear and lbBear and dojiBe // plotshape(haramiBear and sname?srchigh:na,title="Bearish Harami",text='Bearish\nHarami',color=red, style=shape.arrowdown,location=location.abovebar) plotshape(haramiBear and cbar?max(srcopen,srcclose):na,title="Bear Colour Harami",color=red, style=shape.circle,location=location.absolute,size=size.normal) // plotshape(haramiBull and sname?srclow:na,title="Bullish Harami",text='Bullish\nHarami',color=green, style=shape.arrowup,location=location.belowbar) plotshape(haramiBull and cbar?max(srcopen,srcclose):na,title="Bull Colour Harami",color=green, style=shape.circle,location=location.absolute,size=size.normal) // plotshape(dojiBear and sname?srchigh:na,title="Bearish Doji",text='Bearish\nDoji',color=fuchsia, style=shape.arrowdown,location=location.abovebar) plotshape(dojiBear and cbar?max(srcopen,srcclose):na,title="Bear Colour Doji",color=fuchsia, style=shape.circle,location=location.absolute,size=size.normal) // plotshape(dojiBull and sname?srclow:na,title="Bullish Doji",text='Bullish\nDoji',color=aqua, style=shape.arrowup,location=location.belowbar) plotshape(dojiBull and cbar?max(srcopen,srcclose):na,title="Bull Colour Doji",color=aqua, style=shape.circle,location=location.absolute,size=size.normal) // Only Alert harami Doji's bcolor = haramiBull ? 1 : haramiBear ? 2 : dojiBull ? 3 : dojiBear ? 4 : 0 baralert = setalm and bcolor>0 alertcondition(baralert,title="PACDOJI Alert",message="PACDOJI Alert") // plotshape(na(baralert[1])?na:baralert[1], transp=0,style=shape.circle,location=location.bottom, offset=-1,title="Bar Alert Confirmed", color=bcolor[1]==1 ? green : bcolor[1]==2? red : bcolor[1]==3? aqua : bcolor[1]==4? fuchsia : na) //EOF