Stratégie de rupture de l' élan

Auteur:ChaoZhang est là., Date: 2024-01-30 17:33:49 Je vous en prie.
Les étiquettes:

img

Résumé

Il s'agit d'une stratégie de trading quantitative développée sur la base de l'indicateur Momentum Squeeze de LazyBear.

La logique de la stratégie

L'indicateur de base de cette stratégie est l'indicateur Momentum Squeeze de LazyBear. Cet indicateur détermine si les bandes de Bollinger sont squeezées par les canaux Keltner. Lorsque la compression se produit, elle représente que le marché est entré dans un point d'éclatement potentiel. En combinant la direction de l'indicateur de momentum, les transactions peuvent être effectuées lorsque la compression est libérée pour capturer l'éclatement du marché.

Plus précisément, la stratégie calcule d'abord les bandes de Bollinger de 21 périodes, avec une largeur de 2 écarts types du prix. En même temps, elle calcule les canaux de Keltner de 20 périodes, avec une largeur de 1,5 fois l'amplitude du prix. Lorsque les bandes de Bollinger sont compressées par les canaux de Keltner, un signal de compression est déclenché. En outre, la stratégie calcule également la dynamique du prix par rapport au point médian de son propre canal de prix sur une période de temps. Lorsqu'une compression se produit, combinée à la directionnalité de l'indicateur de dynamique, elle détermine si acheter ou vendre.

Pour les sorties, lorsque la couleur de l'indicateur de momentum change en gris, cela signifie que l'état de compression est terminé et que la tendance peut s'inverser.

Les avantages

  1. Intégre plusieurs indicateurs techniques pour améliorer la précision

En évaluant la relation globale entre ces indicateurs, l'exactitude des décisions de négociation peut être améliorée et la probabilité de transactions erronées réduite.

  1. Points de compression de l'élan précis avec un potentiel de profit élevé

La stratégie d'épuisement de l'élan peut capturer les points clés où le marché est susceptible d'éclater. Ces points sont souvent des points d'inflexion où le marché rend des jugements directionnels importants. Si jugé correctement, le mouvement ultérieur du marché sera relativement long, de sorte que l'espace de profit potentiel de la stratégie est grand.

  1. Réaliser des opérations de rupture avec un taux de réussite élevé

Comparé à la négociation de rupture aléatoire, le point d'entrée sélectionné par cette stratégie est au point de serrage entre les bandes de Bollinger et les canaux de Keltner.

Les risques

  1. Risque d'un réglage incorrect des paramètres

Les paramètres de cycle et les paramètres de bande passante des bandes de Bollinger et des canaux de Keltner ont un grand impact sur les résultats de négociation.

  1. Risque d'échec de rupture

Il y a toujours un risque que le prix puisse revenir après avoir franchi le point sélectionné par cette stratégie, provoquant une perte.

  1. Risque d'inversion de tendance

Lorsque l'état de compression se termine, cette stratégie fermera toutes les positions. Cependant, parfois, la tendance des prix peut encore se poursuivre, ce qui pose le risque d'une sortie prématurée. La logique de sortie doit être optimisée.

Directions d'optimisation

  1. Optimiser les paramètres

Grâce à des essais de données de backtesting, de meilleurs paramètres de cycle et de bande passante peuvent être trouvés pour améliorer les performances de la stratégie.

  1. Ajouter une stratégie de stop loss

Mettez des arrêts en mouvement ou en oscillation pour réduire rapidement les pertes lorsque les prix s'inversent.

  1. Ajouter des conditions de réentrée

Lorsque la stratégie sort des positions, certaines conditions de rentrée peuvent être fixées pour une rentrée sur le marché si la tendance se poursuit.

  1. Incorporer plus d'indicateurs

Essayez d'intégrer davantage d'indicateurs de différents types, tels que d'autres indicateurs de volatilité, de volume, etc., afin d'établir une stratégie composite d'intégration des indicateurs, afin d'améliorer la précision des décisions.

Résumé

La stratégie intègre les bandes de Bollinger, les canaux de Keltner et les indicateurs de dynamique. En jugeant les relations entre ces indicateurs, elle entre à des points de rupture à taux de réussite élevé. Il existe des espaces d'optimisation dans de nombreux aspects tels que l'optimisation des paramètres, les stratégies de stop loss, les conditions de réentrée et l'intégration d'indicateurs composites pour améliorer davantage les performances de la stratégie.


/*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
//All credits to LazyBear. All I did was turn it into a strategy!

strategy(title = "SQZMOM STRAT", overlay=false)

// --- GENERAL INPUTS ---
FromMonth = input(defval = 4, title = "From Month", minval = 1, maxval = 12)
FromYear  = input(defval = 2020, title = "From Year", minval = 2012)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
FromDay   = 1
ToDay     = 1
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

get_round(value, precision) => round(value * (pow(10, precision))) / pow(10, precision)
trade_leverage = input(1, title = "Trade - Leverage", step = 0.25)
trade_risk     = input(100, title = "Trade - Risk Percent", type = input.float, step = 0.1, minval = 0.1, maxval = 100)
tradeType   = input("LONG", title="What trades should be taken : ", options=["LONG", "SHORT", "BOTH"])

// --- SQZMOM CODE

length = input(21, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")

useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool)

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

bcolor = color.gray
if (val > 0 and val > nz(val[1]))
    bcolor := color.green
if (val < 0 and val < nz(val[1]))
    bcolor := color.red

scolor = noSqz ? color.blue : sqzOn ? color.black : color.gray 
plot(val, color=bcolor, style=plot.style_histogram, linewidth=4)
plot(0, color=scolor, style=plot.style_cross, linewidth=2)

// --- VWMA CODE ---
useVWMA        = input(false, title = "Use VWMA to selectively long/short?", type = input.bool)
lengthVWMA=input(42, title = "VWMA Length", step = 1, minval = 1)
useCV=input(false, type=input.bool, title="Use Cumulative Volume for VWMA?")
nbfs = useCV ? cum(volume) : sum(volume, lengthVWMA)
medianSrc=close

calc_evwma(price, lengthVWMA, nb_floating_shares) => data = (nz(close[1]) * (nb_floating_shares - volume)/nb_floating_shares) + (volume*price/nb_floating_shares)

m=calc_evwma(medianSrc, lengthVWMA, nbfs)


// ---STRATEGY---
if ((tradeType == "LONG" or tradeType == "BOTH") and (m>0 or useVWMA == false))
    longCondition = (val > 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (longCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("LONG", strategy.long, qty = contracts, when = window())
        
if((tradeType == "SHORT" or tradeType == "BOTH") and (m<0 or useVWMA == false))
    shortCondition = (val < 0 and noSqz == 0 and sqzOn == 0 and sqzOn[1] == 1)
    if (shortCondition)
        contracts = get_round((strategy.equity * trade_leverage / close) * (trade_risk / 100), 4)
        strategy.entry("SHORT", strategy.short, qty = contracts, when = window())

if (bcolor == color.gray)
    strategy.close("LONG")
    strategy.close("SHORT")

Plus de