Stratégie de trading basée sur le canal supertrend adaptatif


Date de création: 2023-09-20 15:17:51 Dernière modification: 2023-09-20 15:17:51
Copier: 1 Nombre de clics: 810
1
Suivre
1617
Abonnés

Aperçu

Cette stratégie crée des signaux de négociation en construisant un canal hypertrend à deux niveaux, combiné à un canal de rupture des prix. En utilisant la volatilité des prix pour ajuster la largeur du canal, l’effet d’adaptation est obtenu.

Principe de stratégie

  1. Calculer le décalage standard du prix et le taux de fluctuation ATR, en ajustant la largeur du canal de rupture en fonction du taux de fluctuation.

  2. Construction d’un canal hypertrend à deux couches, le canal interne étant plus sensible et le canal externe plus stable.

  3. Un signal d’achat ou de vente est généré lorsque le prix franchit un canal de tendance supérieure à l’intérieur ou à l’extérieur.

  4. La structure à deux niveaux permet de filtrer certaines fausses percées.

  5. L’ATR est utilisé pour ajuster la largeur des canaux, qui augmente lorsque les ondes augmentent, ce qui permet un effet d’adaptation.

Analyse des avantages

  1. Les canaux hypertrends sont simples et faciles à utiliser et permettent de mieux suivre les tendances.

  2. La structure à deux couches permet d’améliorer la qualité du signal et de filtrer les fausses percées.

  3. La volatilité s’adapte à la largeur du canal pour le rendre plus adapté aux différentes conditions du marché.

  4. Il est facile à mettre en œuvre et les paramètres sont faciles à modifier.

  5. Il permet de visualiser les canaux et les ruptures pour créer un signal de transaction intuitif.

Analyse des risques

  1. Les signaux de rupture peuvent être mal interprétés et entraîner des pertes inutiles.

  2. Il est impossible de déterminer la direction de la tendance et il y a un risque de trading à contre-courant.

  3. L’adaptation peut être trop sensible et trop large.

  4. Une mauvaise optimisation des paramètres peut conduire à une optimisation excessive.

  5. En tant que stratégie de suivi des tendances, l’uddle peut facilement générer des profits insuffisants ou des pertes.

Direction d’optimisation

  1. Tester l’influence des différents paramètres sur l’effet d’adaptation du canal.

  2. Essayez de déterminer la direction des grandes tendances en combinant des indicateurs tels que la ligne moyenne.

  3. Optimiser les mécanismes de confirmation de fausses failles.

  4. Ajouter une stratégie de stop loss pour contrôler les pertes individuelles.

  5. Évaluer l’impact de l’ajustement des paramètres du canal sur la fréquence des transactions.

  6. Les paramètres peuvent être optimisés dynamiquement par des algorithmes d’apprentissage automatique.

Résumer

La stratégie utilise deux couches d’adaptation du canal hypertrend pour capturer les tendances des prix. L’avantage est qu’elle est simple et intuitive et permet de suivre efficacement les tendances. Mais il existe également des risques d’erreurs de jugement et d’erreurs de jugement des tendances.

Code source de la stratégie
/*backtest
start: 2023-08-20 00:00:00
end: 2023-09-19 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("SuperTrend Cloud Strategy", shorttitle="SuperTrend Cloud Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital = 1000)

//Inputs
multi = input(title="Multiplier", type=input.float, step=0.1, defval=3, minval=1)
period = input(title="Period", type=input.integer, step=1, defval=10, minval=1)
SelfAdjust = input(title="Self-Adjusting", type=input.bool, defval = false)


////////////////////////////////////////////////////////////////////////////////
// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2019, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true
 
////////////////////////////////////////////////////////////////////////////////

dev = stdev(close, period)
stdDev = (dev / close) * 100 + 1
MultDev = SelfAdjust ? multi * stdDev : multi

up_lev1 = hl2 - MultDev * atr(period)
dn_lev1 = hl2 + MultDev * atr(period)
up_lev2 = hl2 - (MultDev * 2 * atr(period))
dn_lev2 = hl2 + (MultDev * 2 * atr(period))

up_trend1 = 0.0
up_trend1 := close[1] > up_trend1[1] ? max(up_lev1, up_trend1[1]) : up_lev1
up_trend2 = 0.0
up_trend2 := close[1] > up_trend2[1] ? max(up_lev2, up_trend2[1]) : up_lev2

down_trend1 = 0.0
down_trend1 := close[1] < down_trend1[1] ? min(dn_lev1, down_trend1[1]) : dn_lev1
down_trend2 = 0.0
down_trend2 := close[1] < down_trend2[1] ? min(dn_lev2, down_trend2[1]) : dn_lev2

trend1 = 0
trend1 := close > down_trend1[1] ? 1: close < up_trend1[1] ? -1 : nz(trend1[1], 1)
trend2 = 0
trend2 := close > down_trend2[1] ? 1: close < up_trend2[1] ? -1 : nz(trend2[1], 1)

st_line1 = trend1 == 1 ? up_trend1 : down_trend1
st_line2 = trend2 == 1 ? up_trend2 : down_trend2

// Plotting
plot1 = plot(st_line1, color = trend1 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 1")
plot2 = plot(st_line2, color = trend2 == 1 ? color.green : color.red , style = plot.style_line, linewidth = 1, title = "SuperTrend 2")
fill(plot1, plot2, color = color.aqua, title = "Cloud")

buy = crossover(close, st_line1) and close > st_line2 or crossover(close, st_line2) and close > st_line1
sell = crossunder(close, st_line1) and close < st_line2 or crossunder(close, st_line2) and close < st_line1

if(buy and time_cond)
    strategy.entry("long", long = true , comment="long")

if (close < st_line1 and time_cond or close < st_line2 and time_cond)
    strategy.close("long")
    
if (not time_cond)
    strategy.close_all()