Stratégie de négociation en pivot de supertrend filtrée par ADX

Auteur:ChaoZhang est là., Date: 2024-02-19 15:01:36 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie combine les points pivots de SuperTrend et l'indicateur ADX pour le trading à haute fréquence. Les lignes SuperTrend calculent dynamiquement les derniers niveaux de support et de résistance pour déterminer les tendances des prix et générer des signaux de trading.

La logique de la stratégie

  1. Calculer les lignes de support et de résistance du pivot. Prendre le prix de clôture et ajouter/soustraire une plage ATR au-dessus et en dessous. Les ruptures de ces lignes signalent des réversions de tendance.

  2. L'ADX détermine la force de la tendance.

  3. Combinez les deux pour les signaux commerciaux.

Analyse des avantages

Avantages de cette stratégie:

  1. Les lignes dynamiques de SuperTrend identifient rapidement les écarts.

  2. Le filtre ADX évite les faux signaux sur les marchés à plage.

  3. Un bon rapport risque-rendement et un bon contrôle de l'utilisation.

Analyse des risques

Les risques de cette stratégie:

  1. Les mouvements d'écart peuvent invalider les lignes de SuperTrend.

  2. Un mauvais réglage du seuil d'ADX affecte les performances.

  3. Une fréquence de négociation élevée augmente les coûts de transaction.

Les solutions:

  1. Optimisez les paramètres pour permettre des gammes de sortie plus larges.

  2. Test pour obtenir de meilleures valeurs ADX.

  3. Réduire la fréquence des échanges.

Directions d'optimisation

Les domaines à améliorer:

  1. Optimisez le multiplicateur ATR pour des lignes plus robustes.

  2. Testez différents paramètres ADX.

  3. Ajouter un stop-loss pour limiter les pertes.

Conclusion

Cette stratégie combine les forces de SuperTrend et ADX pour identifier les points d'inversion de tendance à forte probabilité, filtrés par ADX pour la qualité.


/*backtest
start: 2023-02-12 00:00:00
end: 2024-02-18 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("STPP20 + ADX", overlay = true)

///////////////////////////
// SuperTrend + Pivot Point
//////////////////////////

src =  input(close, title="EMA Source")
PPprd = input(defval = 2, title="Pivot Point Period", minval = 1, maxval = 50)
AtrFactor=input(defval = 5, title = "ATR Factor", minval = 1, step = 0.1)
AtrPd=input(defval = 20, title = "ATR Period", minval=1)

float ph = na
float pl = na
ph := pivothigh(PPprd, PPprd)
pl := pivotlow(PPprd, PPprd)

float center = na
center := center[1]
float lastpp = ph ? ph : pl ? pl : na
if lastpp
    if na(center)
        center := lastpp
    else
        center := (center * 2 + lastpp) / 3

Up = center - (AtrFactor * atr(AtrPd))
Dn = center + (AtrFactor * atr(AtrPd))

float TUp = na
float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown

// Lines
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor ,  linewidth = 2, title = "PP SuperTrend")

bsignalSSPP = close > Trailingsl
ssignalSSPP = close < Trailingsl


///////
// ADX
//////

lenADX = 14
th = 25
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/lenADX) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/lenADX) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/lenADX) + DirectionalMovementMinus
DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, lenADX)


//////
// MA
/////

lenMA = 21
srcMA = input(close, title="Source")
offsetMA = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
outMA = sma(srcMA, lenMA)


// Buy - Sell Entries
buy = bsignalSSPP and outMA < close and ADX > th
sell = ssignalSSPP 

if (buy)
    // .order // Tuned version
    strategy.entry("Buy", strategy.long)


if (sell) and (strategy.position_size > 0)
    strategy.order("Sell", false, when = sell)

Plus de