Cette stratégie génère des signaux longs et courts par le biais de moyennes mobiles doubles et implémente un suivi de stop loss.
Cette stratégie utilise hl2 comme prix source et calcule l'ATR d'une certaine période comme la plage de stop loss. Les bandes supérieures et inférieures sont calculées en fonction de l'ATR multiplié par un certain facteur. Lorsque le prix dépasse la bande supérieure, un signal d'achat est généré pour aller long. Lorsque le prix dépasse la bande inférieure, un signal de vente est généré pour aller court.
Après avoir ouvert des positions, le stop loss est ajusté en temps réel en fonction des changements dans l'ATR pour atteindre un stop loss de suivi. Plus précisément, après avoir passé long, la bande inférieure est progressivement augmentée en fonction du dernier bas pour suivre le stop loss. Après avoir passé court, la bande supérieure est progressivement abaissée en fonction du dernier haut pour suivre le stop loss.
Cette stratégie utilise pleinement la capacité des moyennes mobiles à déterminer la direction de la tendance et intègre également le mécanisme de suivi des arrêts de perte basé sur l'ATR pour assurer la direction des transactions et le contrôle des risques.
Le plus grand avantage de cette stratégie réside dans le contrôle des risques. Les stratégies de moyennes mobiles traditionnelles ne prennent en compte que les jugements directionnels et peuvent facilement faire exploser les comptes. En incorporant l'ATR pour suivre le stop loss, cette stratégie peut ajuster dynamiquement le stop loss en fonction de la volatilité du marché pour contrôler efficacement les risques de trading.
En outre, cette stratégie combine le trading bidirectionnel. Par rapport aux stratégies unidirectionnelles, elle peut rapidement ajuster les directions de la position lorsque les tendances s'inversent, évitant d'être piégé dans une direction et améliorant la rentabilité de la stratégie.
Les principaux risques de cette stratégie proviennent des paramètres de réglage de la période ATR et du multiplicateur. Si la période ATR est trop courte ou le multiplicateur trop grand, la plage de stop loss serait trop petite pour contrôler efficacement les risques. Si la période ATR est trop longue ou le multiplicateur trop petit, le stop loss serait trop lâche pour réaliser un profit.
Les risques peuvent être gérés en optimisant la période d'ATR et le multiplicateur pour équilibrer les objectifs de stop loss et de profit, et en incorporant d'autres indicateurs pour filtrer les fausses ruptures et améliorer la qualité du signal.
Cette stratégie peut être améliorée par les aspects suivants:
Optimiser les périodes de moyenne mobile pour trouver la meilleure combinaison de paramètres.
Ajouter d'autres indicateurs comme MACD, KDJ etc. pour filtrer les signaux et améliorer la qualité.
Incorporer la taille des positions comme la fraction fixe, Martingale, etc. pour améliorer la rentabilité.
Les paramètres de recherche des différences entre différents produits pour l'optimisation.
Appliquer l'apprentissage automatique comme des algorithmes génétiques pour l'entraînement et l'optimisation des paramètres.
Cette stratégie prend pleinement en compte le jugement des tendances et le contrôle des risques, la poursuite des profits tout en réduisant les retraits. Une amélioration supplémentaire grâce à l'optimisation des paramètres et aux méthodes de portefeuille peut aider à améliorer la rentabilité de la stratégie. En résumé, il s'agit d'une stratégie de trading quantitative robuste et stable avec une logique claire et une mise en œuvre facile.
/*backtest start: 2022-11-09 00:00:00 end: 2023-11-15 00:00:00 period: 1d basePeriod: 1h 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/ // © KivancOzbilgic //@version=4 strategy("Trenbolone Strategy", overlay = true) Periods = input(title="ATR Period", type=input.integer, defval=10) src = input(hl2, title="Source") Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0) changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true) showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false) highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true) barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true) atr2 = sma(tr, Periods) atr= changeATR ? atr(Periods) : atr2 up=src-(Multiplier*atr) up1 = nz(up[1],up) up := close[1] > up1 ? max(up,up1) : up dn=src+(Multiplier*atr) dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? min(dn, dn1) : dn trend = 1 trend := nz(trend[1], trend) trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green) buySignal = trend == 1 and trend[1] == -1 plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0) plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0) dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red) sellSignal = trend == -1 and trend[1] == 1 plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0) plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0) mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0) longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor) fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor) FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2018, title = "From Year", minval = 999) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 999) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) window() => time >= start and time <= finish ? true : false longCondition = buySignal if (longCondition) strategy.entry("BUY", strategy.long, when = window()) shortCondition = sellSignal if (shortCondition) strategy.entry("SELL", strategy.short, when = window()) buy1 = barssince(buySignal) sell1 = barssince(sellSignal) color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na barcolor(barcoloring ? color1 : na)