Stratégies de trading basées sur les ruptures d'histogramme


Date de création: 2023-11-15 15:25:57 Dernière modification: 2023-11-15 15:25:57
Copier: 0 Nombre de clics: 700
1
Suivre
1617
Abonnés

Stratégies de trading basées sur les ruptures d’histogramme

Aperçu

Cette stratégie utilise le principe de rupture du graphique vertical, combiné à la détermination de la tendance des moyennes mobiles, pour réaliser des transactions de rupture dans la direction de la tendance. Un signal de transaction est généré lorsque le prix franchit la frontière du graphique vertical.

Principe de stratégie

  1. Calculer les moyennes mobiles rapides (en 20 cycles) et les moyennes mobiles lentes (en 50 cycles).

  2. Calculer si un rectangle ascendant (close>open) ou un rectangle descendant (close>open) est formé en fonction de la ligne K.

  3. Détermine si le rectangle a franchi le prix le plus élevé ou le prix le plus bas d’une ligne K précédente. Si le rectangle est en hausse et franchit le prix le plus élevé d’une ligne K précédente, un signal de rupture à plusieurs têtes est généré; si le rectangle est en baisse et franchit le prix le plus bas d’une ligne K précédente, un signal de rupture à vide est généré.

  4. Si la moyenne mobile rapide est au-dessus de la moyenne mobile lente, elle est considérée comme une tendance à plusieurs têtes; si elle l’est, elle est considérée comme une tendance à tête nue.

  5. Un signal de rupture de plusieurs têtes n’est efficace que si la moyenne rapide est jugée comme une tendance à plusieurs têtes; un signal de rupture de tête vide n’est efficace que si la moyenne rapide est jugée comme une tendance à tête nue. Cela évite de produire un signal erroné lors du comptage.

  6. Lors de la génération d’un signal de rupture de plusieurs têtes efficace, ouvrez des billets blancs selon un certain critère d’arrêt et d’arrêt.

  7. Si la moyenne mobile rapide et la moyenne mobile lente se déforment, la position actuelle est levée.

Analyse des avantages

  • L’utilisation de la frontière de l’incarnation rectangulaire comme ouverture de rupture représente un signal de rupture plus puissant.

  • En même temps, il faut tenir compte de la direction de la tendance pour éviter de générer des signaux erronés dans le calcul et améliorer la précision.

  • Il est important de prendre en compte les tendances et les ruptures pour que la stratégie soit efficace dans un contexte de tendances.

  • L’optimisation des paramètres permet de s’adapter à différentes variétés et périodes.

Les risques et les solutions

  • Le risque d’échec de la percée. La solution consiste à choisir un trou de percée plus grand pour assurer une meilleure dynamique de percée.

  • Risque d’inexactitude dans la détection des tendances. La solution consiste à ajuster les paramètres de la ligne moyenne ou à ajouter d’autres indicateurs auxiliaires à la détection des tendances.

  • Le risque d’un arrêt trop petit entraîne un arrêt trop fréquent. La solution consiste à ajuster l’intensité de l’arrêt en fonction de la dynamique des différentes variétés et des périodes de temps.

  • La solution consiste à régler différents ratios de profit et de perte en fonction de la dynamique des variétés et des périodes de temps.

Direction d’optimisation

  • Dans l’ensemble, les paramètres de la moyenne mobile, les paramètres de la porte de rupture, les paramètres de stop loss et de gain/perte doivent être testés et optimisés pour différentes variétés et périodes de temps, afin de personnaliser les paramètres de la stratégie.

  • Vous pouvez tester différents types de moyennes mobiles (EMA, SMA, etc.) pour trouver des moyennes plus appropriées.

  • D’autres indicateurs de jugement auxiliaires, tels que Momentum, peuvent être ajoutés pour améliorer l’exactitude des jugements sur les tendances.

  • Les paramètres peuvent être optimisés dynamiquement par des méthodes telles que l’apprentissage automatique.

  • Il est possible d’effectuer des apprentissages statistiques en fonction du taux de réussite des percées et d’ajuster les paramètres de percée.

Résumer

La stratégie intègre des traits de tendance et des traits de rupture, ce qui permet théoriquement de filtrer une grande quantité de signaux inefficaces. La clé est de se concentrer sur le test et l’optimisation des paramètres, afin de personnaliser la stratégie pour les différentes variétés et périodes de temps, afin d’obtenir de meilleurs résultats dans les transactions réelles.

Code source de la stratégie
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Backtested Time Frame: H1
//Default Settings: Are meant to run successfully on all currency pairs to reduce over-fitting.
//Risk Warning: This is a forex trading robot, backtest performance will not equal future performance, USE AT YOUR OWN RISK.
//Code Warning: Although every effort has been made for robustness, this code has not been vetted by independent 3rd parties.
strategy("Pin Bar Strategy v1", overlay=true)

// User Input
usr_risk = input(title="Equity Risk (%)",type=input.integer,minval=1,maxval=100,step=1,defval=3,confirm=false)
atr_mult = input(title="Stop Loss (x*ATR, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=1.9,confirm=false)
trd_rewd = input(title="Risk : Reward (1 : x*SL, Float)",type=input.float,minval=0.1,maxval=100,step=0.1,defval=3.1,confirm=false)
sma_fast = input(title="Fast MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=20,confirm=false)
sma_slow = input(title="Slow MA (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=50,confirm=false)
atr_valu = input(title="ATR (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=14,confirm=false)
use_slpe = input(title="Use MA Slope (Boolean)",type=input.bool,defval=true,confirm=false)
slp_long = input(title="Bull Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=1,confirm=false)
slp_shrt = input(title="Bear Slope Angle (Deg)",type=input.integer,minval=-90,maxval=90,step=1,defval=-1,confirm=false)
emg_exit = input(title="Exit When MA Re-Cross (Boolean)",type=input.bool,defval=true,confirm=false)
ent_canc = input(title="Cancel Entry After X Bars (Period)",type=input.integer,minval=1,maxval=500,step=1,defval=3,confirm=false)

// Create Indicators
fastSMA = sma(close, sma_fast)
slowSMA = sma(close, sma_slow)
bullishPinBar = ((close > open) and ((open - low) > 0.66 * (high - low))) or ((close < open) and ((close - low) > 0.66 * (high - low)))
bearishPinBar = ((close > open) and ((high - close) > 0.66 * (high - low))) or ((close < open) and ((high - open) > 0.66 * (high - low)))
atr = atr(atr_valu)

// Specify Trend Conditions
smaUpTrend = (fastSMA > slowSMA) and (fastSMA[1] > slowSMA[1]) and (fastSMA[2] > slowSMA[2]) and (fastSMA[3] > slowSMA[3]) and (fastSMA[4] > slowSMA[4])
smaDnTrend = (fastSMA < slowSMA) and (fastSMA[1] < slowSMA[1]) and (fastSMA[2] < slowSMA[2]) and (fastSMA[3] < slowSMA[3]) and (fastSMA[4] < slowSMA[4])
candleUpTrend = (close[5] > fastSMA[5]) and (open[5] > fastSMA[5]) and (close[6] > fastSMA[6]) and (open[6] > fastSMA[6]) and (close[7] > fastSMA[7]) and (open[7] > fastSMA[7]) and (close[8] > fastSMA[8]) and (open[8] > fastSMA[8]) and (close[9] > fastSMA[9]) and (open[9] > fastSMA[9]) and (close[10] > fastSMA[10]) and (open[10] > fastSMA[10])
candleDnTrend = (close[5] < fastSMA[5]) and (open[5] < fastSMA[5]) and (close[6] < fastSMA[6]) and (open[6] < fastSMA[6]) and (close[7] < fastSMA[7]) and (open[7] < fastSMA[7]) and (close[8] < fastSMA[8]) and (open[8] < fastSMA[8]) and (close[9] < fastSMA[9]) and (open[9] < fastSMA[9]) and (close[10] < fastSMA[10]) and (open[10] < fastSMA[10])

// Specify Piercing Conditions
bullPierce = ((low < fastSMA) and (open > fastSMA) and (close > fastSMA)) or ((low < slowSMA) and (open > slowSMA) and (close > slowSMA))
bearPierce = ((high > fastSMA) and (open < fastSMA) and (close < fastSMA)) or ((high > slowSMA) and (open < slowSMA) and (close < slowSMA))

// MA Slope Function
angle(_source) =>
    rad2degree=180/3.14159265359
    ang=rad2degree*atan((_source[0] - _source[1])/atr(atr_valu)) 

// Calculate MA Slope
fastSlope=angle(fastSMA)
slowSlope=angle(slowSMA)
slopingUp = fastSlope > slp_long
slopingDn = fastSlope < slp_shrt
    
// Specify Entry Conditions
longEntry = smaUpTrend and bullishPinBar and bullPierce
shortEntry = smaDnTrend and bearishPinBar and bearPierce
longEntryWithSlope = smaUpTrend and bullishPinBar and bullPierce and slopingUp
shortEntryWithSlope = smaDnTrend and bearishPinBar and bearPierce and slopingDn

// Specify Secondary Exit Conditions
longExit = crossunder(fastSMA, slowSMA)
shortExit = crossover(fastSMA, slowSMA)

// Long Entry Function
enterlong() =>
    risk = usr_risk * 0.01 * strategy.equity
    stopLoss = low[1] - atr[1] * atr_mult
    entryPrice = high[1]
    units = risk / (entryPrice - stopLoss)
    takeProfit = entryPrice + trd_rewd * (entryPrice - stopLoss)
    strategy.entry("long", strategy.long, units, stop=entryPrice)
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
// Short Entry Function
entershort() =>
    risk = usr_risk * 0.01 * strategy.equity
    stopLoss = high[1] + atr[1] * atr_mult
    entryPrice = low[1]
    units = risk / (stopLoss - entryPrice)
    takeProfit = entryPrice - trd_rewd * (stopLoss - entryPrice)
    strategy.entry("short", strategy.short, units, stop=entryPrice)
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
// Execute Long Entry w/o Slope
if (longEntry and use_slpe == false)
    enterlong()
    
// Execute Long Entry w/ Slope
if (longEntryWithSlope and use_slpe == true)
    enterlong()

// Exit Long Due to Re-Cross
if(longExit and strategy.position_size > 0 and emg_exit)    
    strategy.order("exit long, re-cross", strategy.short, abs(strategy.position_size))

// Cancel the Long Entry
strategy.cancel("long", barssince(longEntry) > ent_canc)

// Execute Short Entry w/o Slope
if (shortEntry and use_slpe == false)
    entershort() 
    
// Execute Short Entry w/ Slope
if (shortEntryWithSlope and use_slpe == true)
    entershort() 

// Exit Short Due to Re-Cross
if(shortExit and strategy.position_size < 0 and emg_exit)    
    strategy.order("exit short, re-cross", strategy.long, abs(strategy.position_size))

// Cancel the Short Entry
strategy.cancel("short", barssince(shortEntry) > ent_canc)

// Plot Moving Averages to Chart
plot(fastSMA, color=color.red)
plot(slowSMA, color=color.blue)

// Plot Pin Bars to Chart
plotshape(bullishPinBar, style=shape.arrowup, location=location.abovebar, color=#FF0000, text='')
plotshape(bearishPinBar, style=shape.arrowdown, location=location.belowbar, color=#0000FF, text='')