Meilleure stratégie d'arrêt de traînée

Auteur:ChaoZhang est là., Date: 21 septembre 2023 à 20h58
Les étiquettes:

Résumé

Cette stratégie utilise un mécanisme de stop loss pour déplacer le stop loss de manière dynamique en fonction de la gamme de fluctuation des prix, ce qui permet d'obtenir des stops dynamiques.

La logique de la stratégie

La stratégie est basée sur des croisements de double MA jugant de la direction de la tendance.

L'innovation réside dans la conception du stop loss:

  1. Une ligne de déclenchement d'arrêt est définie. L'arrêt de suivi commence après que le prix ait franchi cette ligne.

  2. La ligne de stop-loss s'allonge en fonction du paramètre pourcentage. Par exemple, 3% de retard signifie 3% en dessous du dernier minimum.

  3. La position est fermée lorsque le prix s'inverse pour toucher la ligne de stop-loss.

Cela garantit que l'arrêt suivra automatiquement les bénéfices, tout en réduisant la probabilité d'arrêter lorsque les bénéfices sont encore bons.

Les avantages

  • Arrêt automatique de traction basé sur le pourcentage
  • La ligne de déclenchement évite une activation prématurée
  • Le suivi dynamique protège les bénéfices
  • Évite de s'arrêter en raison de retracements courts
  • Ligne de déclenchement et pourcentage ajustable aux marchés

Les risques

  • Le croisement MA peut être retardé, générant de faux signaux
  • Des réglages incorrects de la ligne de déclenchement provoquent une activation prématurée ou tardive
  • Les paramètres de pourcentage incorrects donnent des arrêts trop larges ou trop serrés
  • Ne peut pas éviter complètement les risques liés à la piqûre
  • Les paramètres doivent être optimisés pour tenir compte de la volatilité du marché

Les risques peuvent être réduits par:

  • Optimisation des périodes d'établissement de l'AM pour de meilleures inscriptions
  • Test de différentes valeurs de déclenchement pour un meilleur positionnement
  • Testez en arrière-plan les pourcentages idéaux basés sur les prélèvements historiques
  • Envisager une réentrée pour éviter les tendances manquantes
  • Ajout de filtres pour éviter les fausses fuites

Directions de renforcement

La stratégie peut être améliorée par:

  1. Optimisation des périodes de double MA

  2. Optimisation ou suppression de la ligne de déclenchement

    Commencez directement le suivi ou utilisez des valeurs différentes pour différents produits

  3. Test de différentes valeurs en pourcentage de traction

    Trouver les valeurs optimales pour les différents produits

  4. Ajout de règles de réentrée

    Définir les conditions de rentrée après les arrêts

  5. Réglage de la rigueur de l'arrêt par volatilité

    Des arrêts plus larges dans des environnements de volatilité accrue

Résumé

Cette stratégie utilise un arrêt de pourcentage de trailing avec une ligne de déclenchement avant l'activation. Ce mécanisme dynamique équilibre la protection des bénéfices et l'évitement d'arrêts inutiles basés sur les mouvements du marché. Mais les paramètres doivent être optimisés pour différents produits, ainsi que des filtres supplémentaires sur les entrées pour améliorer la précision. Les réentrées aident également à éviter de manquer des tendances après l'arrêt prématuré. Des améliorations continues sont nécessaires pour l'adaptabilité.


/*backtest
start: 2022-09-14 00:00:00
end: 2023-09-20 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//@author=Daveatt

SystemName = "BEST Trailing Stop Strategy"
TradeId = "BEST"

InitCapital = 100000
InitPosition = 100
InitCommission = 0.075
InitPyramidMax = 1
CalcOnorderFills = true
CalcOnTick = true
DefaultQtyType = strategy.fixed
DefaultQtyValue = strategy.fixed
Precision = 2
Overlay=true


// strategy(title=SystemName, shorttitle=SystemName, overlay=Overlay, 
//  pyramiding=InitPyramidMax, initial_capital=InitCapital, default_qty_type=DefaultQtyType, default_qty_value=InitPosition, commission_type=strategy.commission.percent, 
//  commission_value=InitCommission, calc_on_order_fills=CalcOnorderFills, calc_on_every_tick=CalcOnTick, precision=2)


src = close
// Calculate moving averages
fastSMA = sma(close, 15)
slowSMA = sma(close, 45)

// Calculate trading conditions
enterLong  = crossover(fastSMA, slowSMA)
enterShort = crossunder(fastSMA, slowSMA)

// trend states
since_buy  = barssince(enterLong)
since_sell = barssince(enterShort)
buy_trend  = since_sell > since_buy
sell_trend = since_sell < since_buy 

change_trend = (buy_trend and sell_trend[1]) or (sell_trend and buy_trend[1])

//plot(buy_trend ? 1 : 0, title='buy_trend', transp=100)
//plot(sell_trend ? 1 : 0, title='sell_trend', transp=100)

// get the entry price
entry_price = valuewhen(enterLong or enterShort, close, 0)

// Plot moving averages
plot(series=fastSMA, color=color.teal)
plot(series=slowSMA, color=color.orange)

// Plot the entries
plotshape(enterLong, style=shape.circle, location=location.belowbar, color=color.green, size=size.small)
plotshape(enterShort, style=shape.circle, location=location.abovebar, color=color.red, size=size.small)



///////////////////////////////
//======[ Trailing STOP ]======//
///////////////////////////////

// use SL?
useSL = input(true, "Use stop Loss")
// Configure trail stop level with input
StopTrailPerc = input(title="Trail Loss (%)", type=input.float, minval=0.0, step=0.1, defval=3) * 0.01
// Will trigger the take profit trailing once reached
use_SL_Trigger = input(true, "Use stop Loss Trigger")
StopTrailTrigger   = input(2.0, "SL Trigger (%)",minval=0,step=0.5,type=input.float) * 0.01


StopLossPriceTrigger = 0.0
StopLossPriceTrigger := if (use_SL_Trigger)
    if buy_trend
        entry_price * (1 + StopTrailTrigger) 
    else
        entry_price * (1 - StopTrailTrigger)
else
    -1


var SL_Trigger_Long_HIT = false
SL_Trigger_Long_HIT := useSL and use_SL_Trigger and buy_trend and high >= StopLossPriceTrigger
 ? true : SL_Trigger_Long_HIT[1]


var SL_Trigger_Short_HIT = false
SL_Trigger_Short_HIT := useSL and use_SL_Trigger and sell_trend and low <= StopLossPriceTrigger
 ? true : SL_Trigger_Short_HIT[1]


display_long_SL_trigger     = useSL and buy_trend  and use_SL_Trigger 
 and SL_Trigger_Long_HIT == false and StopLossPriceTrigger != -1
display_short_SL_trigger    = useSL and sell_trend and use_SL_Trigger 
 and SL_Trigger_Short_HIT == false and StopLossPriceTrigger != -1
display_SL_trigger          = display_long_SL_trigger or display_short_SL_trigger

plot(display_SL_trigger ? StopLossPriceTrigger : na, title='SLPriceTrigger', transp=0, 
 color=color.maroon, style=plot.style_circles, linewidth=3)


// Determine trail stop loss prices
longStopPrice = 0.0, shortStopPrice = 0.0

longStopPrice := if useSL and buy_trend
    stopValue = low * (1 - StopTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0

shortStopPrice := if useSL and sell_trend
    stopValue = high * (1 + StopTrailPerc)
    min(stopValue, shortStopPrice[1])
else
    999999

//////////////////////////////////////////////////////////////////////////////////////////
//*** STOP LOSS HIT CONDITIONS TO BE USED IN ALERTS  ***//
//////////////////////////////////////////////////////////////////////////////////////////

cond_long_stop_loss_hit  = useSL and buy_trend and crossunder(low, longStopPrice[1]) 
 and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
cond_short_stop_loss_hit = useSL and sell_trend and crossover(high, shortStopPrice[1]) 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)


// Plot stop loss values for confirmation
plot(series=useSL and buy_trend and low >= longStopPrice 
 and (SL_Trigger_Long_HIT or use_SL_Trigger == false)
 ? longStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Long Trail Stop")

plot(series=useSL and sell_trend and high <= shortStopPrice 
 and (SL_Trigger_Short_HIT or use_SL_Trigger == false)
 ? shortStopPrice : na,
 color=color.fuchsia, style=plot.style_cross,
 linewidth=2, title="Short Trail Stop")

close_long  = cond_long_stop_loss_hit
close_short = cond_short_stop_loss_hit

// Submit entry orders
strategy.entry(TradeId + " L", long=true, when=enterLong)
strategy.close(TradeId + " L", when=close_long)

//if (enterShort)
strategy.entry(TradeId + " S", long=false, when=enterShort)
strategy.close(TradeId + " S", when=close_short)


if change_trend
    SL_Trigger_Long_HIT := false
    SL_Trigger_Short_HIT := false


Plus de