Les ressources ont été chargées... Je charge...

Stratégie de négociation quantitative basée sur plusieurs indicateurs

Auteur:ChaoZhang est là., Date: 2023-10-25 18h06:44 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie combine plusieurs indicateurs techniques pour prendre des décisions commerciales longues et courtes.

La logique de la stratégie

La stratégie utilise principalement les bandes de Bollinger pour juger de la volatilité des prix. Le rétrécissement des bandes représente une diminution de la volatilité qui peut conduire à une rupture. Le RSI est utilisé pour identifier les conditions de surachat et de survente.

En outre, l'ADX est utilisé pour évaluer la force de la tendance. L'ADX élevé représente une tendance forte, favorisant le trading de tendance. L'ADX faible ne représente pas de tendance claire, compte tenu de l'inversion moyenne. Enfin, les moyennes mobiles définissent la direction de la tendance à long terme.

Plus précisément, lorsque les bandes se pressent, le RSI se rapproche de ses limites, et les prix s'écrasent en dessous de la bande inférieure, un rebond est attendu, allez long. Lorsque les bandes se pressent, le RSI se rapproche de ses limites, et les prix s'écrasent au-dessus de la bande supérieure, une baisse est attendue, allez court.

Analyse des avantages

La stratégie multi-indicateurs présente les avantages suivants:

  1. La combinaison d'indicateurs améliore la précision et la robustesse.

  2. Il considère à la fois le trading de tendance et de fourchette, adaptable aux différentes conditions du marché.

  3. Les longs et les shorts réduisent les risques directionnels et évitent les mouvements extrêmes.

  4. Arrêtez les pertes et prenez des profits, verrouillez les profits et limitez les pertes lorsque les transactions tournent mal.

  5. L'optimisation des paramètres améliore continuellement la stratégie en s'adaptant aux marchés changeants.

Analyse des risques

La stratégie comporte également certains risques:

  1. Plus d'indicateurs augmentent la complexité. Des réglages incorrects peuvent dégrader les performances. Des tests et une optimisation approfondis sont nécessaires.

  2. La surdépendance à l'égard des éléments techniques tout en ignorant les éléments fondamentaux peut entraîner des signaux inexacts.

  3. Les marchés ont peut-être déjà évolué lorsque des signaux émergent, ce qui représente un risque de poursuite.

  4. Le trading bidirectionnel augmente la fréquence, ce qui augmente les coûts et la pression.

  5. Il existe des risques d'ajustement de la courbe. La robustesse doit être testée sur divers marchés.

Les risques peuvent être gérés par un stop loss strict, une dimensionnement prudent des positions, un effet de levier raisonnable, etc. Dans l'ensemble, la stratégie présente une forte valeur pratique.

Des possibilités d'amélioration

Quelques façons d'optimiser la stratégie:

  1. Testez différents ensembles de paramètres pour trouver des valeurs optimales à l'aide d'algorithmes progressifs, aléatoires ou génétiques.

  2. Ajoutez plus d'indicateurs comme KDJ, Williams pour construire un ensemble d'indicateurs robuste.

  3. Optimiser les modèles de dimensionnement des positions pour gérer le risque de manière dynamique.

  4. Incorporer des modèles d'apprentissage automatique pour prédire les tendances et les mouvements des prix.

  5. Test sur différents produits, délais et marchés pour améliorer l'adaptabilité.

  6. Améliorer le calendrier d'entrée et de sortie pour détecter les tendances et les sortir avant les renversements.

  7. Utilisez la prise de bénéfices, les arrêts de trailing pour verrouiller les bénéfices et limiter les pertes.

  8. Ajouter des facteurs fondamentaux et une analyse de la structure du marché pour filtrer les signaux techniques.

Résumé

Cette stratégie automatise le trading en interprétant plusieurs indicateurs. Elle bénéficie de la validation croisée des indicateurs, du trading en double direction, du stop loss/take profit, etc. Le sur ajustement et les faux signaux nécessitent des précautions. L'optimisation et les tests continus peuvent la transformer en un système robuste et pratique, représentant l'avenir des stratégies de trading quantitatif.


/*backtest
start: 2023-09-24 00:00:00
end: 2023-10-24 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © The_Bigger_Bull
//@version=5
strategy("Best TradingView Strategy", overlay=true, margin_long=0, margin_short=0)
//Bollinger Bands
source1 = close
length1 = input.int(15, minval=1)
mult1 = input.float(2.0, minval=0.001, maxval=50)
basis1 = ta.sma(source1, length1)
dev1 = mult1 * ta.stdev(source1, length1)
upper1 = basis1 + dev1
lower1 = basis1 - dev1
//buyEntry = ta.crossover(source1, lower1)
//sellEntry = ta.crossunder(source1, upper1)

//RSI
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "Bollinger Bands" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

//plot(rsi, "RSI", color=#7E57C2)
//plot(rsiMA, "RSI-based MA", color=color.yellow)
rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86)
hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86)
fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")
bbUpperBand = plot(isBB ? rsiMA + ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Upper Bollinger Band", color=color.green)
bbLowerBand = plot(isBB ? rsiMA - ta.stdev(rsi, maLengthInput) * bbMultInput : na, title = "Lower Bollinger Band", color=color.green)
fill(bbUpperBand, bbLowerBand, color= isBB ? color.new(color.green, 90) : na, title="Bollinger Bands Background Fill")

//ADX

adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up1 = ta.change(high)
	down1 = -ta.change(low)
	plusDM = na(up1) ? na : (up1 > down1 and up1 > 0 ? up1 : 0)
	minusDM = na(down1) ? na : (down1 > up1 and down1 > 0 ? down1 : 0)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
	minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)




out = ta.sma(close, 14)

sma1=ta.sma(close,55)

ema200=ta.ema(close,200)



longCondition = (out>sma1) and ta.crossover(source1, lower1)

if (longCondition )
    strategy.entry("long", strategy.long)
    
shortCondition = (out<sma1) and ta.crossunder(source1, lower1)

if (shortCondition )
    strategy.entry("short", strategy.short)
    
    
stopl=strategy.position_avg_price-50
tptgt=strategy.position_avg_price+100
stopshort=strategy.position_avg_price+50
tptgtshort=strategy.position_avg_price-100

strategy.exit("longclose","long",trail_offset=5,trail_points=45,when=ta.crossover(sma1,out))
strategy.exit("shortclose","short",trail_offset=5,trail_points=45,when=ta.crossover(out,sma1))

    
//if strategy.position_avg_price<0
    
    
plot(sma1 , color=color.blue)
plot(out, color=color.green)
//plot(ema200,color=color.red)


    
    


Plus de