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.
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.
Les avantages de cette stratégie sont les suivants:
Des signaux d'entrée simples et clairs, évitant de multiples coups de fouet.
L'ATR dynamique arrête les profits et empêche de courir après les hauts et les bas.
Le contrôle du rapport risque/rendement évite de laisser les bénéfices sur la table et de sur-trader.
Applicable à différents produits, facile à optimiser.
Cette stratégie comporte également certains risques:
Les signaux d'entrée peuvent retarder dans une certaine mesure, manquant la meilleure entrée sur le marché.
Le stop loss est trop serré ou trop lâche, ce qui entraîne un stop loss inutile ou des profits manquants.
Aucune détermination de tendance, sujette à être piégée dans des marchés variables.
Incapable de gérer les positions de nuit.
Les orientations d'optimisation sont les suivantes:
Incorporer d'autres indicateurs pour le biais de tendance afin d'éviter les problèmes.
Ajustez les paramètres ATR ou ajoutez un contrôle de volatilité pour un meilleur stop loss.
Ajouter un filtre de tendance pour réduire le bruit du signal.
Pour certains produits, ajouter la manipulation de position pendant la nuit.
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.")