Stratégie de suivi des pertes d'arrêt ouvertes-haut-bas

Auteur:ChaoZhang est là., Date: 2024-02-18 14h30:08
Les étiquettes:

img

Résumé

Cette stratégie est conçue sur la base des données ouvertes, élevées et basses des graphiques de chandeliers pour identifier les points d'inversion de tendance pour les entrées. Après les entrées, les lignes de stop loss seront définies en fonction de l'indicateur ATR et suivie. Les cibles seront également calculées en fonction du ratio risque-rendement. Lorsque le prix atteint soit l'objectif de stop loss ou de profit, les ordres seront envoyés pour fermer les positions.

La logique de la stratégie

Les signaux d'entrée de cette stratégie proviennent des prix ouverts, élevés et bas. Un signal d'achat est généré lorsque le prix d'ouverture est égal au plus bas du chandelier, et un signal de vente est généré lorsque le prix d'ouverture est égal au plus haut, indiquant des opportunités potentielles d'inversion de tendance.

Après l'entrée, le stop loss dynamique est calculé sur la base de l'indicateur ATR. Le stop loss long est défini au plus bas des N bars récents moins 1 ATR; le stop loss court est défini au plus haut des N bars récents plus 1 ATR. La ligne de stop loss sera mise à jour dynamiquement pour suivre les mouvements de prix.

L'objectif long est fixé au prix d'entrée plus (la différence de risque entre le prix d'entrée et la perte d'arrêt multipliée par le ratio risque-rendement); l'objectif court est fixé au prix d'entrée moins (la différence de risque entre la perte d'arrêt et le prix d'entrée multipliée par le ratio risque-rendement).

Lorsque le prix atteint l'objectif de stop loss ou de profit, les ordres seront envoyés à des positions de plafonnement.

Analyse des avantages

Les avantages de cette stratégie sont les suivants:

  1. Des signaux d'entrée simples et clairs, évitant de multiples coups de fouet.

  2. L'ATR dynamique arrête les profits et empêche de courir après les hauts et les bas.

  3. Le contrôle du rapport risque/rendement évite de laisser les bénéfices sur la table et de sur-trader.

  4. Applicable à différents produits, facile à optimiser.

Analyse des risques

Cette stratégie comporte également certains risques:

  1. Les signaux d'entrée peuvent retarder dans une certaine mesure, manquant la meilleure entrée sur le marché.

  2. Le stop loss est trop serré ou trop lâche, ce qui entraîne un stop loss inutile ou des profits manquants.

  3. Aucune détermination de tendance, sujette à être piégée dans des marchés variables.

  4. Incapable de gérer les positions de nuit.

Les orientations d'optimisation sont les suivantes:

  1. Incorporer d'autres indicateurs pour le biais de tendance afin d'éviter les problèmes.

  2. Ajustez les paramètres ATR ou ajoutez un contrôle de volatilité pour un meilleur stop loss.

  3. Ajouter un filtre de tendance pour réduire le bruit du signal.

  4. Pour certains produits, ajouter la manipulation de position pendant la nuit.

Conclusion

En conclusion, il s'agit d'une stratégie simple et directe avec une logique d'entrée claire, une méthodologie de stop loss raisonnable et un bon contrôle des risques. Mais il existe certaines limitations telles qu'un biais de tendance insuffisant, un retard de signal, etc. Ces défauts indiquent également des directions pour une optimisation future. En incorporant plus de filtres d'indicateurs et de modules de gestion des risques, cette stratégie peut être encore améliorée et rendue plus robuste.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Open-High-Low strategy

strategy('Strategy: OLH', shorttitle="OLH", overlay=true )

// Inputs
slAtrLen = input.int(defval=14, title="ATR Period for placing SL", group="StopLoss settings")
showSLLines = input.bool(defval=false, title="Show SL lines in chart", tooltip="Show SL lines also as dotted lines in chart. Note: chart may look untidy.", group="Stolploss settings")
// Trade related
rrRatio = input.float(title='Risk:Reward', step=0.1, defval=2.0, group="Trade settings")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=true, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked.", group="Trade settings")
lotSize = input.int(title='Lot Size', step=1, defval=1, group="Trade settings")


// Utils
green(open, close) => close > open ? true : false
red(open, close) => close < open ? true : false
body(open, close) => math.abs(open - close)
lowerwick = green(open, close) ? open - low : close - low
upperwick = green(open, close) ? high - close : high - open
crange = high - low
crangep = high[1] - low[1] // previous candle's candle-range
bullish = close > open ? true : false
bearish = close < open ? true : false


// Trade signals
longCond = barstate.isconfirmed and (open == low)
shortCond = barstate.isconfirmed and (open == high)

// For SL calculation
atr = ta.atr(slAtrLen)
highestHigh = ta.highest(high, 7)
lowestLow = ta.lowest(low, 7)
longStop = showSLLines ? lowestLow - (atr * 1) : na
shortStop = showSLLines ? highestHigh + (atr * 1) : na
plot(longStop, title="Buy SL", color=color.green, style=plot.style_cross)
plot(shortStop, title="Sell SL", color=color.red, style=plot.style_cross)

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, lotSize, limit=na, stop=na, comment="Enter Long")
        sl := longStop
        target := close + ((close - longStop) * rrRatio)
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, lotSize, limit=na, stop=na, comment="Enter Short")
        sl := shortStop
        target := close - ((shortStop - close) * rrRatio)
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long SL hit" : "Long target hit")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short SL hit" : "Short target hit")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "Close all entries at end of day.")



Plus de