Suivi de tendance Breakout V2


Date de création: 2023-11-01 17:24:08 Dernière modification: 2023-11-01 17:24:08
Copier: 0 Nombre de clics: 746
1
Suivre
1617
Abonnés

Suivi de tendance Breakout V2

Aperçu

Cette stratégie est une variante de ma précédente stratégie de traqueur de tendance de rupture. Dans l’autre stratégie, vous pouvez utiliser la moyenne mobile comme filtre pour la transaction (c’est-à-dire que si le prix est inférieur à la moyenne mobile, il ne fera pas beaucoup). Après avoir créé un outil pour détecter les tendances des plus hautes périodes, j’ai voulu voir s’il pouvait être un meilleur filtre que la moyenne mobile.

Par conséquent, la stratégie vous permet de voir les tendances sur des périodes plus élevées (c’est-à-dire s’il y a des hauts plus élevés et des bas plus bas? Si c’est le cas, c’est une tendance à la hausse). Vous ne placez que dans la direction de la tendance. Vous pouvez choisir jusqu’à deux tendances comme filtre.

J’ai constaté que cette stratégie ne fonctionnait pas très bien en général par rapport aux autres stratégies, mais elle semblait en effet être plus exigeante dans les transactions. Elle affichait un taux de victoire plus élevé et un meilleur facteur de profit.

Principe de stratégie

La logique centrale de la stratégie est d’identifier les tendances en utilisant les points de support et de résistance qui brisent les périodes plus élevées et de négocier en fonction de la direction de la tendance.

Plus précisément, il s’agit des étapes suivantes:

  1. Calculer le support et la résistance pour la période actuelle (par exemple, 1 heure). Ceci est réalisé en recherchant le prix le plus élevé et le prix le plus bas pour une période donnée.

  2. Calculer les positions de support et de résistance pour une ou plusieurs périodes de temps plus élevées (par exemple, 4 heures et jour). Ceci est réalisé en utilisant la même logique que pour la période actuelle.

  3. Les lignes horizontales de ces supports et résistances sont tracées sur le graphique. Lorsque le prix franchit ces niveaux, la tendance des périodes supérieures change.

  4. La direction de la tendance est déterminée en fonction de la rupture de ces niveaux clés. Si le prix franchit un sommet, il est considéré comme une tendance à la hausse.

  5. Permettre à l’utilisateur de sélectionner une ou plusieurs tendances de la période la plus élevée comme condition de filtrage. C’est-à-dire que la transaction est considérée uniquement si la direction de la tendance de la période actuelle correspond à celle de la période la plus élevée.

  6. L’achat ou la vente est effectué lorsque les conditions de filtrage de la tendance sont remplies et que le prix actuel franchit le niveau critique. Le niveau de stop loss est défini comme le support ou la résistance critique précédent.

  7. Au fur et à mesure que les prix évoluent, lorsque de nouveaux hauts ou des bas se forment, le stop-loss est déplacé vers de nouveaux bas afin de bloquer les bénéfices et de suivre la tendance.

  8. Lorsque le stop loss est déclenché ou que le support/résistance critique est franchi, la position est levée.

Grâce à cette analyse des tendances sur plusieurs périodes, la stratégie tente de négocier uniquement dans la direction de la tendance la plus forte, afin d’augmenter la probabilité de gagner. En même temps, les niveaux critiques fournissent des signaux d’entrée et de stop clairs.

Avantages stratégiques

  • L’utilisation de plusieurs périodes permettra d’identifier plus précisément les tendances les plus fortes et d’éviter d’être trompé par le bruit du marché.

  • La stratégie, qui ne fonctionne que dans la direction des principales tendances, permet d’augmenter considérablement le taux de victoire. Selon les résultats des tests, la stratégie affiche un taux de victoire plus élevé et un meilleur rapport bénéfice-risque par rapport au filtrage des moyennes mobiles simples.

  • Les positions de support et de résistance fournissent des niveaux d’entrée et de stop clairs. Il n’est pas nécessaire de s’enliser dans le choix d’un point d’entrée spécifique.

  • Il est possible de bloquer le maximum de bénéfices en ajustant le stop loss au fur et à mesure que la tendance se poursuit.

  • La logique de la stratégie est simple et claire, facile à comprendre et à ajuster.

Risque stratégique

  • Le jugement de la tendance dépendant d’un segment plus long peut être facilement pris en compte lors d’un renversement de tendance. Le cycle de temps de jugement de la tendance doit être raccourci de manière appropriée ou l’aide d’autres indicateurs doit être utilisée.

  • Sans tenir compte de l’impact fondamental, il est possible que le cours de l’action soit décalé par rapport à un événement majeur. Des conditions de filtrage telles que l’événement ATM ou la date du compte de résultat peuvent être ajoutées.

  • Il n’y a pas de contrôle de la taille de la position. La taille de la position peut être définie en fonction de facteurs tels que la taille des fonds du compte et la volatilité.

  • La période de réévaluation est limitée. La période de réévaluation devrait être élargie pour tester la stabilité dans différents environnements de marché.

  • L’impact des coûts de transaction n’est pas pris en compte. Les paramètres de la stratégie doivent être ajustés en fonction des coûts de transaction dans le réel.

  • Il est possible de développer des signaux de négociation de lignes courtes en combinaison avec d’autres stratégies pour réaliser un arbitrage à plusieurs cycles.

Orientation de l’optimisation de la stratégie

  • Ajouter des conditions de filtrage :

    • Les données de base, comme les résultats financiers, les événements, etc.

    • Indicateurs tels que le volume des transactions, le stop loss ATR, et ainsi de suite

  • Paramètres d’optimisation:

    • Cycle de calcul du support/résistance ajusté

    • Un cadre temporel pour ajuster les jugements de tendance

  • Les stratégies sont élargies:

    • Développer une stratégie de trading à court terme

    • Considérer une vente à découvert

    • Arbitrage multivarié

  • Une meilleure gestion des risques:

    • Taille de position optimisée en fonction de la volatilité et de la taille des fonds

    • Optimiser les stratégies de stop loss, comme le stop loss mobile, le stop loss suspendu, etc.

    • La mise en place d’un mécanisme de récompense au risque

  • Optimisation de la logique d’exécution:

    • Modification de l’heure d’arrivée

    • Considérer une entrée partielle

    • Optimisation de la stratégie de stop loss mobile

Résumer

La stratégie a été conçue pour être un système de rupture plus robuste en analysant les tendances sur des périodes plus longues. Par rapport aux moyennes mobiles simples, elle présente un meilleur rapport entre les gains et les gains et les risques. Mais il existe également des aspects qui peuvent être optimisés, tels que des mécanismes de gestion des risques incomplets, sans tenir compte des facteurs fondamentaux, etc.

Code source de la stratégie
/*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)