L'idée principale de cette stratégie est de combiner les niveaux de support/résistance et les écarts de volume pour déterminer les signaux d'entrée, et d'utiliser l'indicateur ATR pour ajuster dynamiquement le stop loss pour la prise de profit, afin de capturer plus de bénéfices potentiels.
La stratégie se compose des principales logiques suivantes:
Utilisez ta.pivothigh et ta.pivotlow pour calculer le prix le plus élevé des bougies précédentes L_Bars et le prix le plus bas des bougies précédentes R_Bars, en tant que niveaux de résistance et de support.
Lorsque le prix de clôture dépasse le niveau de résistance et que le volume dépasse le seuil de volumeRange, passez long.
Après une entrée longue, régler le stop loss à close-ATR_LO. Après une entrée courte, régler le stop loss à close+ATR_SH. Cela réalise un réglage dynamique du stop loss de trailing.
Ne prenez que le premier signal pendant les heures de négociation (0915-1445) chaque jour. Aucun nouvel ordre après avoir atteint la limite de risque quotidienne définie par l'entrée de risque.
Utiliser la théorie de soutien/résistance combinée à l'indicateur de volume pour améliorer la précision d'entrée.
Le niveau de stop loss de trailing basé sur ATR peut être ajusté de manière flexible en fonction de la volatilité du marché, ce qui réduit les chances de retracement des bénéfices.
Un contrôle approprié des heures de négociation quotidiennes et du risque par transaction permet de détecter la tendance et d'éviter un stop loss excessif.
Les niveaux de support/résistance peuvent échouer et ne pas être en mesure de fournir des signaux d'entrée efficaces.
Le multiplicateur ATR trop élevé peut entraîner un arrêt de perte trop éloigné, ce qui augmente le risque de perte.
Un seuil de volume trop bas risque de manquer des opportunités, un seuil trop élevé peut provoquer de faux signaux.
Les solutions:
Ajustez les paramètres de support/résistance en fonction des différentes caractéristiques des produits.
Optimiser le multiplicateur ATR et les paramètres de seuil de volume.
Ajouter d'autres indicateurs pour confirmer les signaux d'entrée.
Ajouter d'autres indicateurs comme les moyennes mobiles pour aider à déterminer les signaux d'entrée.
Optimiser les paramètres tels que le multiplicateur ATR et le seuil de volume.
Utiliser des algorithmes d'apprentissage automatique pour réaliser une optimisation dynamique des paramètres.
Élargir la stratégie à d'autres produits pour trouver des modèles de paramètres.
La stratégie intègre divers outils analytiques, appliquant des méthodes de support/résistance, de volume et de stop loss, et a obtenu de bons résultats de backtest. Mais plus d'incertitudes peuvent exister dans le trading en direct, nécessitant d'autres améliorations telles que l'optimisation des paramètres et des indicateurs de confirmation d'entrée supplémentaires pour améliorer les performances du monde réel.
/*backtest start: 2024-01-03 00:00:00 end: 2024-01-10 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // ____________ _________ _____________ // |____________| ||________| ||__________| // || ____ || || || ______ ________ _____ ________ // || | || || ||________|| | || || || || | || /\\ | // |______| || || |______| // || |===|| |=== ||__________ | || || || || |===|| /__\\ |=== || || \\ || // || | || ||___ || || |___|| ||___ ||___ || | || / \\ | \\ || || ___|| || // || ||________|| ||__________ // || ||________| ||__________| //@version=5 strategy("SUPPORT RESISTANCE STRATEGY [5MIN TF]",overlay=true ) L_Bars = input.int(defval = 10, minval = 1 , maxval = 50, step =1) R_Bars = input.int(defval = 15, minval = 1 , maxval = 50, step =1) volumeRange = input.int(20, title='Volume Break [threshold]', minval = 1) // ═══════════════════════════ // // ——————————> INPUT <——————— // // ═══════════════════════════ // EMA1 = input.int(title='PRICE CROSS EMA', defval = 150, minval = 10 ,maxval = 400) factor1 = input.float(title='_ATR LONG',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL LONG") factor2 = input.float(title='_ATR SHORT',defval = 3.2 , minval = 1 , maxval = 5 , step = 0.1, tooltip = "ATR TRAIL SHORT") risk = input.float(title='RISK',defval = 200 , minval = 1 , maxval = 5000 , step = 50, tooltip = "RISK PER TRADE") var initialCapital = strategy.equity t = time(timeframe.period, '0915-1445:1234567') time_cond = not na(t) // ══════════════════════════════════ // // ———————————> EMA DATA <——————————— // // ══════════════════════════════════ // ema1 = ta.ema(close, EMA1) plot(ema1, color=color.new(color.yellow, 0), style=plot.style_linebr, title='ema1') // ══════════════════════════════════ // // ————————> TRAIL DATA <———————————— // // ══════════════════════════════════ // // *******Calculate LONG TRAIL data***** ATR_LO = ta.atr(14)*factor1 // *******Calculate SHORT TRAIL data***** ATR_SH = ta.atr(14)*factor2 long_trail = close - ATR_LO short_trail = close + ATR_SH // Plot atr data //plot(longStop, color=color.new(color.green, 0), style=plot.style_linebr, title='Long Trailing Stop') //plot(shortStop , color=color.new(color.red, 0), style=plot.style_linebr, title='Short Trailing Stop') // ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ // // ————————————————————————————————————————————————————————> RESISTANCE/SUPPORT LEVELS DATA <————————————————————————————————————————————————————————————————————————————————————————————— // // ══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ // Resistance_pi = fixnan(ta.pivothigh(L_Bars, R_Bars)[1]) Support_pi = fixnan(ta.pivotlow(L_Bars, R_Bars)[1]) r1 = plot(Resistance_pi, color=ta.change(Resistance_pi) ? na : color.red, offset=-(R_Bars + 1),linewidth=2, title='RESISTANCE') s1 = plot(Support_pi, color=ta.change(Support_pi) ? na : color.green, offset=-(R_Bars + 1),linewidth=2, title='SUPPORT') //Volume vol_1 = ta.ema(volume, 5) vol_2 = ta.ema(volume, 10) osc_vol = 100 * (vol_1 - vol_2) / vol_2 // ══════════════════════════════════// // ————————> LONG POSITIONS <————————// // ══════════════════════════════════// //******barinstate.isconfirmed used to avoid repaint in real time******* if ( ta.crossover(close, Resistance_pi) and osc_vol > volumeRange and not(open - low > close - open) and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close >= ema1 ) strategy.entry(id= "Long" ,direction = strategy.long, comment = "BUY") plot(long_trail , color=color.new(color.blue, 0), style=plot.style_linebr, title='long Stop') if strategy.position_size > 0 strategy.exit("long tsl", "Long" , stop = long_trail ,comment='SELL') // ═════════════════════════════════════// // ————————> SHORT POSITIONS <————————— // // ═════════════════════════════════════// if ( ta.crossunder(close, Support_pi) and osc_vol > volumeRange and not(open - close < high - open) and strategy.opentrades==0 and barstate.isconfirmed and time_cond and close <= ema1 ) strategy.entry(id = "Short" ,direction = strategy.short, comment = "SELL") if strategy.position_size < 0 strategy.exit("short tsl", "Short" , stop = short_trail ,comment='BUY') // ════════════════════════════════════════════════// // ————————> CLOSE ALL POSITIONS BY 3PM <————————— // // ════════════════════════════════════════════════// strategy.close_all(when = hour == 14 and minute == 55) // ════════════════════════════════════════// // ————————> MAX INTRADAY LOSS <————————— // // ════════════════════════════════════════// // strategy.risk.max_intraday_loss(type = strategy.cash, value = risk)