
Il s’agit d’une stratégie de rupture basée sur le suivi de la tendance. Elle consiste à acheter des actions à forte intensité en cas de rupture et à vendre des actions à faible intensité en cas de rupture, ce qui permet de suivre la tendance.
Cette stratégie est basée sur deux indicateurs pour juger des signaux d’entrée et de sortie, l’un étant le prix le plus élevé dans une période donnée déterminée par la fonction highest () et l’autre étant le prix le plus bas dans une période donnée déterminée par la fonction lowest ().
Lorsque le prix de clôture est supérieur au prix le plus élevé de la période passée, il est considéré comme une rupture de la tendance à la hausse, donc un signal de plus est émis. Lorsque le prix de clôture est inférieur au prix le plus bas de la période passée, il est considéré comme une rupture de la tendance à la baisse, donc un signal de moins est émis.
Cette stratégie définit à la fois un stop-loss mobile et un stop-loss fixe. Le stop-loss mobile est calculé sur la base de l’indicateur ATR, en calculant la valeur ATR sur un certain cycle et en multipliant le paramètre trailingAtrMultiplier par un multiple. Le stop-loss fixe est également calculé sur la base de l’indicateur ATR.
La première ligne K de la racine fixe prend effet après avoir effectué un shorting supplémentaire; elle est ensuite convertie en une ligne de stop mobile. Cette combinaison permet de bloquer une partie des bénéfices tout en suivant la tendance.
La stratégie définit également les règles de calcul des positions. Les positions sont calculées sur la base du pourcentage de pertes maximales acceptables, des intérêts sur les comptes, etc. et compte tenu du nombre de variétés négociées, les positions d’une seule variété sont réduites de manière appropriée.
Dans l’ensemble, il s’agit d’une stratégie typique de suivi de la tendance, qui entre en jeu au moment où elle estime qu’une rupture est sur le point de se produire, bloque les gains et suit la tendance par un arrêt de perte, et s’en écarte lorsque la tendance est inversée.
Il s’agit d’une stratégie révolutionnaire dont les principaux avantages sont:
La précision de la tendance est très élevée. Il est difficile de donner de faux signaux en utilisant les prix les plus élevés et les plus bas pour déterminer si la tendance est inversée.
La science de la position et de l’arrêt est raisonnable. La définition du ratio de perte maximale, l’association des droits et intérêts du compte, etc. rendent la position raisonnable, évitent les transactions excessives ou inefficaces. La méthode d’arrêt combiné bloque les bénéfices et suit la tendance.
Simple, pratique et facile à comprendre. Vous n’avez besoin que des indicateurs les plus élémentaires, la logique de la stratégie est simple, claire et facile à maîtriser.
L’évolutivité est bonne. Les paramètres de l’indicateur, les règles de position, etc. sont fournis dans des boîtes de saisie que l’utilisateur peut ajuster selon ses besoins.
Dans l’ensemble, il s’agit d’une stratégie de rupture très pratique. La sécurité est fiable dans le jugement, et la stratégie est conçue en tenant compte du contrôle et du suivi des risques.
Les principaux risques de cette stratégie sont les suivants:
Le risque de renversement de tendance. Les stratégies de rupture dépendent fortement du jugement de la tendance et peuvent entraîner des pertes considérables en cas d’erreur.
Les paramètres de risque inappropriés. Le prix le plus élevé et le prix le plus bas. Les paramètres de cycle de prix mal sélectionnés peuvent manquer la tendance, les paramètres de position mal définis peuvent entraîner des pertes excessives.
Le stop loss risque d’être trop radical. Si le stop loss mobile est trop petit, il peut être éliminé par le bruit du marché.
Les principales solutions sont les suivantes:
Ajouter des filtres de tendance. Par exemple, ajouter d’autres indicateurs de jugement pour éviter les erreurs de rupture.
Optimiser la sélection des paramètres. Tester les paramètres pour sélectionner des valeurs optimales afin d’en assurer la stabilité.
La distance d’arrêt peut être appropriée. La distance d’arrêt peut être adaptée à un certain réglage.
La stratégie peut être optimisée principalement dans les directions suivantes:
Ajout d’autres indicateurs pour juger de la tendance. En plus du prix le plus bas, des jugements tels que les moyennes mobiles peuvent être ajoutés pour rendre la tendance plus précise.
Optimiser les paramètres. Tester les paramètres du cycle des prix les plus élevés et les plus bas, les paramètres de l’arrêt des pertes, etc., pour choisir la combinaison optimale de paramètres.
L’algorithme d’ajustement des positions en fonction du marché permet d’associer les positions à la volatilité du marché, par exemple en réduisant les positions lorsque le VIX augmente.
Le filtrage de l’indicateur d’augmentation de capacité. N’entrez que dans les cas de rupture d’augmentation de capacité, évitez les fausses ruptures.
Prendre en compte la variété de base et la corrélation. Choisir une combinaison de variétés avec une faible volatilité de la base et une faible corrélation peut réduire le risque de combinaison.
Optimiser et ajuster les mécanismes d’arrêt des pertes. Les combinaisons de taux d’arrêt mobiles et fixes peuvent être testées pour réduire le risque d’arrêt trop radical.
Cette stratégie est une stratégie de rupture de type suivi de tendance, qui fonctionne bien pour la précision des jugements, le contrôle des positions et des risques, la simplicité des opérations. Elle capture les tendances plus tôt, équilibrant le blocage des bénéfices et le suivi de la tendance avec des arrêts de perte mobiles.
Bien sûr, comme stratégie de rupture, elle est très dépendante du jugement de la tendance et est susceptible d’être perturbée par le bruit. De plus, une mauvaise configuration des paramètres peut également affecter la performance de la stratégie. Cela doit être résolu par une optimisation supplémentaire.
Dans l’ensemble, c’est une stratégie très pratique, dont la structure de base contient déjà les éléments les plus essentiels d’une stratégie quantifiée. Si elle peut être continuellement optimisée et améliorée, elle peut devenir une stratégie programmatique rentable et stable.
/*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')