Stratégie de suivi de la fuite

Auteur:ChaoZhang est là., Date: 2023-10-17 16h36 et 49 min
Les étiquettes:

img

Résumé

Cette stratégie utilise principalement l'indicateur Donchian Channel pour mettre en œuvre une stratégie de trading de suivi de la rupture. La stratégie combine les idées de trading de suivi de tendance et de rupture, en recherchant des points de rupture dans des cycles plus courts basés sur l'identification de la tendance principale, afin de trader le long de la tendance. En outre, la stratégie définit des niveaux de stop loss et de profit pour contrôler le risque / rendement de chaque transaction. Dans l'ensemble, la stratégie a l'avantage de suivre la tendance et de trader dans la direction de la tendance principale.

La logique de la stratégie

  1. Paramètres de réglage pour l'indicateur Canal de Donchian, période par défaut 20;

  2. Mettez la moyenne mobile EMA, la période par défaut est de 200;

  3. Ratio risque/rendement, défaut est de 1,5;

  4. Régler les paramètres de retraite après la rupture pour long et court;

  5. Enregistrer si l'éclatement précédent était un point élevé ou bas;

  6. Signal long: si la rupture précédente était basse, les prix dépassent la bande supérieure de Donchian et la ligne EMA;

  7. Signal court: si la rupture précédente était élevée, le prix dépasse la bande inférieure de Donchian et la ligne EMA;

  8. Après une entrée longue, régler le stop loss à la bande inférieure de Donchian moins 5 points, prendre un profit au ratio risque/rendement fois la distance stop loss;

  9. Après une entrée courte, régler le stop loss à la bande supérieure de Donchian plus 5 points, prendre un profit au ratio risque/rendement fois la distance stop loss.

De cette façon, la stratégie combine le suivi de tendance et le trading de rupture, pour négocier avec la tendance principale.

Analyse des avantages

  1. Suivez la tendance majeure, évitez de négocier contre la tendance.

  2. Le canal de Donchian en tant qu'indicateur à long terme, combiné avec le filtre EMA, peut identifier efficacement la tendance.

  3. Le stop loss et le take profit contrôlent le risque par transaction, limitent les pertes potentielles.

  4. L'optimisation du ratio risque/rendement peut augmenter le facteur de profit, en poursuivant des rendements excédentaires.

  5. Paramètres de backtest flexibles, permettant d'optimiser les paramètres pour différents marchés.

Analyse des risques

  1. Le canal de Donchian et l'EMA peuvent parfois donner de mauvais signaux.

  2. Le trading de rupture peut facilement être piégé, besoin d'identifier clairement l'arrière-plan de tendance.

  3. Le stop loss et le take profit fixes ne peuvent pas être ajustés en fonction de la volatilité du marché.

  4. L'espace d'optimisation des paramètres est limité, les performances en direct ne sont pas garanties.

  5. Les systèmes de négociation vulnérables aux événements du cygne noir peuvent entraîner des pertes importantes.

Directions d'optimisation

  1. Envisagez d'ajouter plus de filtres comme des oscillateurs pour améliorer la qualité du signal.

  2. S'il y a un risque d'erreur, le montant de la garantie est calculé en fonction de la volatilité du marché et de l'ATR.

  3. Utilisez l'apprentissage automatique pour tester et optimiser les paramètres pour s'adapter aux marchés réels.

  4. Optimiser la logique d'entrée avec volume ou volatilité comme condition pour éviter les pièges.

  5. Combinez avec des systèmes de suivi des tendances ou l'apprentissage automatique pour créer des modèles hybrides de robustesse.

Conclusion

Cette stratégie est une stratégie de suivi de la rupture, avec la logique de la négociation le long de la tendance majeure identifiée, et en prenant la rupture comme signal d'entrée, tout en définissant un stop loss et un profit pour contrôler le risque par transaction. La stratégie présente quelques avantages, mais aussi des possibilités d'amélioration.


/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Welcome to my second script on Tradingview with Pinescript
// First of, I'm sorry for the amount of comments on this script, this script was a challenge for me, fun one for sure, but I wanted to thoroughly go through every step before making the script public
// Glad I did so because I fixed some weird things and I ended up forgetting to add the EMA into the equation so our entry signals were a mess
// This one was a lot tougher to complete compared to my MACD crossover trend strategy but I learned a ton from it, which is always good and fun
// Also I'll explain the strategy and how I got there through some creative coding(I'm saying creative because I had to figure this stuff out by myself as I couldn't find any reference codes)
// First things first. This is a Donchian Channel Breakout strategy which follows the following rules
// If the price hits the upperband of the Donchian Channel + price is above EMA and the price previously hit the lowerband of the Donchian Channel it's a buy signal
// If the price hits the lowerband of the Donchian Channel + price is below EMA and the price prevbiously hit the upper band of the Donchian Channel it's a sell signal
// Stop losses are set at the lower or upper band with a 0.5% deviation because we are acting as if those two bands are the resistance in this case
// Last but not least(yes, this gave BY FAR the most trouble to code), the profit target is set with a 1.5 risk to reward ratio
// If you have any suggestions to make my code more efficient, I'll be happy to hear so from you
// So without further ado, let's walk through the code

// The first line is basically standard because it makes backtesting so much more easy, commission value is based on Binance futures fees when you're using BNB to pay those fees in the futures market
// strategy(title="Donchian Channels", shorttitle="DC", overlay=true, default_qty_type = strategy.cash, default_qty_value = 150, initial_capital = 1000, currency = currency.USD, commission_type = "percent", commission_value = 0.036)
// The built-in Donchian Channels + an added EMA input which I grouped with the historical bars from the Donchian Channels
length          = input(20, minval=1, group = "Indicators")
lower           = lowest(length)
upper           = highest(length)
basis           = avg(upper, lower)
emaInput        = input(title = "EMA Input", type = input.integer, defval = 200, minval = 10, maxval = 400, step = 1, group = "Indicators")
// I've made three new inputs, for risk/reward ratio and for the standard pullback deviation. My advise is to not use the pullback inputs as I'm not 100% sure if they work as intended or not
riskreward      = input(title = "Risk/Reward Ratio", type = input.float, defval = 1.50, minval = 0.01, maxval = 100, step = 0.01, group = "Risk/Reward")
pullbackLong    = input(title = "Distance from Long pullback %", type = input.float, defval = 0.995, minval = 0.001, maxval = 2, step = 0.001, group = "Risk/Reward")
pullbackShort   = input(title = "Distance from Short pullback %", type = input.float, defval = 1.005, minval = 0.001, maxval = 2, step = 0.001, group = "Risk/Reward")

// Input backtest range, you can adjust these in the input options, just standard stuff
fromMonth       = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
fromDay         = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
fromYear        = input(defval = 2000, title = "From Year",       type = input.integer, minval = 1970,           group = "Backtest Date Range")
thruMonth       = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12, group = "Backtest Date Range")
thruDay         = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31, group = "Backtest Date Range")
thruYear        = input(defval = 2099, title = "Thru Year",       type = input.integer, minval = 1970,           group = "Backtest Date Range")
// Date variable also standard stuff
inDataRange     = (time >= timestamp(syminfo.timezone, fromYear, fromMonth, fromDay, 0, 0)) and (time < timestamp(syminfo.timezone, thruYear, thruMonth, thruDay, 0, 0))

// I had to makes these variables because the system has to remember whether the previous 'breakout' was a high or a low
// Also, because I based my stoploss on the upper/lower band of the indicator I had to find a way to change this value just once without losing the value, that was added, on the next bar
var previousishigh = false
var previousislow = false
var longprofit = 0.0
var shortprofit = 0.0
var stoplossLong = 0.0
var stoplossShort = 0.0
// These are used as our entry variables
emaCheck = ema(close, emaInput)
longcond = high >= upper and close > emaCheck
shortcond = low <= lower and close < emaCheck

// With these two if statements I'm changing the boolean variable above to true, we need this to decide out entry position
if high >= upper
    previousishigh := true
if low <= lower
    previousislow := true

// Made a last minute change on this part. To clean up our entry signals we don't want our breakouts, while IN a position, to change. This way we do not instantly open a new position, almost always in the opposite direction, upon exiting one
if strategy.position_size > 0 or strategy.position_size < 0 
    previousishigh := false
    previousislow := false

// Strategy inputs
// Long - previous 'breakout' has to be a low, the current price has to be a new high and above the EMA, we're not allowed to be in a position and ofcourse it has to be within our given data for backtesting purposes
if previousislow == true and longcond and strategy.position_size == 0 and inDataRange
    strategy.entry("Long Entry", strategy.long, comment = "Entry Long")
    stoplossLong := lower * pullbackLong
    longprofit := ((((1 - stoplossLong / close) * riskreward) + 1) * close)
    strategy.exit("Long Exit", "Long Entry", limit = longprofit, stop = stoplossLong, comment = "Long Exit")

// Short - Previous 'breakout' has to be a high, current price has to be a new low and lowe than the 200EMA, we're not allowed to trade when we're in a position and it has to be within our given data for backtesting purposes
if previousishigh == true and shortcond and strategy.position_size == 0 and inDataRange
    strategy.entry("Short Entry", strategy.short, comment = "Entry Short")
    stoplossShort := upper * pullbackShort
    shortprofit := (close - ((((1 - close / stoplossShort) * riskreward) * close)))
    strategy.exit("Short Exit", "Short Entry", limit = shortprofit, stop = stoplossShort, comment = "Short Exit")
    
// This plots the Donchian Channels on the chart which is just using the built-in Donchian Channels
plot(basis, "Basis", color=color.blue)
u = plot(upper, "Upper", color=color.green)
l = plot(lower, "Lower", color=color.red)
fill(u, l, color=#0094FF, transp=95, title="Background")

// These plots are to show if the variables are working as intended, it's a mess I know but I didn't have any better ideas, they work well enough for me
// plot(previousislow ? close * 0.95 : na, color=color.red, linewidth=2, style=plot.style_linebr)
// plot(previousishigh ? close * 1.05 : na, color=color.green, style=plot.style_linebr)
// plot(longprofit, color=color.purple)
// plot(shortprofit, color=color.silver)
// plot(stoplossLong)
// plot(stoplossShort)
// plot(strategy.position_size)

Plus de