Cette stratégie combine deux indicateurs techniques traditionnels: l'indicateur Oma et l'indicateur Apollo pour mettre en œuvre le trading double-rail de positions longues et courtes. Son idée de base est de trouver des opportunités de rebond à court terme lorsque la tendance à moyen et long terme est jugée haussière afin d'établir des positions longues.
Cette stratégie utilise des moyennes mobiles de 50 et 200 jours pour déterminer la tendance à moyen et long terme.
Ensuite, la stratégie utilise l'indicateur Oma pour localiser les opportunités d'inversion de prix à court terme. L'indicateur Oma comprend des lignes %K et %D, qui sont les résultats de l'indicateur RSI lissé par une moyenne mobile simple. Lorsque %K dépasse le seuil de surachat (au-dessus de 80), il indique que le prix passe d'un état de surachat à un repli à la baisse; lorsque %K dépasse le seuil de surachat (au-dessous de 20), il indique que le prix rebondit à partir de la zone de surachat, ce qui présente une opportunité longue.
En outre, pour filtrer davantage les faux signaux, cette stratégie intègre également l'indicateur Apollo. L'indicateur Apollo affiche les points extrêmes des valeurs %D de la ligne K. Lorsque %K forme un nouveau bas, cela signifie que la force de rebond est relativement faible. Lorsqu'elle forme un nouveau haut, cela signifie que la force de rebond est relativement forte. Combiné avec les signaux de l'indicateur Oma, cela peut encore améliorer la précision de l'entrée.
Plus précisément, dans une tendance à la hausse, cette stratégie vérifiera les nouvelles informations sur le point le plus élevé en même temps que l'indicateur Oma montre une opportunité en dessous de la zone de surachat, pour confirmer la force du rebond.
Grâce au processus ci-dessus, cette stratégie tire pleinement parti des atouts du jugement des tendances à moyen et long terme et des indicateurs d'inversion à court terme pour construire un système de négociation à double voie stable.
La stratégie combine le trading de tendance et le trading de contre-tendance en utilisant à la fois des indicateurs de jugement de tendance et d'inversion, formant un cadre de trading hybride stable.
Le double filtre d'indicateur permet de réduire le taux de faux signaux et d'améliorer la fiabilité des signaux.
Les paramètres de stratégie sont relativement simples, faciles à comprendre et à optimiser, adaptés au trading quantitatif.
Le rendement de la stratégie est solide, avec un bon taux de réussite et des caractéristiques de rapport risque/rendement.
En adoptant des rails doubles pour longs et courts, les opportunités de négociation peuvent être obtenues en continu sans être limitées à une seule direction.
En tant que stratégie d'inversion, des pertes consécutives peuvent survenir lorsque la tendance change.
La stratégie nécessite un contrôle émotionnel relativement élevé de la part du trader, qui doit résister à un certain niveau de retrait.
Certains paramètres tels que les périodes moyennes mobiles impliquent une certaine subjectivité et doivent être déterminés par le biais de tests antérieurs et d'optimisation.
Les indicateurs Oma et Apollo ont une certaine sensibilité aux fluctuations anormales et peuvent échouer dans des conditions de marché extrêmes.
Cette stratégie est plus adaptée aux marchés volatiles liés à la fourchette et peut être moins performante sur les marchés à forte tendance.
Les risques peuvent être atténués en ajustant de manière appropriée la période de moyenne mobile pour introduire un filtrage de tendance et en ajoutant un stop loss/take profit.
Testez différentes combinaisons de paramètres pour obtenir de meilleurs paramètres, par exemple en utilisant des moyennes mobiles lisses EWMA.
Ajouter des indicateurs de volume ou de BV pour juger de la divergence qui peut aider à vérifier la fiabilité du signal.
Ajouter des indices de volatilité comme le VIX comme indicateurs de surveillance, pour réduire la taille de la position lorsque le marché est en panique.
Optimiser les stratégies stop loss/take profit, comme l'adoption d'un ATR stop loss dynamique.
Introduire des algorithmes d'apprentissage automatique pour optimiser dynamiquement les paramètres.
Ajouter des modèles multifactoriels pour améliorer la qualité du signal.
Dans l'ensemble, il s'agit d'une stratégie de trading quantitative stable et efficace. Elle combine le jugement de tendance et les indicateurs d'inversion, et adopte une double vérification à l'aide des indicateurs Oma et Apollo, qui peuvent détecter efficacement les opportunités d'inversion de prix à court terme. Par rapport à l'utilisation de systèmes purement de tendance ou d'inversion, cette forme de stratégie est plus robuste avec un contrôle de retrait supérieur, et est une stratégie de trading quantitative recommandée. Bien sûr, les utilisateurs doivent également être conscients des risques encourus, et utiliser l'optimisation des paramètres, le stop loss / take profit, l'identification du régime de marché, etc. pour contrôler les risques et obtenir les meilleures performances.
/*backtest start: 2023-10-25 00:00:00 end: 2023-10-28 00:00:00 period: 5m basePeriod: 1m 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/ // © PtGambler //@version=5 strategy("2 EMA + Stoch RSI + ATR [Pt]", shorttitle = "2EMA+Stoch+ATR", overlay=true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills = false, max_bars_back = 500) // ********************************** Trade Period / Strategy Setting ************************************** startY = input(title='Start Year', defval=2011, group = "Backtesting window") startM = input.int(title='Start Month', defval=1, minval=1, maxval=12, group = "Backtesting window") startD = input.int(title='Start Day', defval=1, minval=1, maxval=31, group = "Backtesting window") finishY = input(title='Finish Year', defval=2050, group = "Backtesting window") finishM = input.int(title='Finish Month', defval=12, minval=1, maxval=12, group = "Backtesting window") finishD = input.int(title='Finish Day', defval=31, minval=1, maxval=31, group = "Backtesting window") timestart = timestamp(startY, startM, startD, 00, 00) timefinish = timestamp(finishY, finishM, finishD, 23, 59) // ****************************************************************************************** group_ema = "EMA" group_stoch = "Stochastic RSI" group_atr = "ATR Stoploss Finder" // ----------------------------------------- 2 EMA ------------------------------------- ema1_len = input.int(50, "EMA Length 1", group = group_ema) ema2_len = input.int(200, "EMA Length 2", group = group_ema) ema1 = ta.ema(close, ema1_len) ema2 = ta.ema(close, ema2_len) plot(ema1, "ema1", color.white, linewidth = 2) plot(ema2, "ema2", color.orange, linewidth = 2) ema_bull = ema1 > ema2 ema_bear = ema1 < ema2 // -------------------------------------- Stochastic RSI ----------------------------- smoothK = input.int(3, "K", minval=1, group = group_stoch) smoothD = input.int(3, "D", minval=1, group = group_stoch) lengthRSI = input.int(14, "RSI Length", minval=1, group = group_stoch) lengthStoch = input.int(14, "Stochastic Length", minval=1, group = group_stoch) src = close rsi1 = ta.rsi(src, lengthRSI) k = ta.sma(ta.stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK) d = ta.sma(k, smoothD) var trigger_stoch_OB = k > 80 var trigger_stoch_OS = k < 20 stoch_crossdown = ta.crossunder(k, d) stoch_crossup = ta.crossover(k, d) P_hi = ta.pivothigh(k,1,1) P_lo = ta.pivotlow(k,1,1) previous_high = ta.valuewhen(P_hi, k, 1) previous_low = ta.valuewhen(P_lo, k, 1) recent_high = ta.valuewhen(P_hi, k, 0) recent_low = ta.valuewhen(P_lo, k, 0) // --------------------------------------- ATR stop loss finder ------------------------ length = input.int(title='Length', defval=14, minval=1, group = group_atr) smoothing = input.string(title='Smoothing', defval='EMA', options=['RMA', 'SMA', 'EMA', 'WMA'], group = group_atr) m = input.float(0.7, 'Multiplier', step = 0.1, group = group_atr) src1 = input(high, "Source for upper band", group = group_atr) src2 = input(low, "Source for lower band", group = group_atr) showatr = input.bool(true, 'Show ATR Bands', group = group_atr) collong = input.color(color.purple, 'Long ATR SL', inline='1', group = group_atr) colshort = input.color(color.purple, 'Short ATR SL', inline='2', group = group_atr) ma_function(source, length) => if smoothing == 'RMA' ta.rma(source, length) else if smoothing == 'SMA' ta.sma(source, length) else if smoothing == 'EMA' ta.ema(source, length) else ta.wma(source, length) a = ma_function(ta.tr(true), length) * m up = ma_function(ta.tr(true), length) * m + src1 down = src2 - ma_function(ta.tr(true), length) * m p1 = plot(showatr ? up : na, title='ATR Short Stop Loss', color=colshort) p2 = plot(showatr ? down : na, title='ATR Long Stop Loss', color=collong) // ******************************* Profit Target / Stop Loss ********************************************* RR = input.float(2.0, "Reward to Risk ratio (X times SL)", step = 0.1, group = "Profit Target") var L_PT = 0.0 var S_PT = 0.0 var L_SL = 0.0 var S_SL = 0.0 BSLE = ta.barssince(strategy.opentrades.entry_bar_index(0) == bar_index) if strategy.position_size > 0 and BSLE == 1 L_PT := close + (close-down)*RR L_SL := L_SL[1] S_PT := close - (up - close)*RR S_SL := up else if strategy.position_size < 0 and BSLE == 1 S_PT := close - (up - close)*RR S_SL := S_SL[1] L_PT := close + (close-down)*RR L_SL := down else if strategy.position_size != 0 L_PT := L_PT[1] S_PT := S_PT[1] else L_PT := close + (close-down)*RR L_SL := down S_PT := close - (up - close)*RR S_SL := up entry_line = plot(strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : na, "Entry Price", color.white, linewidth = 1, style = plot.style_linebr) L_PT_line = plot(strategy.position_size > 0 and BSLE > 0 ? L_PT : na, "L PT", color.green, linewidth = 2, style = plot.style_linebr) S_PT_line = plot(strategy.position_size < 0 and BSLE > 0 ? S_PT : na, "S PT", color.green, linewidth = 2, style = plot.style_linebr) L_SL_line = plot(strategy.position_size > 0 and BSLE > 0 ? L_SL : na, "L SL", color.red, linewidth = 2, style = plot.style_linebr) S_SL_line = plot(strategy.position_size < 0 and BSLE > 0 ? S_SL : na, "S SL", color.red, linewidth = 2, style = plot.style_linebr) fill(L_PT_line, entry_line, color = color.new(color.green,90)) fill(S_PT_line, entry_line, color = color.new(color.green,90)) fill(L_SL_line, entry_line, color = color.new(color.red,90)) fill(S_SL_line, entry_line, color = color.new(color.red,90)) // ---------------------------------- strategy setup ------------------------------------------------------ var L_entry_trigger1 = false var S_entry_trigger1 = false L_entry_trigger1 := ema_bull and close < ema1 and k < 20 and strategy.position_size == 0 S_entry_trigger1 := ema_bear and close > ema1 and k > 80 and strategy.position_size == 0 L_entry1 = L_entry_trigger1[1] and stoch_crossup and recent_low > previous_low S_entry1 = S_entry_trigger1[1] and stoch_crossdown and recent_high < previous_high //debugging plot(L_entry_trigger1[1]?1:0, "L Entry Trigger") plot(stoch_crossup?1:0, "Stoch Cross Up") plot(recent_low > previous_low?1:0, "Higher low") plot(S_entry_trigger1[1]?1:0, "S Entry Trigger") plot(stoch_crossdown?1:0, "Stoch Cross down") plot(recent_high < previous_high?1:0, "Lower high") if L_entry1 strategy.entry("Long", strategy.long) if S_entry1 strategy.entry("Short", strategy.short) strategy.exit("Exit Long", "Long", limit = L_PT, stop = L_SL, comment_profit = "Exit Long, PT hit", comment_loss = "Exit Long, SL hit") strategy.exit("Exit Short", "Short", limit = S_PT, stop = S_SL, comment_profit = "Exit Short, PT hit", comment_loss = "Exit Short, SL hit") //resetting triggers L_entry_trigger1 := L_entry_trigger1[1] ? L_entry1 or ema_bear or S_entry1 ? false : true : L_entry_trigger1 S_entry_trigger1 := S_entry_trigger1[1] ? S_entry1 or ema_bull or L_entry1 ? false : true : S_entry_trigger1 //Trigger zones bgcolor(L_entry_trigger1 ? color.new(color.green ,90) : na) bgcolor(S_entry_trigger1 ? color.new(color.red,90) : na)