Stratégie d'inversion de tendance basée sur les hauts et les bas de l'oscillation pivot

Auteur:ChaoZhang est là., Date: 12 janvier 2024
Les étiquettes:

img

Résumé

Cette stratégie identifie les renversements de tendance dans les actifs cryptographiques basés sur les points hauts / bas de swing PIVOT et les signaux de rupture. Elle appartient à la catégorie des stratégies de renversement de rupture.

Comment fonctionne la stratégie

  1. Calculer les points pivot haut/bas

    Utilise ta.pivothigh (() et ta.pivotlow (()) pour trouver les prix les plus élevés et les plus bas au cours d'une période de recherche de barre personnalisée pour tracer des points PIVOT.

  2. Identifier les signaux de rupture

    Si le prix dépasse le bas PIVOT ou le haut PIVOT, la stratégie le considère comme un signal d'inversion de tendance.

  3. Définir les conditions du filtre

    Exige que le prix dépasse les niveaux PIVOT à une distance significative, et que le prix de clôture franchisse les prix de clôture de 150 bar pour éviter les coups de fouet.

  4. Entrées et sorties

    Trigger le signal d'achat sur la condition longue, fermer la position longue sur la condition de sortie.

Les avantages

  1. Les points PIVOT sont sensibles aux changements de tendance majeurs
  2. Évite les problèmes dans les tendances de consolidation avec des filtres
  3. Capture les retours en arrière tôt avec des écarts de swing haut/bas

Les risques

  1. Des cycles plus longs peuvent entraîner une mauvaise stratégie.
  2. Les points PIVOT et les filtres doivent être ajustés pour chaque actif
  3. Les frais de change ont une incidence sur les résultats, la structure des frais est proche de zéro

Des possibilités d'amélioration

  1. Testez les différentes périodes de repérage PIVOT
  2. Ajouter le stop loss mobile à la perte de contrôle par transaction
  3. Combiner avec d'autres indicateurs pour le filtre

Conclusion

La stratégie est globalement robuste pour capturer de grands retours en arrière, mais nécessite des paramètres personnalisés par actif et des contrôles de risque.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © nkrastins95

//@version=5
strategy("Swing Hi Lo", overlay=true, margin_long=100, margin_short=100)

//-----------------------------------------------------------------------------------------------------------------------//

tf = input.timeframe(title="Timeframe", defval="")

gr="LENGTH LEFT / RIGHT"
leftLenH = input.int(title="Pivot High", defval=10, minval=1, inline="Pivot High",group=gr)
rightLenH = input.int(title="/", defval=10, minval=1, inline="Pivot High",group=gr)
colorH = input(title="", defval=color.red, inline="Pivot High",group=gr)

leftLenL = input.int(title="Pivot Low", defval=10, minval=1, inline="Pivot Low", group=gr)
rightLenL = input.int(title="/", defval=10, minval=1, inline="Pivot Low",group=gr)
colorL = input(title="", defval=color.blue, inline="Pivot Low",group=gr)

//-----------------------------------------------------------------------------------------------------------------------//

pivotHigh(ll, rl) =>
    maxLen = 1000
    float ph = ta.pivothigh(ll, rl)
    int offset = 0
    while offset < maxLen
        if not na(ph[offset])
            break 
        offset := offset + 1
    ph[offset]

pivotLow(ll, rl) =>
    maxLen = 1000
    float pl = ta.pivotlow(ll, rl)
    int offset = 0
    while offset < maxLen
        if not na(pl[offset])
            break 
        offset := offset + 1
    pl[offset]


//-----------------------------------------------------------------------------------------------------------------------//

ph = request.security(syminfo.tickerid, tf, pivotHigh(leftLenH, rightLenH), barmerge.gaps_off, barmerge.lookahead_on)
pl = request.security(syminfo.tickerid, tf, pivotLow(leftLenL, rightLenL), barmerge.gaps_off, barmerge.lookahead_on)

drawLabel(_offset, _pivot, _style, _color) =>
    if not na(_pivot)
        label.new(bar_index[_offset], _pivot, str.tostring(_pivot, format.mintick), style=_style, color=_color, textcolor=#131722)

//-----------------------------------------------------------------------------------------------------------------------//

VWAP = ta.vwap(ohlc4)

longcondition = ta.crossunder(close,pl) and close > close[150]
exitcondition = close > ph

shortcondition = ta.crossover(close,ph) and close < close[150]
covercondition = close < pl

strategy.entry("long", strategy.long, when = longcondition)
strategy.close("long", when = exitcondition)

strategy.entry("Short", strategy.short, when = shortcondition)
strategy.close("Short", when = covercondition)

Plus de