Cette stratégie utilise la pente de la moyenne mobile (MA) et la pente des indicateurs d'élan pour les décisions de trading. Elle compare la pente de MA et la pente d'élan avec des seuils définis, et génère des signaux de trading lorsque les deux pistes dépassent les seuils. La stratégie contient également un filtre à faible volatilité qui utilise une MA différente pour générer des signaux lorsque la volatilité du marché est faible.
Le noyau de cette stratégie réside dans la comparaison de deux courbes de pente. Premièrement, il calcule la pente de l'indicateur de MA et de momentum. La pente reflète le taux de changement et la direction de la courbe. Ensuite, deux seuils sont utilisés, lorsque la pente de MA et la pente de momentum dépassent les seuils correspondants, des signaux de trading sont générés.
Par exemple, lorsque la pente de MA et la pente de moment dépassent la ligne supérieure, un signal d'achat est généré; lorsque les deux courbes tombent en dessous de la ligne inférieure, un signal de vente est généré.
Le filtre à faible volatilité utilise un MA à long terme pour déterminer la volatilité du marché.
Cette stratégie présente les avantages suivants:
Le double filtre pour la mise en place des signaux de trading peut filtrer un peu de bruit et améliorer la qualité du signal.
Le filtre à faible volatilité permet à la stratégie de s'adapter avec élasticité aux différentes conditions du marché.
Une grande personnalisation pour différents paramètres peut être optimisée pour différents produits.
Il ne contient pas de fonction de repeinture pour réduire l'impact du montage en courbe.
Cette stratégie comporte également des risques:
Le double filtre peut filtrer certains signaux réels et manquer des opportunités.
La détermination du seuil du filtre à faible volatilité doit être soigneusement testée, car des réglages incorrects peuvent provoquer des écarts de signal.
Les paramètres des indicateurs de MA et de momentum doivent être optimisés pour des produits spécifiques, et les paramètres universels sont difficiles à déterminer.
La fonction de ne pas repeindre ne peut pas éviter complètement le problème de l'ajustement de la courbe de backtest, et les performances réelles du trading doivent encore être vérifiées.
Une grande personnalisation augmente la complexité de l'espace paramétrique et la difficulté d'optimisation.
La stratégie peut être optimisée dans les directions suivantes:
Testez plus de combinaisons d'indicateurs MA et de momentum pour trouver les meilleurs indicateurs correspondants.
Optimiser les paramètres de longueur des indicateurs de MA et de momentum pour équilibrer le décalage et le bruit.
Optimiser les paramètres de calcul de la pente pour trouver des combinaisons d'indicateurs plus stables.
Tester différents indicateurs et paramètres de faible volatilité pour améliorer l'élasticité.
Test sur différents produits et délais afin de trouver le meilleur champ d'application.
Construire des mécanismes adaptatifs de paramètres pour réduire la charge de travail d'optimisation manuelle.
Il s'agit d'une stratégie de double MA très flexible et personnalisable. Elle renvoie à la fois aux informations sur le prix et l'élan pour la prise de décision, ce qui peut filtrer efficacement les faux signaux. Le filtre à faible volatilité rend également la stratégie plus élastique pour s'adapter aux changements du marché.
Avec des améliorations dans l'optimisation des paramètres et la sélection des indicateurs, cette stratégie peut devenir un choix viable pour le trading dans la vie réelle.
/*backtest start: 2023-11-12 00:00:00 end: 2023-12-12 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © Allenlk //@version=4 strategy("DRSI DMA Scalping Strategy", shorttitle="DRSIDMA", overlay=false, initial_capital=1000, pyramiding=2, default_qty_type=strategy.percent_of_equity, default_qty_value=100) //Inputs matype = input(7, minval=1, maxval=8, title="1=SMA, 2=EMA, 3=WMA, 4=HullMA, 5=VWMA, 6=RMA, 7=TEMA, 8=Tilson T3", group="Moving Average") masrc = input(close, title="MA Source", group="Moving Average") malen = input(5, title="Moving Average Length - LookBack Period", group="Moving Average") factorT3 = input(defval=7, title="Tilson T3 Factor - *.10 - so 7 = .7 etc.", minval=0, group="Moving Average") maderiv = input(3, title="MA Slope Lookback", minval=1, group="Moving Average") masmooth = input(5, title="MA Slope Smoothing", minval=1, group="Moving Average") momtype = input(3, minval=1, maxval=3, title="1=RSI, 2=CCI, 3=RSI/ROC", group="Momentum Moving Average") momsrc = input(close, title="Momentum Source", group="Momentum Moving Average") momlen = input(3, title="Momentum Length", minval=1, group="Momentum Moving Average") momderiv = input(8, title="Momentum Slope Lookback", minval=1, group="Momentum Moving Average") momsmooth = input(7, title="Momentum Slope Smoothing", minval=1, group="Momentum Moving Average") higherTf = input("1", title="Higher timeframe?", type = input.resolution, group="Time Resolution") higherTfmult = input(130, title="MA Slope multiplier for Alternate Resolutions (Make the waves of the blue line similar size as the orange line)", group="Time Resolution") buffup = input(0.02, title="Buy when both slopes cross this line", step=0.01, group="Buy and Sell Threshold") bufflow = input(-0.03, title="Sell when both slopes cross this line", step=0.01, group="Buy and Sell Threshold") lowVolMALength = input(28, title="Big MA Length", minval=1, group="Low Volatility Function") MAlength = input(10, title="Low Volatility Moving Average Length", minval=1, group="Low Volatility Function") MAThresh = input(0.05, title="Low Volatility Buy and Sell Threshold", step=0.01, group="Low Volatility Function") Volminimum = input(2.5, title="Minimum volatility to trade", minval=0, step=0.01, group="Low Volatility Function") //Low Volatility Function //When Volatility is low refer to the slope of a long moving average low_vol_MA = sma(close, lowVolMALength) low_vol_down = (low_vol_MA[3] - low_vol_MA[1]) > MAThresh low_vol_up = (low_vol_MA[3] - low_vol_MA[1]) < MAThresh * -1 percent_volatility = (1 - (low / high)) * 100 chng_MA = sma(percent_volatility, MAlength) bad_vol = chng_MA < Volminimum //No repaint function nrp_funct(_symbol, _res, _src) => security(_symbol, _res, _src[barstate.isrealtime ? 1 : 0]) //hull ma definition hullma = wma(2*wma(masrc, malen/2)-wma(masrc, malen), round(sqrt(malen))) //TEMA definition ema1 = ema(masrc, malen) ema2 = ema(ema1, malen) ema3 = ema(ema2, malen) tema = 3 * (ema1 - ema2) + ema3 //Tilson T3 factor = factorT3 *.10 gd(masrc, malen, factor) => ema(masrc, malen) * (1 + factor) - ema(ema(masrc, malen), malen) * factor t3(masrc, malen, factor) => gd(gd(gd(masrc, malen, factor), malen, factor), malen, factor) tilT3 = t3(masrc, malen, factor) //MA Type avg = matype == 1 ? sma(masrc,malen) : matype == 2 ? ema(masrc,malen) : matype == 3 ? wma(masrc,malen) : matype == 4 ? hullma : matype == 5 ? vwma(masrc, malen) : matype == 6 ? rma(masrc,malen) : matype == 7 ? 3 * (ema1 - ema2) + ema3 : tilT3 //MA Slope Percentage DeltaAvg = (avg / avg[maderiv]) - 1 SmoothedAvg = sma(DeltaAvg, masmooth) MAout = nrp_funct(syminfo.tickerid, higherTf, SmoothedAvg) * higherTfmult //Momentum indicators Momentum = momtype == 1 ? rsi(momsrc, momlen) : momtype == 2 ? cci(momsrc, momlen) : momtype == 3 ? rsi(roc(momsrc,momlen),momlen) : na //Momentum Slope Percentage Deltamom = (Momentum / Momentum[momderiv]) - 1 SmoothedMom = sma(Deltamom, momsmooth) Momout = nrp_funct(syminfo.tickerid, higherTf, SmoothedMom) //Plottings plot(buffup, color=color.green, title="Buy line") plot(bufflow, color=color.red, title="Sell line") plot(MAout, color=color.blue, linewidth=2, title="MA Slope") plot(Momout, color=color.orange, linewidth=2, title="Momentum Slope") longCondition = bad_vol ? low_vol_up : MAout > buffup and Momout > buffup if (longCondition) strategy.entry("Buy", strategy.long) shortCondition = bad_vol ? low_vol_down : MAout < bufflow and Momout < bufflow if (shortCondition) strategy.entry("Sell", strategy.short)