Suiveur de tendance de rupture V2

Auteur:ChaoZhang est là., Date: 2023-11-01 17:24:08 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie est une variation de mon autre stratégie Breakout Trend Follower. Dans l'autre stratégie, vous pouvez utiliser une moyenne mobile pour agir comme un filtre pour vos transactions (c'est-à-dire si le prix est inférieur à la moyenne mobile, il ne va pas durer longtemps). Après avoir créé l'outil qui détecte les tendances sur des délais plus longs, je voulais voir si cela pourrait être un meilleur filtre qu'une moyenne mobile.

Ce script vous permet donc d'examiner les tendances des délais plus élevés (c'est-à-dire s'il y a des hauts et des bas plus élevés? Si oui, il s'agit d'une tendance haussière). Vous ne négociez que lorsque vous êtes avec la tendance. Vous avez la possibilité de sélectionner jusqu'à deux tendances pour agir comme un filtre. Chaque direction de tendance est affichée sur un tableau sur le graphique pour une référence facile. Les hauts et les bas du pivot actuels sont tracés sur le graphique afin que vous puissiez voir quand vous pouvez briser à la fois la tendance des délais actuels et les tendances de niveau supérieur.

Ce que j'ai découvert, c'est qu'en général, cela ne fonctionne pas aussi bien que l'autre stratégie, mais il semble être beaucoup plus pointilleux avec les transactions. montrant des taux de gain plus élevés et un meilleur facteur de profit.

La logique de la stratégie

La logique de base de cette stratégie est d'identifier les tendances en utilisant des ruptures des niveaux de support et de résistance sur des délais plus longs, et de prendre des opérations dans la direction de la tendance.

Elle met notamment en œuvre les étapes suivantes:

  1. Calculer les niveaux de support et de résistance du pivot sur la période en cours (par exemple 1 heure).

  2. Calculer les niveaux de support et de résistance du pivot sur un ou plusieurs délais plus élevés (par exemple 4 heures et quotidien).

  3. Tracez ces niveaux de support et de résistance sous forme de lignes horizontales sur le graphique.

  4. Déterminez la direction de la tendance en fonction du fait que le prix dépasse les points hauts ou bas précédents. Dépasser un sommet précédent indique une tendance haussière. Dépasser un bas précédent indique une tendance baissière.

  5. Permettre à l'utilisateur de sélectionner une ou plusieurs tendances dans des délais plus élevés comme condition de filtrage. C'est-à-dire ne prendre en considération que les transactions lorsque la tendance actuelle dans les délais correspond à la tendance dans les délais plus élevés.

  6. Lorsque la condition du filtre de tendance est remplie et que le prix actuel dépasse le niveau clé, entrez long ou court.

  7. Au fur et à mesure que le prix évolue, ajustez le stop loss à de nouveaux bas pour verrouiller les profits et suivre la tendance.

  8. Sortie lorsque le stop loss est déclenché ou que le niveau de support/résistance clé est brisé.

En analysant les tendances sur plusieurs délais, la stratégie tente de ne négocier que dans la direction des tendances plus fortes pour améliorer le taux de gain.

Les avantages de la stratégie

  • L'utilisation de plusieurs délais pour juger des tendances peut identifier plus précisément la direction de la tendance la plus forte, en évitant le bruit.

  • Seule la négociation avec des tendances majeures améliore considérablement le taux de gain.

  • Les niveaux de support et de résistance fournissent des niveaux d'entrée et de stop loss clairs.

  • Ajustement des arrêts selon la tendance pour maximiser le verrouillage des profits.

  • Une logique stratégique simple et claire, facile à comprendre et à optimiser.

Risques liés à la stratégie

  • S'appuie sur des tendances à plus long terme, susceptible d'être pris au piège par des renversements de tendance.

  • Ne prend pas en compte les impacts fondamentaux, peut dévier du prix sur les événements majeurs. peut ajouter des filtres comme les dates de résultats.

  • Aucun contrôle de taille de position n'est défini.

  • Une période limitée de test de retour devrait étendre les tests à différents environnements de marché.

  • Aucune prise en compte des coûts commerciaux.

  • Il ne prend en compte que les transactions à long terme et peut développer des signaux pour les transactions à court terme afin de mettre en œuvre des stratégies multi-temporelles.

Directions d'optimisation

  • Ajouter les conditions du filtre:

    • Les éléments fondamentaux comme les gains, les nouvelles

    • Indicateurs tels que le volume, les arrêts ATR

  • Optimiser les paramètres:

    • Périodes de calcul du support/résistance

    • Délais de détermination des tendances

  • Élargir la portée de la stratégie:

    • Développer des stratégies de négociation à court terme

    • Considérez les opportunités de court-circuit

    • Différences entre les marchés

  • Améliorer la gestion des risques:

    • Optimiser la taille des positions selon la volatilité et la taille

    • Améliorer les stratégies d'arrêt des pertes telles que les arrêts de déplacement/de plaquettes

    • Mettre en place des indicateurs ajustés au risque

  • Améliorer la logique d'exécution:

    • Sélection du moment de l'entrée

    • Enregistrements de taille partielle

    • Optimisation du mouvement stop loss

Conclusion

Cette stratégie a conçu un système de rupture relativement robuste en analysant les tendances sur plusieurs délais. Par rapport à des filtres simples comme les moyennes mobiles, elle a démontré des taux de gain et des ratios risque-rendement plus élevés. Mais il y a des domaines qui peuvent être améliorés, comme le manque de mécanismes de gestion des risques solides et la prise en compte des fondamentaux. Avec une optimisation supplémentaire, elle peut devenir une stratégie de suivi des tendances très pratique. Dans l'ensemble, la conception de la stratégie est solide, améliorant la précision grâce à une analyse multi-délais, et vaut la peine d'être poursuivie.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-10-26 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// Revision:        1
// Author:          @millerrh
// Strategy:  Enter long when recent swing high breaks out, using recent swing low as stop level.  Move stops up as higher lows print to act
// as trailing stops.  Ride trend as long as it is there and the higher lows aren't breached.  
// The difference between this one and the previous Breakout Trend Follower is that this one uses higher timeframe higher highs/higher lows as a filter instead 
// of an arbitrary Moving Average.  I wanted to test out whether waiting for longer term actual trend changes produced better stats than just the moving average.
// Conditions/Variables 
//    1. Manually configure which dates to back test
//    2. Can add a filter to only take setups that are above (or below for shorts) user-defined larger timeframe trends (helps avoid trading counter trend) 

// === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST ===
// (STRATEGY ONLY) - Comment out srategy() when in a study() 
strategy("Breakout Trend Follower V2", overlay=true, initial_capital=10000, currency='USD', 
   default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
// (STUDY ONLY) - Comment out study() when in a strategy() 
//study("Breakout Trend Follower V2", overlay=true)

// === BACKTEST RANGE ===
Start = input(defval = timestamp("01 Jan 2019 06:00 +0000"), title = "Backtest Start Date", type = input.time, group = "Backtest Range")
Finish = input(defval = timestamp("01 Jan 2100 00:00 +0000"), title = "Backtest End Date", type = input.time, group = "Backtest Range")

// == USER INPUTS ==
tableLocation = input(defval="Top", options=["Top", "Bottom"], title = "Info Table Location", group = "Display",
  tooltip = "Place information table on the top of the pane or the bottom of the pane.")
lookback = input(defval = 3, title = "Pivot Lookback Period", group = "Pivot Points",
  tooltip = "Looks for pivot points within this number of bars both left and right.")
showPivotPoints = input(title = "Show Historical Pivot Points?", type = input.bool, defval = false, group = "Pivot Points",
  tooltip = "Toggle this on to see the historical pivot points that were used.  Change the Lookback Period to adjust the frequency of these points.
  The pivot points are only shown for the current chart timeframe - to see the Daily pivot pionts, use the Daily timeframe, etc.")
trendFilter = input(defval="1st Timeframe", options=["1st Timeframe", "Both Timeframes", "None"], title = "Use HTF Trend for Filtering?", group = "Higher Timeframe Levels",
  tooltip = "Signals will be ignored when price is not aligned with the higher timeframe trend(s).  The intent is to keep you out of bear periods and only buying when 
  price is showing strength and you are trading with the trend.")
twoSet = input(defval="D", title="1st High Timeframe", type=input.resolution, group = "Higher Timeframe Levels",
  tooltip = "Allows you to set two different time frames for looking at the trend.")
threeSet = input(defval="W", title="2nd High Timeframe", type=input.resolution, group = "Higher Timeframe Levels")
showMTFLevels = input(title = "Show Multiple Timeframe S/R Levels?", type = input.bool, defval = true, group = "Higher Timeframe Levels",
  tooltip = "Displays the pivot highs and lows of higher timeframes to use as support/resistance levels. When these levels break, the trend
  will change on these higher timeframes.")
currentColorS = input(color.new(color.orange,50), title = "Current Timeframe    Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
currentColorR = input(color.new(color.blue,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF1")
oneColorS = input(color.new(color.yellow,50), title = "1st High Timeframe   Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
oneColorR = input(color.new(color.yellow,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF2")
twoColorS = input(color.new(color.white,50), title = "2nd High Timeframe    Support", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")
twoColorR = input(color.new(color.white,50), title = " Resistance", type = input.color, group = "Higher Timeframe Levels", inline = "MTF3")

//  == DEFINE FUNCTIONS FOR USE IN MULTIPLE TIMEFRAMES (USING A TUPLE TO AVOID SO MANY SECURITY CALLS) ==  
f_getHTF() =>
    ph = pivothigh(high, lookback, lookback)
    pl = pivotlow(low, lookback, lookback)
    highLevel = valuewhen(ph, high[lookback], 0)
    lowLevel = valuewhen(pl, low[lookback], 0)
    barsSinceHigh = barssince(ph) + lookback
    barsSinceLow = barssince(pl) + lookback
    timeSinceHigh = time[barsSinceHigh]
    timeSinceLow = time[barsSinceLow]
    [ph, pl, highLevel, lowLevel, barsSinceHigh, barsSinceLow, timeSinceHigh, timeSinceLow]
    
[ph_01, pl_01, hL_01, lL_01, bsSH_01, bsSL_01, tSH_01, tSL_01] = security(syminfo.tickerid, "", f_getHTF())
[ph_02, pl_02, hL_02, lL_02, bsSH_02, bsSL_02, tSH_02, tSL_02] = security(syminfo.tickerid, twoSet, f_getHTF())
[ph_03, pl_03, hL_03, lL_03, bsSH_03, bsSL_03, tSH_03, tSL_03] = security(syminfo.tickerid, threeSet, f_getHTF())

// Plot historical pivot points for debugging and configuring the lookback period.
plot(showPivotPoints ? ph_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)
plot(showPivotPoints ? pl_01 : na, style=plot.style_cross, linewidth=3, color=color.new(color.yellow,50), offset=-lookback)

// == PLOT SUPPORT/RESISTANCE LINES ON THE HIGHER TIMEFRAMES ==
// Use a function to define the lines
f_line(x1, y1, y2, _color) =>
    var line id = na
    // line.delete(id)
    // id := line.new(x1, y1, time, y2, xloc.bar_time, extend.right, _color)

// 1st Timeframe
highLine1 = showMTFLevels ? f_line(tSH_01, hL_01, hL_01, currentColorR) : na
lowLine1 = showMTFLevels ? f_line(tSL_01, lL_01, lL_01, currentColorS) : na 
// 2nd Timeframe
highLine2 = showMTFLevels ? f_line(tSH_02, hL_02, hL_02, oneColorR) : na
lowLine2 = showMTFLevels ? f_line(tSL_02, lL_02, lL_02, oneColorS) : na
// 3rd Timeframe
highLine3 = showMTFLevels ? f_line(tSH_03, hL_03, hL_03, twoColorR) : na
lowLine3 = showMTFLevels ? f_line(tSL_03, lL_03, lL_03, twoColorS) : na

// == TREND CALCULATIONS (USING A TUPLE TO CONSOLIDATE REPETATIVE CODE AND GENERATE MULTIPE VARIABLES WITH ONE FUNCTION ==
f_signal(highLevel, lowLevel) =>
    uptrendSignal    = high > highLevel
    downtrendSignal  = low < lowLevel
    inUptrend        = bool(na)
    inDowntrend      = bool(na) 
    inUptrend       := uptrendSignal[1] ? true : downtrendSignal[1] ? false : inUptrend[1]
    inDowntrend     := not inUptrend
    [uptrendSignal, downtrendSignal, inUptrend, inDowntrend]

[uptrendSignal1, downtrendSignal1, inUptrend1, inDowntrend1] = f_signal(hL_01, lL_01)  // 1st Timeframe
[uptrendSignal2, downtrendSignal2, inUptrend2, inDowntrend2] = f_signal(hL_02, lL_02)  // 2nd Timeframe
[uptrendSignal3, downtrendSignal3, inUptrend3, inDowntrend3] = f_signal(hL_03, lL_03)  // 3rd Timeframe

// == TREND TABLE PLOTTING ==
tablePos = tableLocation == "Top" ? position.top_right : position.bottom_right
var table trendTable = table.new(tablePos, 3, 1, border_width = 3)
upColor = color.rgb(38, 166, 154)
downColor = color.rgb(240, 83, 80)

f_fillCell(_column, _row, _cellText, _c_color) =>
    table.cell(trendTable, _column, _row, _cellText, bgcolor = color.new(_c_color, 70), text_color = _c_color, width = 6)

if barstate.islast or barstate.islastconfirmedhistory
    f_fillCell(0, 0, inUptrend1 ? "▲" : "▼", inUptrend1 ? upColor : downColor)
    f_fillCell(1, 0, inUptrend2 ? "▲ " + twoSet : "▼ " + twoSet, inUptrend2 ? upColor : downColor)
    f_fillCell(2, 0, inUptrend3 ? "▲ " + threeSet : "▼ " + threeSet, inUptrend3 ? upColor : downColor)

// Conditions for entry and exit
buyConditions =  true
buySignal = high > hL_01 and buyConditions // Code to act like a stop-buy for the Study
sellSignal = low < lL_01 // Code to act like a stop-loss for the Study

// (STRATEGY ONLY) Comment out for Study
strategy.entry("Long", strategy.long, stop = hL_01, when = buyConditions)
// strategy.entry("Long", strategy.long, stop = buyLevel2, when = time > Start and time < Finish and high > maFilterCheck)
strategy.exit("Exit Long", from_entry = "Long", stop=lL_01)



Plus de