Stratégie Momentum Squeeze basée sur les bandes de Bollinger et les canaux de Kalkin


Date de création: 2024-01-30 17:33:49 Dernière modification: 2024-01-30 17:33:49
Copier: 0 Nombre de clics: 869
1
Suivre
1617
Abonnés

Stratégie Momentum Squeeze basée sur les bandes de Bollinger et les canaux de Kalkin

Aperçu

Il s’agit d’une stratégie de trading quantitative développée par LazyBear basée sur les indicateurs de dynamique d’extrusion. Cette stratégie intègre les bandes de Bryn, les canaux de Kalkin et les indicateurs de dynamique, permettant de réaliser des transactions de rupture de dynamique à haut taux de victoire grâce à une combinaison de plusieurs indicateurs techniques.

Principe de stratégie

L’indicateur central de cette stratégie est l’indicateur de la pression dynamique de LazyBear. L’indicateur détermine si la ceinture de Brin a été pressée par le canal de Kalkin, et lorsque la pression se produit, le marché entre dans un point de rupture potentiel.

Plus précisément, la stratégie commence par calculer une bande de Brin de 21 cycles, dont la largeur est le double de la différence de la norme de prix. Elle calcule également une chaîne de calcium de 20 cycles, dont la largeur est le double et demi de la dynamique des prix.

Sur le terrain, la tendance peut être inversée lorsque la couleur de l’indicateur de la dynamique devient grise, ce qui signifie la fin de l’état d’extrusion.

Avantages stratégiques

  1. L’intégration de plusieurs indicateurs techniques pour améliorer la précision des décisions de négociation

La stratégie intègre les bandes de Bryn, les canaux de Kalkin et les indicateurs de dynamique, et par la compréhension de la relation globale entre ces indicateurs, il est possible d’améliorer l’exactitude des décisions de négociation et de réduire la probabilité d’erreurs de négociation.

  1. Le point d’extrusion de la dynamique est précis, la marge de profit potentielle est grande

Les stratégies d’extrusion dynamique peuvent capturer les points critiques d’une éruption du marché, qui sont souvent les points de basculement où le marché prend des décisions importantes. Si les décisions sont correctement prises, la période de marché qui suit est relativement longue, de sorte que la stratégie a une grande marge de profit potentielle.

  1. Des transactions de pointe avec un taux de réussite élevé

Le point d’entrée choisi par la stratégie est situé à l’extrémité de la ceinture de Brin et du canal Kalkin, par rapport aux transactions de rupture aléatoires, et le taux de réussite des transactions est élevé selon l’intégration des indicateurs.

Risque stratégique

  1. Paramètres de réglage des risques de la ceinture de Brin et du canal Kalkin

Les paramètres de périodicité et de largeur de bande de la bande de Bryn et du canal de Kalkin ont une grande influence sur les résultats des transactions stratégiques. Si les paramètres sont mal configurés, cela peut entraîner des erreurs de jugement. Cela nécessite de trouver les meilleurs paramètres par un grand nombre de répétitions.

  1. Le risque d’échec

Toute transaction de rupture comporte le risque d’échec, et il est possible que le prix revienne à la position choisie par la stratégie, ce qui entraînera des pertes. Cela nécessite un arrêt strict des pertes pour le contrôler.

  1. Risque d’inversion de tendance

Lorsque l’état d’extrusion est terminé, la stratégie élimine toutes les positions. Cependant, il est parfois possible que la tendance des prix se poursuive, ce qui entraîne le risque d’une stratégie de sortie anticipée. Cela nécessite l’optimisation de la logique de jugement de sortie.

Orientation de l’optimisation de la stratégie

  1. Optimiser les paramètres

Il est possible d’améliorer l’efficacité de la stratégie en recherchant des paramètres de périodes et de bandes passantes plus favorables pour les bandes de Bryn et les canaux de Kalkin, par une plus grande quantité de données de test d’erreur de retour.

  1. Augmentation des stratégies de réduction des pertes

Il est possible de définir un stop mobile ou un stop oscillant, qui s’arrête rapidement lorsque le prix se retourne pour contrôler le retrait maximal de la stratégie.

  1. Des conditions de réadmission supplémentaires

Une fois que la stratégie est sortie de position, il est possible de définir certaines conditions de réentrée et de réentrée si la tendance continue.

  1. Plus d’indices

Il est possible d’essayer de combiner plus de différents types d’indicateurs, tels que d’autres indicateurs de volatilité, des indicateurs de volume de transaction, etc., pour créer une stratégie composite d’intégration d’indicateurs afin d’améliorer l’exactitude des décisions.

Résumer

La stratégie intègre les bandes de Bryn, les canaux de Calcul et les indicateurs de dynamique, en jugeant la relation entre ces indicateurs et en choisissant des points d’entrée de rupture à haut taux de réussite. Il y a de la place pour l’optimisation de la stratégie dans plusieurs aspects tels que l’optimisation des paramètres, les stratégies d’arrêt des pertes, les conditions de réentrée et l’intégration des indicateurs composés.

Code source 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")