Cette stratégie utilise une combinaison de trois indicateurs techniques différents pour élaborer une stratégie d'arbitrage trans-cyclique qui capture les tendances des prix sur différentes périodes afin d'obtenir des rendements excédentaires à faible risque.
Les trois indicateurs techniques utilisés dans cette stratégie sont Keltner Channel (KC), Volatility Stop (Vstop) et Williams Alligator (WAE). Le canal de Keltner est utilisé pour déterminer si les prix sont en dehors de la plage du canal et générer ainsi des signaux de trading.
Lorsque le prix est supérieur à la ligne supérieure du canal de Keltner, il est considéré comme un signal haussier.
Il peut s'ajuster dynamiquement pour assurer un stop loss tout en évitant des positions de stop loss trop conservatrices.
L'indicateur Williams Alligator évalue si les prix sont dans une forte tendance haussière ou à la baisse en calculant la largeur du canal MACD et la bande de Bollinger.
En combinant ces trois indicateurs, les signaux sont validés en croisement sur différentes périodes, ce qui réduit la probabilité d'erreurs de jugement et crée une logique de stratégie optimisée.
Le plus grand avantage de cette stratégie est les signaux de trading précis apportés par la combinaison de plusieurs indicateurs. Les trois indicateurs fonctionnent dans des délais différents et se valident mutuellement, ce qui peut réduire efficacement la probabilité d'erreur de jugement et améliorer la précision des signaux.
En comparaison avec les stratégies à indicateur unique, cette stratégie combinée peut fournir des signaux de trading plus précis et plus efficaces.
Le principal risque de cette stratégie est que des paramètres incorrects peuvent provoquer un surajustement. Les trois indicateurs ont 8 paramètres au total. Des paramètres incorrects peuvent affecter négativement la stratégie. En outre, la relation de poids entre les indicateurs doit également être correctement configurée, sinon les signaux peuvent se neutraliser et devenir invalides.
Pour réduire ces risques, l'adaptabilité aux différents environnements de marché doit être pleinement prise en compte lors de la définition des paramètres et la combinaison optimale de paramètres doit être ajustée par l'analyse de backtesting.
L'espace d'optimisation de cette stratégie se concentre principalement sur deux aspects: l'ajustement des paramètres et l'amélioration des stratégies de stop loss.
Choisissez les paramètres d'indicateur de manière plus scientifique et optimisez les combinaisons de paramètres.
Améliorer la stratégie de stop-loss pour réduire davantage les stop-loss inutiles tout en assurant le stop-loss, améliorant ainsi le taux de gain. Par exemple, incorporer plus d'indicateurs comme signaux de stop-loss ou définir un retrait progressif des positions stop-loss.
Optimiser les pondérations entre les indicateurs et la logique des jugements des signaux de trading pour réduire le taux de faux-jugements.
Essayez d'introduire des modèles d'apprentissage automatique pour obtenir une optimisation automatique des paramètres ou utilisez une programmation d'apprentissage par renforcement profond pour l'évaluation et l'amélioration de la stratégie.
Cette stratégie construit un système d'arbitrage à cycle croisé grâce à la combinaison de Keltner Channel, Volatility Stop et Williams Alligator. La combinaison multi-indicateur améliore la précision du signal et contrôle les risques de stop loss dynamiques. Mais il y a place à l'amélioration de la définition et de l'optimisation des paramètres. Dans l'ensemble, cette stratégie a une forte scientifique et mérite d'être poursuivie.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy("QuarryLake", overlay=true) ///Ultilized modified full kelly for this strategy = 36% ///Keltner channel/// nPeriod = input(title="Keltner Period", type=input.integer, defval=200, minval=1) Mult = input(title="Keltner Mult", type=input.integer, defval=5, minval=1) xPrice = ema(hlc3, nPeriod) xMove = ema(high - low, nPeriod) xMoveMult = xMove * Mult xUpper = xPrice + xMoveMult xLower = xPrice - xMoveMult // plot(xPrice, color=red, title="KSmid") p1 = plot(xUpper, color=color.white, title="KSup") p2 = plot(xLower, color=color.white, title="KSdn") fill(p1, p2, color=close > xUpper ? color.green : close < xLower ? color.red : color.white) kclongcondition = close > xUpper kcshortcondition = close < xLower kccloselongcondition = crossunder(close, xUpper) kccloseshortcondition = crossover(close, xLower) ///Volatility Stop/// length = input(title="Vstop length", type=input.integer, defval=3, minval=1) mult1 = 1.5 atr_ = atr(length) max1 = 0.0 min1 = 0.0 is_uptrend_prev = false stop = 0.0 vstop_prev = 0.0 vstop1 = 0.0 is_uptrend = false is_trend_changed = false max_ = 0.0 min_ = 0.0 vstop = 0.0 max1 := max(nz(max_[1]), close) min1 := min(nz(min_[1]), close) is_uptrend_prev := nz(is_uptrend[1], true) stop := is_uptrend_prev ? max1 - mult1 * atr_ : min1 + mult1 * atr_ vstop_prev := nz(vstop[1]) vstop1 := is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop) is_uptrend := close - vstop1 >= 0 is_trend_changed := is_uptrend != is_uptrend_prev max_ := is_trend_changed ? close : max1 min_ := is_trend_changed ? close : min1 vstop := is_trend_changed ? is_uptrend ? max_ - mult1 * atr_ : min_ + mult1 * atr_ : vstop1 plot(vstop, color=is_uptrend ? color.green : color.red, style=plot.style_line, linewidth=1) vstoplongcondition = close > vstop vstoplongclosecondition = crossunder(close, vstop) vstopshortcondition = close < vstop vstopshortclosecondition = crossover(close, vstop) ///Waddah Attar Explosion/// sensitivity = input(150, title="Sensitivity") fastLength = input(20, title="FastEMA Length") slowLength = input(40, title="SlowEMA Length") channelLength = input(20, title="BB Channel Length") mult = input(2.0, title="BB Stdev Multiplier") DEAD_ZONE = nz(rma(tr(true), 100)) * 3.7 calc_macd(source, fastLength, slowLength) => fastMA = ema(source, fastLength) slowMA = ema(source, slowLength) fastMA - slowMA calc_BBUpper(source, length, mult) => basis = sma(source, length) dev = mult * stdev(source, length) basis + dev calc_BBLower(source, length, mult) => basis = sma(source, length) dev = mult * stdev(source, length) basis - dev t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity t2 = (calc_macd(close[2], fastLength, slowLength) - calc_macd(close[3], fastLength, slowLength)) * sensitivity e1 = calc_BBUpper(close, channelLength, mult) - calc_BBLower(close, channelLength, mult) trendUp = t1 >= 0 ? t1 : 0 trendDown = t1 < 0 ? -1 * t1 : 0 waelongcondition = trendUp and trendUp > DEAD_ZONE and trendUp > e1 waeshortcondition = trendDown and trendDown > DEAD_ZONE and trendDown > e1 ///Long Entry/// longcondition = kclongcondition and vstoplongcondition and waelongcondition if longcondition strategy.entry("Long", strategy.long) ///Long exit/// closeconditionlong = kccloselongcondition or vstoplongclosecondition if closeconditionlong strategy.close("Long") ///Short Entry/// shortcondition = kcshortcondition and vstopshortcondition and waeshortcondition if shortcondition strategy.entry("Short", strategy.short) ///Short exit/// closeconditionshort = kccloseshortcondition or vstopshortclosecondition if closeconditionshort strategy.close("Short") ///Free Hong Kong, the revolution of our time///