
L’idée principale de cette stratégie est de calculer des points de perte pour les lignes longues et courtes sur la base de l’indicateur ATR, et de générer un signal de transaction lorsque le prix franchit ces lignes de perte. Il a à la fois la fonction de suivi de la tendance et de capture des secousses.
La stratégie utilise l’indicateur ATR de période N ATR multiplié par un facteur pour calculer la ligne de stop longue et longue de chaque côté. La formule de calcul est la suivante:
长线止损 = 最高价 - ATR * 系数
短线止损 = 最低价 + ATR * 系数
Il est possible de faire une prise de plus lorsque la hausse du prix dépasse la limite de la ligne longue, et une prise de plus lorsque la baisse du prix dépasse la limite de la ligne courte. Une prise de plus permet de suivre en temps réel les fluctuations du prix pour déplacer la limite de la ligne courte.
Cette méthode, qui utilise la bande ATR comme point d’arrêt, permet de capturer pleinement les tendances des prix, tout en garantissant le risque d’arrêt des pertes. La génération d’un signal lorsque les prix se produisent des ruptures plus importantes peut éliminer efficacement les fausses ruptures.
Le plus grand avantage de cette stratégie réside dans la possibilité d’ajuster automatiquement le stop loss et de contrôler le risque tout en capturant la tendance des prix. Les avantages spécifiques sont les suivants:
Le paramètre de stop-loss flottant basé sur l’indicateur ATR permet d’ajuster l’amplitude de stop-loss en fonction de la volatilité du marché et de contrôler efficacement les pertes individuelles.
Le signal est généré par une méthode de percée qui permet d’éliminer une partie du bruit et d’éviter le recoupement et le recoupement.
La ligne de stop-loss est ajustée en temps réel pour suivre les fluctuations des prix, empêcher les stop-loss d’être trop lâches et verrouiller plus de profits.
Cette stratégie comporte également des risques, principalement liés à la configuration des points de perte et à la manière dont les signaux sont générés. Les points de risque spécifiques sont les suivants:
Des cycles et des coefficients ATR inappropriés peuvent entraîner un arrêt trop large ou trop étroit.
La méthode de signal de rupture peut manquer l’occasion au début de la tendance.
Le suivi de la perte de fin de tendance peut être retardé et ne peut pas être parfait.
La contre-mesure consiste principalement à ajuster les paramètres pour rendre le stop loss plus raisonnable, ou à aider d’autres indicateurs à juger des tendances et des signaux.
Cette stratégie peut être optimisée de plusieurs façons:
La mise en place d’une deuxième couche de stop-loss pour une plus grande maîtrise des risques.
La qualité du signal est améliorée en combinant les tendances avec d’autres indicateurs.
Ajouter des stratégies de stop-loss mobiles pour augmenter les bénéfices si la tendance se poursuit.
Optimiser les paramètres ATR cycliques et facteurs afin de rapprocher les arrêts aux fluctuations réelles des prix.
Cette stratégie est très pratique dans l’ensemble, car elle permet d’ajuster automatiquement le stop loss pour contrôler efficacement le risque, tout en obtenant de bons profits grâce au suivi des tendances. Nous pouvons optimiser et améliorer la stratégie en intégrant d’autres méthodes d’analyse sur la base originale, pour la rendre plus stable et plus intelligente.
/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © melihtuna
//@version=4
strategy("Chandelier Exit - Strategy",shorttitle="CE-STG" , overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, currency=currency.USD, commission_value=0.03, commission_type=strategy.commission.percent)
length = input(title="ATR Period", type=input.integer, defval=22)
mult = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
showLabels = input(title="Show Buy/Sell Labels ?", type=input.bool, defval=false)
useClose = input(title="Use Close Price for Extremums ?", type=input.bool, defval=true)
highlightState = input(title="Highlight State ?", type=input.bool, defval=true)
atr = mult * atr(length)
longStop = (useClose ? highest(close, length) : highest(length)) - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop
shortStop = (useClose ? lowest(close, length) : lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop
var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir
var color longColor = color.green
var color shortColor = color.red
longStopPlot = plot(dir == 1 ? longStop : na, title="Long Stop", style=plot.style_linebr, linewidth=2, color=longColor)
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title="Long Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=longColor, transp=0)
plotshape(buySignal and showLabels ? longStop : na, title="Buy Label", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=longColor, textcolor=color.white, transp=0)
shortStopPlot = plot(dir == 1 ? na : shortStop, title="Short Stop", style=plot.style_linebr, linewidth=2, color=shortColor)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title="Short Stop Start", location=location.absolute, style=shape.circle, size=size.tiny, color=shortColor, transp=0)
plotshape(sellSignal and showLabels ? shortStop : na, title="Sell Label", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=shortColor, textcolor=color.white, transp=0)
midPricePlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0, display=display.none, editable=false)
longFillColor = highlightState ? (dir == 1 ? longColor : na) : na
shortFillColor = highlightState ? (dir == -1 ? shortColor : na) : na
fill(midPricePlot, longStopPlot, title="Long State Filling", color=longFillColor)
fill(midPricePlot, shortStopPlot, title="Short State Filling", color=shortFillColor)
long_short = input(true, "Long-Short",type=input.bool, group="Strategy Settings")
start = input(timestamp("2019-01-01"), "Date", type=input.time, group="Strategy Settings")
finish = input(timestamp("2025-01-01"), "Date", type=input.time, group="Strategy Settings")
window() => true
slRatio=input(5, "Manuel Stop Loss Ratio", type=input.float, minval=0, group="Strategy Settings")
tpRatio=input(20, "Take Profit Ratio", type=input.float, minval=0, group="Strategy Settings")
tsStartRatio=input(10, "Trailing Stop Start Ratio", type=input.float, minval=0, group="Strategy Settings")
tsRatio=input(5, "Trailing Stop Ratio", type=input.float, minval=1, group="Strategy Settings")
lastBuyPrice = strategy.position_avg_price
diffHiPriceRatio = (high-lastBuyPrice)/lastBuyPrice*100
diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
posHiRatio=0.0
posHiRatio:= strategy.position_size > 0 ? diffHiPriceRatio > posHiRatio[1] ? diffHiPriceRatio : posHiRatio[1] : 0
s_diffHiPriceRatio = (low-lastBuyPrice)/lastBuyPrice*100
s_diffLoPriceRatio = (close-lastBuyPrice)/lastBuyPrice*100
s_posHiRatio=0.0
s_posHiRatio:= strategy.position_size < 0 ? s_diffLoPriceRatio < s_posHiRatio[1] ? s_diffLoPriceRatio : s_posHiRatio[1] : 0
strategy.entry("LONG", strategy.long, when = window() and buySignal)
strategy.close("LONG", when = window() and sellSignal)
strategy.close("LONG", when = diffLoPriceRatio<(slRatio*(-1)), comment="STOP-LONG")
strategy.close("LONG", when = diffHiPriceRatio>tpRatio, comment="TAKE-PROFIT-LONG")
strategy.close("LONG", when = ((posHiRatio[1]>tsStartRatio) and (posHiRatio[1]-diffHiPriceRatio)>tsRatio), comment="TRAILING-STOP-LONG")
if long_short
strategy.entry("SHORT", strategy.short, when = window() and sellSignal)
strategy.close("SHORT", when = window() and buySignal)
strategy.close("SHORT", when = s_diffLoPriceRatio>(slRatio), comment="STOP-SHORT")
strategy.close("SHORT", when = s_diffHiPriceRatio<(tpRatio*(-1)), comment="TAKE-PROFIT-SHORT")
strategy.close("SHORT", when = ((s_posHiRatio[1]*(-1)>tsStartRatio) and ((s_posHiRatio[1]-s_diffLoPriceRatio))*(-1)>tsRatio), comment="TRAILING-STOP-SHORT")