Cette stratégie utilise la moyenne mobile de Hull pour déterminer la direction de la tendance et la combine avec le RSI stochastique pour les signaux d'entrée. Les transactions longues sont effectuées lorsque la ligne moyenne de la HMA traverse au-dessus de la ligne inférieure et les transactions courtes lorsqu'elle traverse au-dessous de la ligne supérieure.
Les composantes clés de cette stratégie sont la moyenne mobile de Hull pour la direction de la tendance et le RSI stochastique pour les signaux d'entrée en temps opportun.
Tout d'abord, le calcul de la MA de Hull comprend des formules pour les bandes intermédiaires, supérieures et inférieures.
La direction de la tendance est déterminée par la relation entre la bande du milieu et les bandes supérieures/inférieures.
Le calcul du RSI stochastique est également défini, y compris les valeurs Smoothed K et D. La valeur K utilise un lissage SMA sur le RSI, tandis que la valeur D est un deuxième lissage SMA sur le K.
Une fois la direction de la tendance déterminée, les transactions longues sont effectuées lorsque la ligne K du Stoch RSI traverse la ligne D en dessous de la zone de surachat pendant une tendance haussière. Les transactions courtes sont effectuées lorsque la ligne K traverse la ligne D en dessous de la zone de survente pendant une tendance baissière.
La combinaison du filtre de tendance de Hull et de l'analyse de surachat/survente du RSI de Stoch fournit une approche multifactorielle solide pour entrer dans les transactions.
Les principaux avantages de cette stratégie sont les suivants:
L'AM Hull détermine efficacement l'orientation générale de la tendance du marché.
L'indicateur RSI de Stoch détermine les niveaux de surachat/survente par entrée de temps.
Utiliser les deux ensemble réduit les faux signaux et combine les forces.
Flexibilité pour optimiser les paramètres pour différents symboles et délais.
Les bandes de coque permettent d'identifier le soutien et la résistance dynamiques potentiels.
Inclut les règles de dimensionnement des positions et de gestion des risques.
Capacité multi-actifs grâce au dictionnaire de données de coque.
Composants optimisables pour améliorer la rentabilité et réduire les recours.
Quelques risques à prendre en considération:
Hull MA a un retard et peut manquer les changements de tendance.
L'indice de volatilité des actions peut générer des signaux excessifs si les paramètres ne sont pas optimisés.
Un décalage entre les paramètres Hull et Stoch peut provoquer de mauvais signaux.
Les bandes de coque trop larges ou trop étroites auront une incidence sur la qualité du signal.
La volatilité récente des marchés remet en cause les indicateurs à moyen et long terme.
Des écarts de données entre Hull et Stoch provoquant de faux signaux.
Les changements de tendance brusques qui ne sont pas pris en compte par Hull peuvent entraîner des pertes.
Nous avons besoin de tests étendus sur plusieurs échéanciers et symboles.
Voici quelques moyens de les résoudre:
Réduction de la longueur de MA de la coque pour une plus grande sensibilité à la tendance.
Optimisez le RSI de Stoch pour filtrer les faux croisements.
Trouvez la largeur optimale du canal de la bande Hull.
Ajouter des indicateurs de confirmation supplémentaires tels que le MACD.
Incorporer des stratégies de stop loss pour contrôler le risque.
Certaines façons d'améliorer cette stratégie:
Testez sur plus de symboles dans différents délais pour vérifier la robustesse.
Incorporer des mécanismes de stop loss comme les trailing stops ou les moyennes mobiles.
Optimisez les règles d'entrée, mettez des filtres plus stricts pour réduire les faux signaux.
Explorez l'utilisation de bandes de coque pour mieux définir le support et la résistance.
Évaluer des indicateurs de confirmation supplémentaires pour améliorer la fiabilité du signal.
Optimisation des paramètres pour les longueurs, les niveaux de surachat/survente, etc.
Mettre en place une meilleure dimensionnement des positions et une meilleure gestion des risques.
Les règles d'entrée, de stop loss et de prise de profit sont essentielles pour le trading en direct.
Optimisez la longueur de la coque pour une meilleure sensibilité à la tendance.
Ajouter des filtres ou des indicateurs de confirmation pour améliorer la qualité du signal.
Explorez les bandes de coque pour les niveaux de soutien/résistance dynamiques.
Optimiser les paramètres du RSI comme la longueur, le surachat/survente.
Mettre en œuvre un dimensionnement avancé des positions et une gestion des risques.
Dans l'ensemble, il s'agit d'une approche efficace combinant tendance et dynamique. Cependant, les faiblesses inhérentes à l'indicateur signifient que les signaux ne doivent pas être aveuglément approuvés sans optimisation et contrôle des risques. Avec des paramètres raffinés, des filtres supplémentaires et des stop-loss, cette stratégie offre un potentiel. Des tests plus approfondis sont nécessaires pour les paramètres, la gestion des risques et la taille des positions pour la rendre robuste et rentable pour le trading en direct.
/*backtest start: 2023-10-16 00:00:00 end: 2023-10-17 00:00:00 period: 5m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 //Basic Hull Ma Pack tinkered by InSilico //Converted to Strategy by DashTrader strategy("Hull Suite + Stoch RSI Strategy v1.1", overlay=true, pyramiding=1, initial_capital=100, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.023) strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"]) strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all strategy.risk.allow_entry_in(strat_dir_value) ////////////////////////////////////////////////////////////////////// // Testing Start dates testStartYear = input(2016, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) //Stop date if you want to use a specific range of dates testStopYear = input(2030, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(30, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) stoch_upper_input = input(88, "Stoch Upper Threshold", type=input.float) stoch_lower_input = input(5, "Stoch Lower Threshold", type=input.float) sl = input(0.7, "SL %", type=input.float, step=0.1) tp = input(2.1, "TP %", type=input.float, step=0.1) // slowEMA = ema(close, slowEMA_input) // vwap = vwap(close) // rsi = rsi(close, rsi_input) // stoch rsi smoothK = 3 smoothD = 3 lengthRSI = 14 lengthStoch = 14 rsi1 = rsi(close, 14) k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK) d = sma(k, smoothD) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false // Component Code Stop ////////////////////////////////////////////////////////////////////// //INPUT src = input(close, title="Source") modeSwitch = input("Hma", title="Hull Variation", options=["Hma", "Thma", "Ehma"]) length = input(180, title="Length(180-200 for floating S/R , 55 for swing entry)") switchColor = input(true, "Color Hull according to trend?") candleCol = input(false,title="Color candles based on Hull's Trend?") visualSwitch = input(true, title="Show as a Band?") thicknesSwitch = input(1, title="Line Thickness") transpSwitch = input(40, title="Band Transparency",step=5) //FUNCTIONS //HMA HMA(_src, _length) => wma(2 * wma(_src, _length / 2) - wma(_src, _length), round(sqrt(_length))) //EHMA EHMA(_src, _length) => ema(2 * ema(_src, _length / 2) - ema(_src, _length), round(sqrt(_length))) //THMA THMA(_src, _length) => wma(wma(_src,_length / 3) * 3 - wma(_src, _length / 2) - wma(_src, _length), _length) //SWITCH Mode(modeSwitch, src, len) => modeSwitch == "Hma" ? HMA(src, len) : modeSwitch == "Ehma" ? EHMA(src, len) : modeSwitch == "Thma" ? THMA(src, len/2) : na //OUT HULL = Mode(modeSwitch, src, length) MHULL = HULL[0] SHULL = HULL[2] //COLOR hullColor = switchColor ? (HULL > HULL[2] ? #00ff00 : #ff0000) : #ff9800 //PLOT ///< Frame Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50) Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50) ///< Ending Filler fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch) ///BARCOLOR barcolor(color = candleCol ? (switchColor ? hullColor : na) : na) bgcolor(color = k < stoch_lower_input and crossover(k, d) ? color.green : na) bgcolor(color = d > stoch_upper_input and crossover(d, k) ? color.red : na) notInTrade = strategy.position_size == 0 if notInTrade and HULL[0] > HULL[2] and testPeriod() and k < stoch_lower_input and crossover(k, d) // if HULL[0] > HULL[2] and testPeriod() stopLoss = close * (1 - sl / 100) profit25 = close * (1 + (tp / 100) * 0.25) profit50 = close * (1 + (tp / 100) * 0.5) takeProfit = close * (1 + tp / 100) strategy.entry("long", strategy.long, alert_message="buy") strategy.exit("exit long 25%", "long", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25") strategy.exit("exit long 50%", "long", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50") strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit) // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green) // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green) // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80)) // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80)) if notInTrade and HULL[0] < HULL[2] and testPeriod() and d > stoch_upper_input and crossover(d, k) // if HULL[0] < HULL[2] and testPeriod() stopLoss = close * (1 + sl / 100) profit25 = close * (1 - (tp / 100) * 0.25) profit50 = close * (1 - (tp / 100) * 0.5) takeProfit = close * (1 - tp / 100) strategy.entry("short", strategy.short, alert_message="sell") strategy.exit("exit short 25%", "short", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25") strategy.exit("exit short 50%", "short", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50") strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit) // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green) // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green) // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80)) // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80)) // var table winrateDisplay = table.new(position.bottom_right, 1, 1) // table.cell(winrateDisplay, 0, 0, "Winrate: " + tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##')+" %", text_color=color.white)