Stratégie de stop loss suiveur basée sur l'écart de prix


Date de création: 2023-11-28 13:53:16 Dernière modification: 2023-11-28 13:53:16
Copier: 0 Nombre de clics: 655
1
Suivre
1617
Abonnés

Stratégie de stop loss suiveur basée sur l’écart de prix

Aperçu

La stratégie utilise le principe de l’intervalle de prix, en achetant et en émettant des ordres de stop-loss et des ordres d’arrêt à la rupture du bas, afin de suivre le prix de stop-loss le plus bas et de réaliser des bénéfices.

Principe de stratégie

Lorsque le prix tombe au-dessus du point le plus bas de la dernière heure N, l’intervalle de positionnement est activé en fonction du pourcentage défini, et les ordres de stop-loss et d’arrêt sont activés. Les lignes de stop-loss et d’arrêt sont ensuite déplacées en fonction de la tendance. La logique est la suivante:

  1. Calculer le point le plus bas en N heures comme prix de fixation
  2. Le prix en temps réel est inférieur au prix de fixation multiplié par le pourcentage d’achat de la configuration
  3. Le prix d’entrée multiplié par le pourcentage de vente
  4. Réglez le stop loss simple sur le prix d’entrée moins le prix d’entrée multiplié par le stop loss pourcentage.
  5. Pourcentage de la pluriel en tant qu’intérêt stratégique
  6. Suivre une ligne de stop-loss mobile
  7. Arrêt de la position ou arrêt de la perte

Analyse des forces stratégiques

Cette stratégie présente les avantages suivants:

  1. L’idée de l’écart-prix, une entrée en jeu en cas de crevaison, pour augmenter les chances de victoire
  2. Le suivi automatique des pertes permet de bloquer la plupart des bénéfices
  3. Pourcentage de stop-loss configurable adapté aux différents marchés
  4. Pour les variétés présentant des caractéristiques de retour évidentes
  5. Simple à utiliser et facile à mettre en œuvre

Analyse stratégique des risques

Cette stratégie comporte aussi des risques:

  1. La rupture n’est pas forcément une réussite, mais une nouvelle exploration est possible.
  2. Un arrêt ou un arrêt incorrect peut entraîner un arrêt ou un arrêt prématuré et une perte de vitesse plus importante.
  3. Nécessité d’optimiser régulièrement les paramètres pour s’adapter aux changements du marché
  4. Variété limitée, peut ne pas être efficace pour certaines variétés
  5. Il existe un certain besoin d’intervention humaine.

Orientation de l’optimisation de la stratégie

La stratégie peut également être optimisée pour:

  1. Ajout d’algorithmes d’apprentissage automatique pour optimiser automatiquement les paramètres
  2. Ajout d’autres méthodes d’arrêt des pertes, telles que l’arrêt mobile, l’arrêt suspendu, etc.
  3. Optimisation de la logique d’arrêt de perte pour un arrêt de perte plus intelligent et plus fluide
  4. Le filtrage des signaux erronés, combiné à d’autres indicateurs de fiabilité du signal
  5. Élargir l’application à plus de variétés et améliorer l’universalité des stratégies

Résumer

Cette stratégie est globalement une stratégie simple et efficace de suivi et d’arrêt des pertes basée sur l’idée de la fourchette de prix. Elle réduit la probabilité d’erreur d’entrée, est capable de verrouiller efficacement les bénéfices, et il y a encore beaucoup de place pour l’optimisation des paramètres et le filtrage, qui méritent d’être étudiés et améliorés.

Code source de la stratégie
/*backtest
start: 2022-11-21 00:00:00
end: 2023-11-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

strategy(title="Squeeze Backtest by Shaqi v1.0", overlay=true, pyramiding=0, currency="USD", process_orders_on_close=true, commission_type=strategy.commission.percent, commission_value=0.075, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=100, backtest_fill_limits_assumption=0)
strategy.risk.allow_entry_in(strategy.direction.long)

R0 = "6 Hours"
R1 = "12 Hours"
R2 = "24 Hours"
R3 = "48 Hours"
R4 = "1 Week"
R5 = "2 Weeks"
R6 = "1 Month"
R7 = "Maximum"


buyPercent = input( title="Buy, %",         type=input.float,   defval=3,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
sellPercent = input(title="Sell, %",        type=input.float,   defval=1,       minval=0.01,                        step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
stopPercent = input(title="Stop Loss, %",   type=input.float,   defval=1,       minval=0.01,        maxval=100,     step=0.01,  inline="Percents",  group="Squeeze Settings") * 0.01
isMaxBars = input(  title="Max Bars To Sell",               type=input.bool,    defval=true ,                                   inline="MaxBars",   group="Squeeze Settings")
maxBars = input(    title="",       type=input.integer, defval=2,     minval=0,           maxval=1000, step=1,                  inline="MaxBars",   group="Squeeze Settings")
bind = input(       title="Bind",           type=input.source,  defval=close,                                                                       group="Squeeze Settings")
isRange = input(    title="Fixed Range",               type=input.bool,    defval=true,                                         inline="Range",     group="Backtesting Period")
rangeStart = input( title="",                       defval=R4,      options=[R0, R1, R2, R3, R4, R5, R6, R7],                   inline="Range",     group="Backtesting Period")
periodStart = input(title="Backtesting Start", type=input.time,    defval=timestamp("01 Aug 2021 00:00 +0000"),                                     group="Backtesting Period")
periodEnd = input(  title="Backtesting End",   type=input.time,    defval=timestamp("01 Aug 2022 00:00 +0000"),                                     group="Backtesting Period")

int startDate = na
int endDate = na
if isRange
    if rangeStart == R0
        startDate := timenow - 21600000
        endDate := timenow
    else if rangeStart == R1
        startDate := timenow - 43200000
        endDate := timenow
    else if rangeStart == R2
        startDate := timenow - 86400000
        endDate := timenow
    else if rangeStart == R3
        startDate := timenow - 172800000
        endDate := timenow
    else if rangeStart == R4
        startDate := timenow - 604800000
        endDate := timenow
    else if rangeStart == R5
        startDate := timenow - 1209600000
        endDate := timenow
    else if rangeStart == R6
        startDate := timenow - 2592000000
        endDate := timenow
    else if rangeStart == R7
        startDate := time
        endDate := timenow
else 
    startDate := periodStart
    endDate := periodEnd

afterStartDate = (time >= startDate)
beforeEndDate = (time <= endDate)
notInTrade = strategy.position_size == 0
inTrade = strategy.position_size > 0

barsFromEntry = barssince(strategy.position_size[0] > strategy.position_size[1])
entry = strategy.position_size[0] > strategy.position_size[1]
entryBar = barsFromEntry == 0
notEntryBar = barsFromEntry != 0
buyLimitPrice = bind - bind * buyPercent
buyLimitFilled = low <= buyLimitPrice
sellLimitPriceEntry = buyLimitPrice * (1 + sellPercent)
sellLimitPrice = strategy.position_avg_price * (1 + sellPercent)

stopLimitPriceEntry = buyLimitPrice - buyLimitPrice * stopPercent
stopLimitPrice = strategy.position_avg_price - strategy.position_avg_price * stopPercent

if afterStartDate and beforeEndDate and notInTrade
    strategy.entry("BUY", true, limit = buyLimitPrice)
    strategy.exit("INSTANT", limit = sellLimitPriceEntry, stop = stopLimitPriceEntry)
strategy.cancel("INSTANT", when = inTrade)
if isMaxBars
    strategy.close("BUY", when = barsFromEntry >= maxBars, comment = "Don't Sell")
strategy.exit("SELL", limit = sellLimitPrice, stop = stopLimitPrice)

showStop = stopPercent <= 0.03

plot(showStop ? stopLimitPrice : na, title="Stop Loss Limit Order", style=plot.style_linebr, color=color.red, linewidth=1)
plot(sellLimitPrice, title="Take Profit Limit Order", style=plot.style_linebr, color=color.purple, linewidth=1)
plot(strategy.position_avg_price, title="Buy Order Filled Price", style=plot.style_linebr, color=color.blue, linewidth=1)
plot(buyLimitPrice, title="Trailing Buy Limit Order", style=plot.style_stepline, color=color.new(color.blue, 30), offset=1)