Stratégie dynamique de tendance à l'engorgement

Auteur:ChaoZhang est là., Date: le 29 février 2024 11:24:18
Les étiquettes:

img

Résumé

La stratégie Dynamic Engulfing Trend est une stratégie de trading qui prend des positions longues ou courtes basées sur des modèles d'engulfement dans la direction de la tendance. Cette stratégie utilise la moyenne True Range (ATR) pour mesurer la volatilité du marché, l'indicateur Supertrend pour déterminer la direction de la tendance du marché et entre dans les transactions lorsque les modèles d'engulfement s'alignent sur la direction de la tendance.

La logique de la stratégie

  1. Calculer l'ATR pour mesurer la volatilité du marché.
  2. Calculer l'indicateur Supertrend pour identifier la tendance du marché.
  3. Définir les conditions de tendance haussière et de tendance baissière.
  4. Identifier l' engorgement haussier (en tendance haussière) et l' engorgement baissier (en tendance baissière).
  5. Les niveaux d'arrêt des pertes (SL) et de prise de profit (TP) sont calculés sur la base des modèles d'engorgement.
  6. Entrez dans les transactions lorsque les tendances correspondent à la tendance.
  7. Exit trades lorsque le prix atteint les niveaux SL ou TP.
  8. Tracez les schémas d'engloutissement sur le graphique.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. Amélioration de la qualité du signal en combinant les schémas d'engorgement avec la tendance.
  2. Capacité d'identifier des renversements de tendance pour des entrées précises.
  3. Éliminez les signaux longs/courts pour un meilleur timing.
  4. La stratégie d'arrêt d'engorgement suit la tendance tout en gérant les risques.
  5. Cadre de code modulaire pour des optimisations faciles.

Analyse des risques

Il y a aussi quelques risques à prendre en considération:

  1. Les schémas d'engorgement peuvent s'avérer être de fausses fuites.
  2. Difficile de déterminer les paramètres optimaux tels que la taille du motif, la durée, etc.
  3. Une détermination de tendance imparfaite peut conduire à de faux signaux.
  4. Les niveaux de stop-loss et de profit dépendent de la discrétion et peuvent être subjectifs.
  5. Les performances dépendent du réglage des paramètres basé sur les données historiques.

Les risques peuvent être atténués par:

  1. J'ajoute des filtres pour éliminer les faux signaux.
  2. Utilisation de l'ATR adaptatif pour des calculs de paramètres fiables.
  3. Amélioration de la détermination des tendances par l'apprentissage automatique.
  4. Trouver les paramètres optimaux par des algorithmes génétiques.
  5. Tests de retour sur des durées plus longues pour assurer la robustesse.

Directions d'optimisation

Il existe des possibilités d'optimisation supplémentaires:

  1. L'apprentissage automatique peut améliorer la détermination des tendances.
  2. De nouvelles méthodes de reconnaissance des modèles permettent de mieux identifier les modèles d'engloutissement.
  3. Les dernières stratégies stop loss/take profit peuvent optimiser dynamiquement les niveaux.
  4. Les données à haute fréquence peuvent développer un système à court terme.
  5. Paramètre de réglage pour différents instruments.

Conclusion

En résumé, la stratégie Dynamic Engulfing Trend combine les signaux de modèle d'engulissement de haute qualité avec une détermination précise de la tendance pour générer un système de trading avec des entrées précises et des pertes de stop raisonnables et une prise de profit.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
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/
// © Malikdrajat


//@version=4
strategy("Engulfing with Trend", 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=true)
highlighting = input(title="Highlighter 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)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")

// Define Downtrend and Uptrend conditions
downtrend = trend == -1
uptrend = trend == 1


// Engulfing 
boringThreshold = input(25, title="Boring Candle Threshold (%)", minval=1, maxval=100, step=1)
engulfingThreshold = input(50, title="Engulfing Candle Threshold (%)", minval=1, maxval=100, step=1)
stopLevel = input(200, title="Stop Level (Pips)", minval=1)


// Boring Candle (Inside Bar) and Engulfing Candlestick Conditions
isBoringCandle = abs(open[1] - close[1]) * 100 / abs(high[1] - low[1]) <= boringThreshold
isEngulfingCandle = abs(open - close) * 100 / abs(high - low) <= engulfingThreshold

// Bullish and Bearish Engulfing Conditions
bullEngulfing = uptrend and close[1] < open[1] and close > open[1] and not isBoringCandle and not isEngulfingCandle
bearEngulfing = downtrend and close[1] > open[1] and close < open[1] and not isBoringCandle and not isEngulfingCandle

// Stop Loss, Take Profit, and Entry Price Calculation
bullStop = close + (stopLevel * syminfo.mintick)
bearStop = close - (stopLevel * syminfo.mintick)
bullSL = low 
bearSL = high
bullTP = bullStop + (bullStop - low)
bearTP = bearStop - (high - bearStop)

// Entry Conditions
enterLong = bullEngulfing and uptrend
enterShort = bearEngulfing and downtrend

// Exit Conditions
exitLong = crossover(close, bullTP) or crossover(close, bullSL)
exitShort = crossover(close, bearTP) or crossover(close, bearSL)

// Check if exit conditions are met by the next candle
exitLongNextCandle = exitLong and (crossover(close[1], bullTP[1]) or crossover(close[1], bullSL[1]))
exitShortNextCandle = exitShort and (crossover(close[1], bearTP[1]) or crossover(close[1], bearSL[1]))

// Strategy Execution
strategy.entry("Buy", strategy.long, when=enterLong )
strategy.entry("Sell", strategy.short, when=enterShort )

// Exit Conditions for Long (Buy) Positions
if (bullEngulfing and not na(bullTP) and not na(bullSL))
    strategy.exit("Exit Long", from_entry="Buy", stop=bullSL, limit=bullTP)

// Exit Conditions for Short (Sell) Positions
if (bearEngulfing and not na(bearTP) and not na(bearSL))
    strategy.exit("Exit Short", from_entry="Sell", stop=bearSL, limit=bearTP)

// Plot Shapes and Labels
plotshape(bullEngulfing, style=shape.triangleup, location=location.abovebar, color=color.green)
plotshape(bearEngulfing, style=shape.triangledown, location=location.abovebar, color=color.red)

// Determine OP, SL, and TP
plot(bullEngulfing ? bullStop : na, title="Bullish Engulfing stop", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bearEngulfing ? bearStop : na, title="Bearish Engulfing stop", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bullEngulfing ? bullSL : na, title="Bullish Engulfing SL", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bearEngulfing ? bearSL : na, title="Bearish Engulfing SL", color=color.red, linewidth=3, style=plot.style_linebr)
plot(bullEngulfing ? bullTP : na, title="Bullish Engulfing TP", color=color.green, linewidth=3, style=plot.style_linebr)
plot(bearEngulfing ? bearTP : na, title="Bearish Engulfing TP", color=color.green, linewidth=3, style=plot.style_linebr)



Plus de