Stratégie de stop loss en deux étapes

Auteur:ChaoZhang est là., Date: 2023-10-25 18h11h30
Les étiquettes:

img

Résumé

L'idée principale de cette stratégie est de fixer deux objectifs de prise de profit et de déplacer le stop loss au prix d'entrée une fois que le premier objectif est atteint afin d'éviter la chasse au stop loss.

La logique de la stratégie

Cette stratégie consiste à effectuer des transactions basées sur les bandes de Bollinger et les indicateurs stochastiques.

Plus précisément, la logique d'entrée est:

  1. Entrez long lorsque la clôture est en dessous de la bande inférieure de Bollinger et que le Stochastique K traverse en dessous de D.

  2. Entrez à court lorsque la clôture est au-dessus de la bande supérieure de Bollinger et que le K stochastique traverse au-dessus de D.

La stratégie fixe deux objectifs de bénéfices, TP1 fixé à 200 points et TP2 fixé à 500 points.

Lorsque le prix se déplace et que TP1 est déclenché, la stratégie déplace le stop loss au prix d'entrée.

La stratégie ferme toutes les positions lorsque TP2 ou stop loss est déclenché.

Analyse des avantages

Le plus grand avantage de cette approche à deux étapes consiste à bloquer les profits tout en empêchant la chasse au stop loss.

Un autre avantage est la combinaison des bandes de Bollinger pour mesurer la fourchette de volatilité et du stochastique pour les entrées surachetées/survendues, ce qui rend les entrées plus précises.

Analyse des risques

Les principaux risques découlent de faux signaux potentiels des bandes de Bollinger et des indicateurs stochastiques.

Il existe également un risque que le stop loss soit à nouveau recherché après le passage au prix d'entrée.

Ces risques peuvent être réduits en optimisant les paramètres pour les deux indicateurs et en augmentant la distance entre les arrêts de perte.

Directions d'optimisation

D'autres optimisations de cette stratégie:

  1. Testez différentes combinaisons de paramètres pour trouver les paramètres optimaux de Bollinger et de Stochastique.

  2. Testez différentes cibles de profit/perte pour trouver des configurations idéales.

  3. Ajoutez d'autres indicateurs comme les moyennes mobiles pour créer des systèmes multi-indicateurs pour une plus grande précision.

  4. Recherchez une logique de positionnement alternative de stop loss, comme une distance fixe de l'entrée au lieu du prix d'entrée lui-même.

  5. Augmenter les mouvements de stop loss à 3 étapes ou plus.

Conclusion

Cette stratégie utilise les bandes de Bollinger et le stochastique pour les entrées, fixe deux objectifs de profit et déplace le stop loss à l'entrée après le premier objectif atteint pour former un stop loss en deux étapes.


/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 00:00:00
period: 1d
basePeriod: 1h
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/
// © fpsd4ve

//@version=5

// Add Bollinger Bands indicator (close, 20, 2) manually to visualise trading conditions
strategy("2xTP, SL to entry", 
     overlay=false,
     pyramiding=0,
     calc_on_every_tick=false,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=25,
     initial_capital=1000,
     commission_type=strategy.commission.percent,
     commission_value=0.01
     )

// PARAMETERS
// Assumes quote currency is FIAT as with BTC/USDT pair
tp1=input.float(200, title="Take Profit 1")
tp2=input.float(500, title="Take Profit 2")
sl=input.float(200, title="Stop Loss")
stOBOS = input.bool(true, title="Use Stochastic overbought/oversold threshold")

// Colors
colorRed = #FF2052
colorGreen = #66FF00


// FUNCTIONS
// Stochastic
f_stochastic() =>
    stoch = ta.stoch(close, high, low, 14)
    stoch_K = ta.sma(stoch, 3)
    stoch_D = ta.sma(stoch_K, 3)
    stRD = ta.crossunder(stoch_K, stoch_D)
    stGD = ta.crossover(stoch_K, stoch_D)
    [stoch_K, stoch_D, stRD, stGD]


// VARIABLES
[bbMiddle, bbUpper, bbLower] = ta.bb(close, 20, 2)
[stoch_K, stoch_D, stRD, stGD] = f_stochastic()


// ORDERS
// Active Orders
// Check if strategy has open positions
inLong = strategy.position_size > 0
inShort = strategy.position_size < 0
// Check if strategy reduced position size in last bar
longClose = strategy.position_size < strategy.position_size[1]
shortClose = strategy.position_size > strategy.position_size[1]

// Entry Conditions
// Enter long when during last candle these conditions are true:
// Candle high is greater than upper Bollinger Band
// Stochastic K line crosses under D line and is oversold
longCondition = stOBOS ?
     low[1] < bbLower[1] and stGD[1] and stoch_K[1] < 25 :
     low[1] < bbLower[1] and stGD[1]

// Enter short when during last candle these conditions are true:
// Candle low is lower than lower Bollinger Band
// Stochastic K line crosses over D line and is overbought
shortCondition = stOBOS ?
     high[1] > bbUpper[1] and stRD[1] and stoch_K[1] > 75 :
     high[1] > bbUpper[1] and stRD[1]

// Exit Conditions
// Calculate Take Profit 
longTP1 = strategy.position_avg_price + tp1
longTP2 = strategy.position_avg_price + tp2
shortTP1 = strategy.position_avg_price - tp1
shortTP2 = strategy.position_avg_price - tp2

// Calculate Stop Loss
// Initialise variables
var float longSL = 0.0
var float shortSL = 0.0

// When not in position, set stop loss using close price which is the price used during backtesting
// When in a position, check to see if the position was reduced on the last bar
// If it was, set stop loss to position entry price. Otherwise, maintain last stop loss value
longSL := if inLong and ta.barssince(longClose) < ta.barssince(longCondition)
    strategy.position_avg_price
else if inLong
    longSL[1]
else
    close - sl

shortSL := if inShort and ta.barssince(shortClose) < ta.barssince(shortCondition)
    strategy.position_avg_price
else if inShort
    shortSL[1]
else
    close + sl

// Manage positions
strategy.entry("Long", strategy.long, when=longCondition)
strategy.exit("TP1/SL", from_entry="Long", qty_percent=50, limit=longTP1, stop=longSL)
strategy.exit("TP2/SL", from_entry="Long", limit=longTP2, stop=longSL)

strategy.entry("Short", strategy.short, when=shortCondition)
strategy.exit("TP1/SL", from_entry="Short", qty_percent=50, limit=shortTP1, stop=shortSL)
strategy.exit("TP2/SL", from_entry="Short", limit=shortTP2, stop=shortSL)


// DRAW
// Stochastic Chart
plot(stoch_K, color=color.blue)
plot(stoch_D, color=color.orange)

// Circles
plot(stOBOS ? stRD and stoch_K >= 75 ? stoch_D : na : stRD ? stoch_D : na, color=colorRed, style=plot.style_circles, linewidth=3)
plot(stOBOS ? stGD and stoch_K <= 25 ? stoch_D : na : stGD ? stoch_K : na, color=colorGreen, style=plot.style_circles, linewidth=3)

// Levels
hline(75, linestyle=hline.style_dotted)
hline(25, linestyle=hline.style_dotted)

Plus de