Stratégie de trading combinée de l'indicateur Hall et de l'indicateur stochastique


Date de création: 2023-10-18 12:40:23 Dernière modification: 2023-10-18 12:40:23
Copier: 1 Nombre de clics: 602
1
Suivre
1166
Abonnés

Stratégie de trading combinée de l’indicateur Hall et de l’indicateur stochastique

Aperçu

Cette stratégie utilise l’indicateur Hall pour déterminer la direction de la tendance, puis se combine avec l’indicateur aléatoire pour entrer dans la position. Lorsque la ligne centrale de Hall traverse la voie descendante, il voit l’entrée de l’aiguille, et lorsqu’elle traverse la voie descendante, il voit l’entrée de l’aiguille.

Principe de stratégie

La stratégie de négociation utilise principalement l’indicateur de Hall pour déterminer la direction de la tendance du marché, puis l’indicateur aléatoire pour une entrée spécifique.

Tout d’abord, la stratégie définit la méthode de calcul de l’indicateur de Hall, y compris la formule de calcul de la voie moyenne, de la voie supérieure et de la voie inférieure. La voie moyenne est calculée à l’aide d’une moyenne mobile pondérée WMA, la voie supérieure et la voie inférieure étant respectivement les déviations de la voie moyenne.

Ensuite, la direction de la tendance est déterminée en fonction de la relation entre le milieu de l’orbite et le haut et le bas de l’orbite. Lorsque le milieu de l’orbite traverse l’orbite, il représente une tendance à la hausse avec un fort cours d’achat; lorsque le milieu de l’orbite traverse le bas de l’orbite, il représente une tendance à la baisse avec un fort cours de vente.

En outre, la stratégie définit la méthode de calcul de l’indicateur aléatoire, y compris la formule de calcul des valeurs K et D. Les valeurs K sont utilisées pour l’aplatissement SMA du RSI, tandis que la valeur D est l’aplatissement SMA de la valeur K.

Après avoir déterminé la direction de la tendance, si vous êtes en hausse, faites plus lorsque la ligne K de l’indicateur aléatoire traverse la ligne D en dessous de la zone de survente; si vous êtes en baisse, faites moins lorsque la ligne K traverse la ligne D depuis la zone de survente.

Ainsi, une entrée plus stable et plus précise peut être effectuée en combinant les jugements de tendance de l’indicateur Hall et les jugements de survente et de survente de l’indicateur aléatoire.

Analyse des avantages

Le plus grand avantage de cette stratégie est qu’elle permet une analyse multidimensionnelle du marché, avec une plus grande précision d’entrée de marché, combinée à un jugement de tendance et à un jugement de survente.

Plus précisément, les principaux avantages sont les suivants:

  1. L’indicateur de Hall permet de déterminer efficacement la direction des tendances du marché et de se positionner à un niveau plus large.

  2. Les indices aléatoires permettent de juger les surachats et les surventeurs, de maîtriser les variations de la force des acheteurs et des vendeurs, et de mieux saisir le moment de l’entrée.

  3. L’utilisation conjointe de ces deux technologies permet de tirer parti de leurs avantages respectifs, de vérifier les signaux les uns des autres et de réduire le nombre de faux signaux.

  4. Il s’adapte avec souplesse à différentes variétés et périodes de temps grâce à un ajustement des paramètres.

  5. L’utilisation de la déviation du milieu de la trajectoire pour former des canaux de négociation ascendants et descendants permet d’identifier les supports et résistances potentiels.

  6. STOP LOSS, EXIT ON TARGETS pourcentage utilisé pour faire évoluer les positions

  7. Use of hull data Dictionary gives multiple asset class flexibility

  8. La direction d’optimisation choisie peut améliorer la stabilité et la rentabilité de la stratégie

Analyse des risques

Cette stratégie comporte également des risques à prendre en compte, principalement:

  1. L’indicateur Hall est en retard et risque de manquer un tournant de tendance, entraînant des pertes inutiles.

  2. Une mauvaise configuration des paramètres de l’indicateur aléatoire peut générer un signal supplémentaire. Un signal croisé entre la ligne K et la ligne D doit être filtré de manière appropriée.

  3. L’indicateur de Hall est utilisé en combinaison avec l’indicateur aléatoire, ce qui peut entraîner un signal erroné si les paramètres ne correspondent pas correctement.

  4. La largeur des rails, trop grande ou trop petite, affecte la qualité du signal de transaction et nécessite un test minutieux pour trouver les meilleurs paramètres.

  5. La situation est instable ces derniers temps, et les indicateurs de la ligne moyenne et longue risquent de ne pas fonctionner bien.

  6. Data mismatches between hull and stoch causing false signals

  7. Sharp trend changes not caught by hull can cause losses

  8. Testing on more timeframes/symbols needed to verify robustness

Pour ces risques, il est possible d’optimiser en fonction des points suivants:

  1. Réduire la longueur de l’indicateur Hall de manière appropriée pour augmenter la sensibilité aux changements de tendance.

  2. Optimiser les paramètres des indicateurs aléatoires pour réduire les faux signaux.

  3. Ajustez les paramètres d’ascension et de descente pour trouver la largeur de passage optimale.

  4. Ajout d’autres signaux de vérification de l’indicateur, tels que MACD, etc.

  5. Il a ajouté des stratégies d’arrêt des pertes pour contrôler les risques.

Direction d’optimisation

La stratégie peut également être optimisée dans les domaines suivants:

  1. Tester plus de variétés et plus de paramètres de cycle de temps pour vérifier la stabilité de la stratégie.

  2. L’augmentation des mécanismes de stop-loss, tels que le stop-loss de suivi, le stop-loss mobile, etc., permet de mieux contrôler les risques.

  3. Optimisation de la logique des conditions d’entrée, mise en place de conditions de filtrage plus strictes et réduction des faux signaux.

  4. La recherche vise à mieux déterminer les points de support et de résistance en utilisant le canal Hall.

  5. Découvrez si vous pouvez ajouter des signaux de validation à d’autres indicateurs.

  6. Optimisation des paramètres tels que la longueur de l’indicateur Hall, l’indicateur aléatoire K, les paramètres de lissage de D, etc.

  7. Ajout de fonctionnalités de gestion des positions. Adaptation de la taille des positions en fonction du nombre de retraits et de victoires consécutives.

  8. La règle du stop loss et du stop stop est ajoutée.

  9. Optimize hull length parameter for better trend sensitivity

  10. Add additional filters or confirming indicators to improve signal quality

  11. Explore using hull bands to identify dynamic support/resistance levels

  12. Parameter optimization for stoch RSI lengths, overbought/oversold levels

  13. Introduce better position sizing and risk management rules

Résumer

Dans l’ensemble, la stratégie d’intégration des jugements de tendance et des jugements de surachat et de survente pour l’entrée en bourse est une bonne idée. Cependant, en raison des problèmes liés à l’indicateur lui-même, ses signaux de négociation ne sont pas entièrement fiables et doivent être optimisés. L’efficacité de la stratégie peut être attendue si l’on peut trouver la meilleure combinaison de paramètres, complétée par d’autres indicateurs de vérification et des moyens de contrôle du risque.

Code source de la stratégie
/*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)