L'indice de dynamique stochastique et la stratégie de négociation quantitative basée sur l'indice RSI

Auteur:ChaoZhang est là., Date: 12-12-2023 15:20:29 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie est principalement basée sur deux indicateurs - l'indice de dynamique stochastique (SMI) et l'indice de force relative (RSI). Elle intègre également un filtre de couleur et un filtre de corps de bougie comme conditions de jugement auxiliaires. Les signaux de trading sont générés sur la base des signaux d'achat et de vente de SMI et RSI, combinés aux conditions de filtre. Cette stratégie peut effectivement découvrir des opportunités de trading à court terme sur le marché.

La logique de la stratégie

Cette stratégie repose sur les indicateurs SMI et RSI pour le jugement. SMI juge principalement si un stock est suracheté ou survendu, tandis que RSI détermine la force relative d'un stock. Lorsque les deux indicateurs donnent des signaux d'achat en même temps, une action d'achat sera déclenchée.

  1. Lorsque le SMI est survendu (en dessous de la limite inférieure), il est considéré comme un signal d'achat
  2. Lorsque le RSI est inférieur au seuil, il est considéré comme un signal d'achat
  3. Lorsqu'il y a une survente du SMI et un RSI inférieur au seuil correspondant, un signal d'achat est déclenché.
  4. La logique du signal de vente est similaire.

En outre, cette stratégie a un mode de signaux doubles. Ce mode nécessite à la fois des signaux SMI et RSI pour déclencher tout commerce. Cela peut réduire efficacement les faux signaux.

En outre, un filtre couleur et un filtre de corps de bougie sont incorporés. Ces filtres nécessitent un corps de bougie relativement grand et la dernière bougie se ferme plus haut que l'ouverture.

Les avantages

  1. Utilisez SMI pour les surachats/survente et RSI pour la force relative, la double confirmation peut réduire les faux signaux
  2. Le mode double signal peut réduire considérablement les transactions inefficaces
  3. Les filtres de couleur et de corps peuvent filtrer efficacement les fausses éruptions
  4. La logique de la stratégie est simple et claire.
  5. La plupart des paramètres sont personnalisables

Risques et optimisation

  1. SMI et RSI peuvent produire plus de faux signaux lorsqu'ils sont utilisés seuls, nécessitent un examen attentif
  2. En mode double signal, de bonnes opportunités de négociation peuvent être manquées si les paramètres ne sont pas réglés correctement
  3. Peut tester la rentabilité de la stratégie sous différents paramètres périodiques pour trouver la combinaison optimale de paramètres
  4. Peut évaluer les paramètres de seuil par simulation ou backtesting
  5. Peut envisager d'intégrer plus de filtres pour optimiser la stratégie

Résumé

Cette stratégie intègre les signaux des indicateurs SMI et RSI et génère des ordres de négociation par confirmation double. Filtre de couleur et filtre de corps de bougie sont également implémentés pour filtrer les fausses ruptures.


/*backtest
start: 2023-12-04 00:00:00
end: 2023-12-06 19:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.3", shorttitle = "Stochastic str 1.3", 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")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usecol = input(true, defval = true, title = "Use Color-Filter")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent K Length")
b = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent D Length")
limitsmi = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
periodrsi = input(2, defval = 2, minval = 2, maxval = 50, title = "RSI Period")
limitrsi = input(10, defval = 10, minval = 1, maxval = 50, title = "RSI Limit")
double = input(false, defval = false, title = "SMI+RSI Mode")
showbg = input(false, defval = false, title = "Show 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")

//Fast RSI
fastup = rma(max(change(close), 0), periodrsi)
fastdown = rma(-min(change(close), 0), periodrsi)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
//avgrel = ema(ema(rdiff,b),b)
//avgdiff = ema(ema(diff,b),b)
avgrel = sma(sma(rdiff,b),b)
avgdiff = sma(sma(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limitsmi, color = black, title = "Over Bought")
plot(-1 * limitsmi, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Color-Filter
gb = close > open or usecol == false
rb = close < open or usecol == false

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMI < -1 * limitsmi and rb and body and usesmi
dn1 = SMI > limitsmi and gb and body and usesmi
up2 = fastrsi < limitrsi and rb and body and usersi
dn2 = fastrsi > 100 - limitrsi and gb and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Background
redb = (SMI > limitsmi and usesmi) or (fastrsi > 100 - limitrsi and usersi)
limeb = (SMI < -1 * limitsmi and usesmi) or (fastrsi < limitrsi and usersi)
col = showbg == false ? na : redb ? red : limeb ? lime : na
bgcolor(col, transp = 50)

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

signalup = ((up1 or up2) and double == false) or (up1 and up2 and double)
if signalup
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

signaldn = ((dn1 or dn2) and double == false) or (dn1 and dn2 and double)
if signaldn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Plus de