La stratégie de stop loss dynamique est une stratégie de trading quantitative qui utilise un mécanisme de stop loss. Elle définit une ligne de stop loss basée sur la théorie du suivi des tendances pour confirmer le stop loss et ajuster le stop loss.
Le noyau de la stratégie de stop loss dynamique consiste à définir trois paramètres clés: distance de stop loss initiale, distance de stop loss suivant et distance de déclenchement de stop loss suivant. Une fois qu'un signal d'achat est déclenché, le prix de stop loss initial est calculé en fonction du prix d'entrée et de la distance de stop loss initiale définie. Ensuite, chaque barre jugera si la condition de déclenchement de stop loss suivant est remplie. Si oui, un nouveau prix de stop loss suivant sera défini. Le nouveau prix de stop loss suivant est calculé en fonction du prix de clôture actuel et de la distance de stop loss suivant. Ainsi, tant que le prix se déplace dans une direction favorable, la ligne de stop loss suivant continuera à monter pour bloquer les bénéfices. Lorsque l'inversion du prix déclenche la ligne de stop loss suivant, un signal de vente sera généré.
Cette stratégie a également un stop loss inférieur. Peu importe si le stop loss de trailing est activé ou non, si le prix tombe en dessous du stop loss inférieur, le stop loss sera directement déclenché. Le stop loss inférieur sert à se protéger contre les écarts de prix causés par des événements soudains. Par conséquent, grâce au mécanisme de stop loss dynamique sous la forme d'un stop loss à double ligne, la ligne de stop loss peut suivre automatiquement les tendances favorables, tout en empêchant les pertes excessives.
Bloquez continuellement les bénéfices en suivant le stop loss, en évitant de laisser trop de place au retracement.
Adopter une structure de stop-loss à double ligne pour assurer le suivi rapide de la ligne de stop-loss, tout en évitant des pertes excessives.
Utiliser un mécanisme de jugement continu pour l'ajustement du stop loss avec un fonctionnement simple et une mise en œuvre facile.
Les paramètres peuvent être optimisés en fonction des caractéristiques du marché et des stocks afin d'améliorer l'efficacité du stop loss.
Pas besoin de prédire les tendances du marché, juste suivre la tendance.
Un paramètre mal réglé peut entraîner un stop loss trop lâche ou trop serré. Trop lâche rendrait le stop loss inefficace, tandis que trop serré a tendance à être arrêté par les fluctuations normales de prix.
En cas d'écart de prix causé par des événements soudains, il est possible qu'il n'arrête pas les pertes.
Les coûts de négociation et le glissement peuvent affecter le prix de vente réel après l'activation de la ligne stop loss.
L'adaptabilité n'est pas forte, elle ne fonctionne pas bien à certains stades, comme les mouvements limités par la portée.
Les contre-mesures:
Ajustez la ligne de stop-loss en pourcentage, ce qui permet de mieux suivre les mouvements de prix à travers les différents niveaux de prix.
Ajouter des métriques de volatilité pour suspendre le stop loss de suivi en cas de volatilité élevée, évitant ainsi que des fluctuations normales déclenchent le stop loss.
Optimisez automatiquement les paramètres via l'apprentissage automatique. Choisissez le retour de différentes combinaisons de paramètres dans la période récente en tant qu'échantillons de formation.
Ajouter des critères de position ouverte en tenant compte d'indicateurs tels que la tendance, le support et la résistance pour éviter d'ouvrir des positions sur des marchés variés.
La stratégie de stop loss dynamique définit les lignes de stop loss par un mécanisme de stop loss à double ligne pour confirmer le stop loss et ajuster le stop loss en fonction des changements de prix. Elle peut ajuster automatiquement la distance de stop loss pour verrouiller les bénéfices, réduire les retraits et contrôler les pertes. Avec un fonctionnement simple et une mise en œuvre facile, cette stratégie peut être optimisée en fonction des conditions du marché et utilisée avec d'autres stratégies pour une meilleure performance. Mais elle a également certaines limitations. Il est conseillé de l'améliorer et de le tester suffisamment avant de l'appliquer dans le trading en direct.
/*backtest start: 2023-11-28 00:00:00 end: 2023-12-17 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/ // © Thumpyr //@version=5 ///////////////////////////////////////////////////////////////////////////////////////////// // Comment out Strategy Line and remove // from Indicator line to turn into Indicator ////// // Do same for alertConidction at bottom ////// ///////////////////////////////////////////////////////////////////////////////////////////// strategy("PCT Trailing Stoploss-Strategy", shorttitle="PCT Trailing Stoploss- Strategy", overlay=true) //indicator(title="PCT Trailing Stoploss- Indicator", shorttitle="PCT Trailing Stoploss - Indicator", timeframe="", timeframe_gaps=true, overlay=true)// sellLow=input.float(.035, minval=0, title="Stop Loss Loss: 1% = .01", group="Sell Settings") trailStopArm=input.float(.0065, minval=0, title="Trailing Stop Arm: 1%=.01", group="Sell Settings") trailStopPct=input.float(.003, minval=0, title="Trailing Stop Trigger: 1%=.01 ", group="Sell Settings") ///////////////////////////////////////////////// // Indicators // ///////////////////////////////////////////////// ema1Len = input.int(14, minval=1, title=" ema 1 Length", group="Trend Line Settings") ema1Src = input(close, title="ema 1 Source", group="Trend Line Settings") ema1 = ta.ema(ema1Src, ema1Len) plot(ema1, title="EMA", color=color.blue) ema2Len = input.int(22, minval=1, title=" ema 2 Length", group="Trend Line Settings") ema2Src = input(close, title="ema 2 Source", group="Trend Line Settings") ema2 = ta.ema(ema2Src, ema2Len) plot(ema2, title="EMA", color=color.orange) ema3Len = input.int(200, minval=1, title=" ema 3 Length", group="Trend Line Settings") ema3Src = input(close, title="ema 2 Source", group="Trend Line Settings") ema3 = ta.ema(ema3Src, ema3Len) plot(ema3, title="EMA", color=color.gray) ///////////////////////////// //// Buy Conditions //// ///////////////////////////// alertBuy = ta.crossover(ema1,ema2) and close>ema3 //////////////////////////////////////////////////////////////////// //// Filter redundant Buy Signals if Sell has not happened //// //////////////////////////////////////////////////////////////////// var lastsignal = 0 showAlertBuy = 0 if(alertBuy and lastsignal !=1) showAlertBuy := 1 lastsignal := 1 buyAlert= showAlertBuy > 0 ////////////////////////////////////////////////////////////////// //// Track Conditions at buy Signal //// ////////////////////////////////////////////////////////////////// alertBuyValue = ta.valuewhen(buyAlert, close,0) alertSellValueLow = alertBuyValue - (alertBuyValue*sellLow) //////////////////////////////////////////////////////////// ///// Trailing Stop ///// //////////////////////////////////////////////////////////// var TSLActive=0 //Check to see if TSL has been activated var TSLTriggerValue=0.0 //Initial and climbing value of TSL var TSLStop = 0.0 //Sell Trigger var TSLRunning =0 //Continuously check each bar to raise TSL or not // Check if a Buy has been triggered and set initial value for TSL // if buyAlert TSLTriggerValue := alertBuyValue+(alertBuyValue*trailStopArm) TSLActive := 0 TSLRunning :=1 TSLStop := TSLTriggerValue - (TSLTriggerValue*trailStopPct) // Check that Buy has triggered and if Close has reached initial TSL// // Keeps from setting Sell Signal before TSL has been armed w/TSLActive// beginTrail=TSLRunning==1 and TSLActive==0 and close>alertBuyValue+(alertBuyValue*trailStopArm) and ta.crossover(close,TSLTriggerValue) if beginTrail TSLTriggerValue :=close TSLActive :=1 TSLStop :=TSLTriggerValue - (TSLTriggerValue*trailStopPct) // Continuously check if TSL needs to increase and set new value // runTrail= TSLActive==1 and (ta.crossover(close,TSLTriggerValue) or close>=TSLTriggerValue) if runTrail TSLTriggerValue :=close TSLStop :=TSLTriggerValue - (TSLTriggerValue*trailStopPct) // Verify that TSL is active and trigger when close cross below TSL Stop// TSL=TSLActive==1 and (ta.crossunder(close,TSLStop) or (close[1]>TSLStop and close<TSLStop)) // Plot point of inital arming of TSL// TSLTrigger=TSLActive==1 and TSLActive[1]==0 plotshape(TSLTrigger, title='TSL Armed', location=location.abovebar, color=color.new(color.blue, 0), size=size.small, style=shape.cross, text='TSL Armed') //////////////////////////////////////////////////////////// // Plots used for troubleshooting and verification of TSL // //////////////////////////////////////////////////////////// //plot(TSLActive,"Trailing Stop", color=#f48fb1) //plot(TSLRunning,"Trailing Stop", color=#f48fb1) //plot(TSLTriggerValue,"Trailing Stop Trigger", color.new(color=#ec407a, transp = TSLRunning==1 ? 0 : 100)) //plot(TSLStop,"Trailing Stop", color.new(color=#f48fb1, transp = TSLRunning==1 ? 0 : 100))// //////////////////////////////////////////////////////////// ///// Sell Conditions /////// //////////////////////////////////////////////////////////// Sell1 = TSL Sell2 = ta.crossunder(close,alertSellValueLow) alertSell= Sell1 or Sell2 //////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //// Remove Redundant Signals //// //////////////////////////////////////////////////////////// showAlertSell = 0 if(alertSell and lastsignal != -1) showAlertSell := 1 lastsignal := -1 sellAlert= showAlertSell > 0 if sellAlert TSLActive :=0 TSLRunning :=0 ///////////////////////////////////////// // Plot Buy and Sell Shapes on Chart // ///////////////////////////////////////// plotshape(buyAlert, title='Buy', location=location.belowbar, color=color.new(color.green, 0), size=size.small, style=shape.triangleup, text='Buy') plotshape(sellAlert, title='Sell', location=location.abovebar, color=color.new(color.red, 0), size=size.small, style=shape.triangledown, text='Sell') ///////////////////////////////////////////////////////////////////////////////////////////// // Remove // to setup for Indicator // ///////////////////////////////////////////////////////////////////////////////////////////// //Alerts //alertcondition(title='Buy Alert', condition=buyAlert, message='Buy Conditions are Met') //alertcondition(title='Sell Alert', condition=sellAlert, message='Sell Conditions are Met') ///////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////// //// Comment out this section if setup as Indicator //// //////////////////////////////////////////////////////////// longCondition = buyAlert if (longCondition) strategy.entry("Buy", strategy.long) alert(message='Buy', freq=alert.freq_once_per_bar_close) shortCondition = sellAlert if (shortCondition) strategy.close_all(sellAlert,"Sell") alert(message='Sell', freq=alert.freq_once_per_bar_close) /////////////////////////////////////////////////////////////