Stratégie de suivi des tendances

Auteur:ChaoZhang est là., Date: 2024-01-22 17:21:10
Les étiquettes:

img

Résumé

C'est une stratégie de rupture basée sur le suivi des tendances.

La logique de la stratégie

La stratégie repose principalement sur deux indicateurs pour déterminer les signaux d'entrée et de sortie - la fonction la plus élevée qui détermine le prix le plus élevé sur une certaine période, et la fonction la plus basse qui détermine le prix le plus bas sur une certaine période.

La stratégie définit également un stop loss mobile et un stop loss fixe. Le stop loss mobile est basé sur l'indicateur ATR, calculé par une valeur ATR sur une certaine période multipliée par un facteur (paramètre trailingAtrMultiplier) comme le niveau de stop loss mobile. Le stop loss fixe est calculé de la même manière sur la base de l'indicateur ATR.

Après un long ou un short, le stop loss fixe prend effet pour la première barre; puis il passe à un stop loss principalement mobile.

La stratégie établit également des règles pour le calcul de la taille des positions. Elle calcule la taille de position appropriée en fonction du pourcentage de perte maximal acceptable, du capital du compte, etc. Elle tient également compte du nombre d'instruments de négociation, en réduisant correctement la taille de position pour chaque instrument.

En résumé, il s'agit d'une stratégie de rupture typique de suivi de tendance. Il entre quand il juge qu'une rupture s'est produite, bloque les bénéfices et suit les tendances à travers le stop loss, et sort quand la tendance s'inverse.

Analyse des avantages

Les principaux avantages de cette stratégie sont les suivants:

  1. Un jugement de tendance précis: en utilisant les prix les plus élevés et les plus bas pour déterminer si les tendances sont inversées, la précision est très élevée et les faux signaux sont peu probables.

  2. La taille de la position et le stop loss sont raisonnables. Le pourcentage de perte maximal, l'association des fonds propres du compte, etc. rendent la taille de la position raisonnable, évitant le sur-échange ou le trading inefficace. Le stop loss combiné bloque les profits et suit les mouvements de tendance.

  3. Simple et pratique, facile à comprendre et à utiliser, elle repose uniquement sur des indicateurs de base et sa logique est simple et facile à saisir.

Analyse des risques

Les principaux risques de cette stratégie sont les suivants:

  1. Risque d'inversion de tendance. Les stratégies de rupture reposent fortement sur le jugement de la tendance, si cela va mal, d'énormes pertes peuvent être rencontrées.

  2. Si les paramètres du cycle des prix les plus élevés/les plus bas sont mal choisis, les tendances pourraient être manquées.

Les principales solutions sont les suivantes:

  1. Ajoutez des filtres de tendance, comme des indicateurs supplémentaires pour vérifier les fausses ruptures.

  2. Détendez la distance stop-loss de manière appropriée pour résister à des retraits raisonnables.

Directions d'optimisation

Les principales orientations d'optimisation de cette stratégie sont les suivantes:

  1. En plus des prix les plus élevés/les plus bas, des indicateurs tels que les moyennes mobiles peuvent également être ajoutés pour rendre la détermination des tendances plus précise.

  2. Optimiser les paramètres. Tester et trouver les combinaisons optimales pour les paramètres tels que les cycles de prix les plus élevés / les plus bas, les facteurs de multiplicateur de stop-loss, etc.

  3. Ajuster l'algorithme de dimensionnement des positions en fonction des conditions du marché. Par exemple, réduire la taille des positions lorsque la volatilité (par exemple VIX) augmente.

  4. Le choix d'instruments avec de petites variations de spread et de faibles corrélations peut réduire les risques de portefeuille.

Conclusion

En tant que stratégie de rupture de tendance, cette stratégie fonctionne bien en termes de précision de jugement, de dimensionnement des positions et de contrôle des risques, de facilité d'exploitation, etc. Elle capte les tendances tôt et équilibre la prise de profit et le suivi par le biais de stop-loss en mouvement.

Dans l'ensemble, il s'agit d'une stratégie très pratique. Sa structure de base contient déjà les composants les plus cruciaux pour une stratégie quantique. Avec des optimisations et des améliorations continues, elle peut certainement devenir une stratégie automatisée rentable stable. Valeur pour les quantiques à étudier et à référencer.


/*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"}]
*/

//@version=4
strategy(shorttitle="Trend Surfers - Breakout", title="Trend Surfers - Premium Breakout",
     overlay=true)

// Risk for position and pyramid
maxriskval = input(2, "Max % risk", type = input.float,
     tooltip="Risk % over total equity / Position", group = "Risk Management")
pairnumber = input(title = "How many pairs",type = input.integer, defval= 1,
     tooltip="How many pairs are you trading with the strategy?", group = "Risk Management")

// Emtry Exit
highPeriod = input(title="Highest High Period", type=input.integer, defval=168
     , tooltip="Highest High of X bars - This will trigger a Long Entry when close is above. (Thin Green Line)"
     , group = "Entry Condition")
lowPeriod = input(title="Lowest Low Period", type=input.integer, defval=168,
     tooltip="Lowest low of X bars - This will trigger a Short Entry when close is under. (Thin Red Line)"
     , group = "Entry Condition")
// Stoploss
trailingAtrPeriod = input(title="Trailing ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Trailing Stop. (Thick Green Line) "
     , group = "Exit Condition")
trailingAtrMultiplier = input(title="Trailing ATR Multiplier", type=input.float, defval=8
     , group = "Exit Condition")
fixAtrPeriod = input(title="Fix ATR Pediod", type=input.integer, defval=10,
     tooltip="Average True Range for the Fix Stoloss. (Thick Yellow Line)"
     , group = "Exit Condition")
fixAtrMultiplier = input(title="Fix ATR Multiplier", type=input.float, defval=2
     , group = "Exit Condition")
// Pair info 
pair = syminfo.basecurrency + syminfo.currency

// High Low Variable
highestHigh = highest(high, highPeriod)[1]
lowestLow = lowest(low, lowPeriod)[1]
trailingAtr = atr(trailingAtrPeriod) * trailingAtrMultiplier

// Trade Condition
longCondition = crossover(close, highestHigh) 
shortCondition = crossunder(close, lowestLow)

// Risk Variable
fixAtr = atr(fixAtrPeriod) * fixAtrMultiplier
stopvaluelong = close[1] - fixAtr[1]
stopvalueshort = close[1] + fixAtr[1]

// Position size Long
maxpossize = strategy.equity / close 
positionsizelong = ( ( ( (maxriskval/100) * strategy.equity) / (close - stopvaluelong))) 
stopperclong = ((close - stopvaluelong) / close) * 100
leveragelong = max(1, ceil(positionsizelong / maxpossize)) * 2
posperclong =  (((positionsizelong * close) / strategy.equity) *100 / leveragelong) / pairnumber
realposlong = (((posperclong / 100) * strategy.equity) * leveragelong) / close

// Position size Short
positionsizeshort = ( ( ( (maxriskval/100) * strategy.equity) / (stopvalueshort - close))) 
stoppercshort = ((close - stopvalueshort) / close) * 100
leverageshort = max(1, ceil(positionsizeshort / maxpossize)) * 2
pospercshort =  (((positionsizeshort * close) / strategy.equity) *100 / leverageshort) / pairnumber
realposshort = (((pospercshort / 100) * strategy.equity) * leverageshort) / close

// Alert Message
entry_long_message = '\nGo Long for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(posperclong) +
                     '\nLeverage' + tostring(leveragelong) +
                     '\nStoploss Price =' + tostring(stopvaluelong) +
                     '\nClose any Short position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

entry_short_message ='\nGo Short for ' + pair + 'NOW!' +
                     '\nPosition Size % =' + tostring(pospercshort) +
                     '\nLeverage' + tostring(leverageshort) +
                     '\nStoploss Price =' + tostring(stopvalueshort) +
                     '\nClose any Long position that are open for ' + pair + '!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_short_message = '\nExit Short for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'

exit_long_message = '\nExit Long for ' + pair + 'NOW!' +
                     '\n\nVisit TrendSurfersSignals.com' +
                     '\nFor automated premium signals (FREE)'
// Order
if longCondition 
    strategy.entry("Long", strategy.long, stop=highestHigh, comment="Long", qty=realposlong
     , alert_message = entry_long_message)
if shortCondition
    strategy.entry("Short", strategy.short, stop=lowestLow, comment="Short", qty=realposshort
     , alert_message = entry_short_message)

// Stoploss Trailing
longTrailing = close - trailingAtr
shortTrailing = close + trailingAtr

var longTrailingStop = 0.0
var shortTrailingStop = 999999.9

trailingStopLine = 0.0
trailingStopLine := na
fixedStopLine = 0.0
fixedStopLine := na
var inTrade = 0
if longCondition or shortCondition
    if 0 == inTrade
        if longCondition
            inTrade := 1
        else
            inTrade := -1
if 1 == inTrade and (shortCondition or low <= max(fixedStopLine[1], longTrailingStop))
    inTrade := 0
if -1 == inTrade and (longCondition or high >= min(fixedStopLine[1], shortTrailingStop))
    inTrade := 0

longTrailingStop := if (1 == inTrade)
    stopValue = longTrailing
    max(stopValue, longTrailingStop[1])
else
    0

shortTrailingStop := if (-1 == inTrade)
    stopValue = shortTrailing
    min(stopValue, shortTrailingStop[1])
else
    999999

// Fix Stoploss
firstPrice = 0.0
firstFixAtr = 0.0
firstPrice := na
firstFixAtr := na
if 0 != inTrade
    firstPrice := valuewhen(inTrade != inTrade[1] and 0 != inTrade, close, 0)
    firstFixAtr := valuewhen(inTrade != inTrade[1] and 0 != inTrade, fixAtr, 0)
    if 1 == inTrade
        fixedStopLine := firstPrice - firstFixAtr
        trailingStopLine := longTrailingStop
    else
        fixedStopLine := firstPrice + firstFixAtr
        trailingStopLine := shortTrailingStop

if (strategy.position_size > 0)
    strategy.exit(id="L Stop", stop=max(fixedStopLine, longTrailingStop)
     , alert_message = exit_long_message)

if (strategy.position_size < 0)
    strategy.exit(id="S Stop", stop=min(fixedStopLine, shortTrailingStop)
     , alert_message = exit_long_message)
    

// Plot
plot(highestHigh, color=color.green, linewidth=1, transp=0, title='Highest High')
plot(lowestLow, color=color.red, linewidth=1, transp=0, title='Lowest Low')
plot(trailingStopLine, color=color.lime, linewidth=2, transp=0, offset=1, title='Trailing Stop')
plot(fixedStopLine, color=color.orange, linewidth=2, transp=0, offset=1, title='Fixed Stop')

Plus de