Stratégie des deux indicateurs de dynamique stochastique

Auteur:ChaoZhang est là., Date: 2023-10-07 16h45 et 25h
Les étiquettes:

Résumé

Cette stratégie utilise deux indicateurs de dynamique stochastique (SMI et RSI) pour les signaux longs et courts, ainsi qu'un martingale et un filtre corporel pour la sélection des signaux commerciaux, visant à capturer les tendances à moyen terme et les fluctuations de prix.

La logique de la stratégie

La stratégie juge long et court en utilisant deux indicateurs stochastiques SMI et RSI. SMI est calculé sur la base de la moyenne mobile de la plage de barres et le prix de clôture, bon pour identifier les points d'inversion.

Pour filtrer les fausses ruptures, la stratégie utilise également 1/3 de la SMA du corps de 10 périodes comme condition de filtre de rupture.

En outre, la stratégie adopte le martingale facultatif, qui consiste à augmenter les lots sur les transactions perdantes, en essayant de récupérer les pertes précédentes.

La fonctionnalité Backtest backtests la stratégie en entrant une plage de dates.

Analyse des avantages

La stratégie combine deux indicateurs et filtres stochastiques, capables d'identifier efficacement les points d'inversion, de détecter les tendances à moyen terme et de suivre les fluctuations des prix.

  • SMI a une forte capacité de reconnaissance du point de renversement et peut déterminer efficacement les conditions de surachat et de survente.
  • L'ajout du RSI évite les transactions manquantes.
  • Le filtre corporel élimine les fausses éruptions et améliore la précision du signal.
  • La stratégie martingale facultative permet de récupérer une partie des pertes.

Analyse des risques

  • En tant qu'indicateurs en retard, le SMI et le RSI présentent des risques de poursuivre les hauts et de tuer les bas.
  • Le martingale comporte le risque d'accélérer les pertes.
  • Les filtres peuvent filtrer certains signaux valides sur des marchés variés.

Les risques peuvent être atténués en optimisant les paramètres SMI et RSI afin de réduire la probabilité de poursuite/décision, en utilisant le martingale de manière stratégique en contrôlant le ratio et les temps de mise à l'échelle et en permettant des filtres discrétionnaires basés sur les conditions du marché.

Directions d'optimisation

  • Optimiser les paramètres SMI et RSI pour une meilleure efficacité de jugement.
  • Ajuster les paramètres du filtre pour réduire la probabilité de filtrage des signaux valides.
  • Optimiser les temps et le ratio de mise à l'échelle de Martingale.
  • Incorporer des indicateurs de tendance pour éviter de négocier contre la tendance.
  • Ajouter un stop loss pour limiter les pertes sur les transactions uniques.

Résumé

La stratégie combine deux indicateurs stochastiques pour capturer les points d'inversion, avec des filtres et un martingale pour la sélection et la poursuite des signaux commerciaux. Elle peut identifier efficacement les tendances à moyen terme et suivre les fluctuations de prix, adaptée aux investisseurs qui recherchent un taux de gain élevé. Faites attention aux risques de marché en retard et en variation des indicateurs, gérez les risques par optimisation des paramètres et stop loss.


/*backtest
start: 2022-09-30 00:00:00
end: 2023-10-06 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// strategy(title = "CS Basic Scripts - Stochastic Special (Strategy)", shorttitle = "Stochastic Special", 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")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")

//Backtesting Input Range
fromyear = input(2017, defval = 2017, 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), 7)
fastdown = rma(-min(change(close), 0), 7)
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)
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(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

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

//Signals
up1 = SMI < -1 * limit and close < open and body and usesmi
dn1 = SMI > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//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]

if up1 or up2
    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)))

if dn1 or dn2
    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