Stratégie pour trouver un élan

Auteur:ChaoZhang est là., Date: 2024-01-25 12:34:59 Je suis désolé.
Les étiquettes:

img

Résumé

Cette stratégie utilise plusieurs indicateurs tels que les bandes de Bollinger, les canaux KC et les couleurs des bougies pour déterminer les compressions et les relâches du marché, et combine les jugements de tendance des établissements basés sur des moyennes mobiles pour effectuer des transactions lorsque des renversements de tendance se produisent.

Principe de stratégie

  1. Calculez les bandes de Bollinger. Le rail du milieu des bandes de Bollinger est la moyenne mobile simple des prix de clôture de N jours, le rail supérieur est le rail du milieu + M fois la volatilité de la plage réelle de N jours du canal KC, et le rail inférieur est le rail du milieu - M fois la volatilité de la plage réelle de N jours du canal KC.

  2. Calculez le canal KC. Le rail du milieu du canal KC est la moyenne mobile simple des prix de clôture de N jours, le rail supérieur est le rail du milieu + M fois la volatilité de la vraie plage de N jours, et le rail inférieur est le rail du milieu - M fois la volatilité de la vraie plage de N jours.

  3. Lorsque le rail supérieur de la bande de Bollinger est au-dessous du rail supérieur du canal KC et que le rail inférieur de la bande de Bollinger est au-dessus du rail inférieur du canal KC, il s'agit d'un pressage. Lorsque le rail supérieur de la bande de Bollinger est au-dessus du rail supérieur du canal KC et que le rail inférieur de la bande de Bollinger est au-dessous du KC, le rail inférieur du canal est relâché.

  4. Calculer l'évolution de l'établissement. Prendre comme entrée la moyenne des prix de clôture de N jours des prix les plus élevés et les plus bas de N jours, calculer la régression linéaire de N jours, et sa valeur supérieure à 0 indique une tendance à la hausse de l'établissement et inférieure à 0 indique une tendance à la baisse de l'établissement.

Les avantages de la stratégie

  1. La combinaison de bandes de Bollinger, de canaux KC et de chandeliers pour juger des tendances du marché évite les faux signaux.

  2. Utiliser l'établissement pour déterminer la tendance principale et éviter de négocier contre la tendance.

  3. Lorsque le prix touche la ligne de stop loss, la position est automatiquement fermée pour arrêter la perte.

Risques stratégiques

  1. Le jugement de l'évolution de l'établissement est en retard, ce qui peut manquer les points d'inversion de tendance.

  2. Des événements soudains provoquent des mouvements énormes qui ne peuvent être arrêtés, avec des risques de pertes considérables.

Méthodes d'optimisation: ajuster les paramètres de la bande de Bollinger et du canal KC, utiliser l'ADX et d'autres indicateurs pour aider à juger; mettre à jour le cycle de la moyenne mobile de l'établissement dans le temps pour réduire le décalage; ajouter une zone tampon lors de la définition de la ligne de stop-loss.

Directions d'optimisation de la stratégie

  1. Combiner plus d'indicateurs techniques pour améliorer la précision des signaux d'ouverture de positions. tels que KDJ, MACD, etc.

  2. Optimiser les paramètres de cycle de la moyenne mobile de l'établissement afin de mieux tenir compte des nouvelles tendances.

  3. Ajoutez des indicateurs de volume de négociation pour éviter les fausses ruptures, tels que l'indicateur de marée énergétique, l'accumulation/distribution, etc.

  4. Les jugements sur plusieurs délais distinguent les signaux à moyen et à long terme des signaux à court terme.

  5. Paramètres d'optimisation de l'IA, recherche exhaustive et combinaison optimale de paramètres recherchés.

Résumé


/*backtest
start: 2024-01-17 00:00:00
end: 2024-01-24 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2017

//@version=2
strategy(shorttitle = "Squeeze str 1.1", title="Noro's Squeeze Momentum Strategy v1.1", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
lev = input(1, defval = 1, minval = 1, maxval = 100, title = "leverage")
length = input(20, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
useTrueRange = true
mode2 = input(true, defval = true, title = "Mode 2")
usecolor = input(true, defval = true, title = "Use color of candle")
usebody = input(true, defval = true, title = "Use EMA Body")
needbg = input(false, defval = false, title = "Show trend background")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

// 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 = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : gray 

trend = val > 0 ? 1 : val < 0 ? -1 : 0

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 80)

//Body
body = abs(close - open)
abody = sma(body, 10) / 3

//Indicator
bcol = iff( val > 0, iff( val > nz(val[1]), lime, green), iff( val < nz(val[1]), red, maroon))
scol = noSqz ? blue : sqzOn ? black : gray 
plot(val, color=bcol, style=histogram, linewidth=4)
plot(0, color=scol, style=cross, linewidth=2)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0
up1 = trend == 1 and (bar == -1 or usecolor == false) and (body > abody or usebody == false) and mode2 == false
dn1 = trend == -1 and (bar == 1 or usecolor == false) and (body > abody or usebody == false) and mode2 == false

up2 = trend == 1 and val < val[1] and mode2 
dn2 = trend == -1 and val > val[1] and mode2

exit = (strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price) and mode2

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * lev : lot[1]

if up1 or up2
    strategy.entry("Long", strategy.long, needlong == false ? 0 : lot)

if dn1 or dn2
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot)
    
if exit
    strategy.close_all()

Plus de