Stratégie de stop loss suiveur dynamique


Date de création: 2023-12-29 10:42:27 Dernière modification: 2023-12-29 10:42:27
Copier: 0 Nombre de clics: 872
1
Suivre
1617
Abonnés

Stratégie de stop loss suiveur dynamique

Aperçu

La stratégie de stop-loss de suivi dynamique est une stratégie de trading quantitative utilisant un mécanisme de stop-loss de suivi. La stratégie est basée sur la théorie du suivi de la tendance, la mise en place de la ligne de suivi de stop-loss, la réalisation de la confirmation de stop-loss et le suivi de l’ajustement de stop-loss.

Principe de stratégie

Le cœur d’une stratégie de suivi dynamique des pertes réside dans la définition de trois paramètres clés: la distance initiale d’arrêt, la distance d’arrêt de suivi et la distance d’arrêt de suivi. Lorsque le signal d’achat est déclenché, le prix d’arrêt initial est calculé en fonction du prix d’achat et de la distance d’arrêt initiale définie.

La stratégie a également un stop-loss à bas niveau, qui s’arrête immédiatement si le prix tombe au-dessus du stop-loss à bas niveau, qu’il soit activé ou non. Le stop-loss à bas niveau est utilisé pour éviter les sauts de prix soudains. Par conséquent, la stratégie de stop-loss à suivi dynamique permet au stop-loss de suivre automatiquement les mouvements favorables, tout en évitant les pertes excessives, grâce à un mécanisme de stop-loss dynamique sous la forme d’une ligne double.

Avantages stratégiques

  1. Il est possible d’éviter de donner trop d’occasions de remboursement en suivant les arrêts de perte et de bloquer les bénéfices.

  2. La structure de l’arrêt de perte à deux lignes, en haut et en bas, assure un suivi en temps opportun et prévient les pertes excessives.

  3. Le mécanisme de jugement continu est utilisé pour l’ajustement de l’arrêt des pertes, l’opération est simple et facile à réaliser.

  4. Les paramètres peuvent être ajustés en fonction des caractéristiques du marché et des actions individuelles pour optimiser le stop loss.

  5. Il n’est pas nécessaire de prédire l’évolution du marché, mais de suivre la tendance.

Risque stratégique

  1. Une mauvaise configuration des paramètres peut entraîner un arrêt trop lâche ou trop serré. Un arrêt trop lâche ne peut pas être un arrêt efficace, et un arrêt trop serré est vulnérable aux fluctuations normales des prix.

  2. Les événements imprévus peuvent entraîner une baisse des prix, ce qui peut entraîner l’invalidation du stop loss et devrait être combiné avec d’autres mesures de protection.

  3. Les frais de transaction et les points de glissement peuvent avoir un impact sur le prix de vente réel après le déclenchement de la ligne de stop-loss.

  4. L’adaptation n’est pas très bonne, et l’efficacité n’est pas bonne à certaines périodes, par exemple dans les zones de tremblement de terre.

La réponse:

  1. Il est recommandé d’optimiser continuellement les paramètres en fonction des résultats de la rétroanalyse et du disque dur.
  2. Une plus grande ouverture est possible pour le bas de l’escalier.
  3. Les frais de transaction et les effets des points de glissement sont pris en compte dans le calcul du prix de stop loss.
  4. Il peut être combiné avec des indicateurs de jugement de tendance et de fluctuation.

Orientation de l’optimisation de la stratégie

  1. En ajustant la traçabilité des stop-loss en pourcentage de variation, il est possible de mieux suivre les variations des cours des actions à différents niveaux de prix.

  2. Ajout d’un indicateur de volatilité pour juger si une forte volatilité déclenche un arrêt de suivi des pertes et éviter que les pertes normales ne déclenchent un arrêt.

  3. Optimiser automatiquement les paramètres à l’aide d’une méthode d’apprentissage automatique. Choisir un échantillon d’entraînement pour le rendement de la combinaison de paramètres sur une période récente.

  4. Augmenter le jugement sur les conditions d’ouverture des positions, en combinant des indicateurs tels que la tendance, la résistance au soutien, pour éviter d’ouvrir des positions dans des conditions de choc.

Résumer

La stratégie d’arrêt de suivi dynamique utilise un mécanisme d’arrêt en double ligne, la configuration d’une ligne d’arrêt de suivi, la confirmation d’arrêt et l’ajustement de l’arrêt de suivi. La distance d’arrêt peut être ajustée automatiquement en fonction de la variation des prix, utilisée pour bloquer les gains, réduire les retours et contrôler les pertes.

Code source de la stratégie
/*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)
/////////////////////////////////////////////////////////////