La stratégie de dynamique stochastique est une stratégie de trading quantitative qui combine l'indice de dynamique stochastique (SMI) et l'indice de force relative (RSI).
L'indice de dynamique stochastique (SMI) est un indicateur technique courant utilisé dans le trading quantitatif qui combine les forces des indicateurs de dynamique et d'oscillation.
Plus précisément, l'IMC est calculé comme suit:
SMI = (près - (HH + LL) /2)/(0,5*(HH - LL)) * 100
où HH est le prix le plus élevé au cours des N derniers jours et LL est le prix le plus bas.
La stratégie SMI est basée sur le fait que les valeurs supérieures à 80 sont considérées comme surachetées, tandis que les valeurs inférieures à 20 sont considérées comme survendues.
L'indice de force relative (RSI) est un indicateur standard de surachat/survente. Cette stratégie utilise un RSI rapide avec une période de 7 pour juger des conditions de surachat/survente à court terme.
Les valeurs inférieures à 20 sont considérées comme survendues, tandis que celles supérieures à 80 sont considérées comme surachetées selon le RSI rapide.
La stratégie implémente également un filtre de corps en vérifiant la taille du corps du chandelier pour filtrer certains signaux.
Cela filtre certains faux signaux et augmente la fiabilité.
Cette approche combine le SMI, le RSI rapide et le filtre de carrosserie dans un système robuste en 3 parties.
L'indice de volatilité moyen (SMI) et l'indice de volatilité rapide (RSI) sont tous deux excellents pour détecter les tendances épuisées.
La capacité d'acheter à la fois des baisses et des hausses courtes maximise les opportunités dans toutes les conditions du marché.
Le filtre de la carrosserie évite les scies en rejetant les signaux de faible conviction dans des conditions de choc.
Les changements fréquents entre long et court entraînent un risque de piqûre.
Les signaux peuvent regrouper les acteurs du marché et provoquer des retours rapides à l'entrée.
Les événements extrêmes peuvent renverser tous les modèles.
En testant différentes périodes SMI/RSI et seuils de filtrage de carrosserie, des valeurs optimales pour des rendements plus élevés pourraient être détectées.
L'inclusion de stops basés sur la volatilité ou ATR devrait mieux contenir le risque de position et de portefeuille.
Les modèles qui prédisent les niveaux d'indicateurs futurs pourraient identifier les points tournants plus tôt.
En résumé, en intégrant le SMI, le RSI rapide et le filtre corporel, cette stratégie a créé un système de surachat/survente assez complet. L'approche multi-signal améliore la précision, tandis que la capacité de négociation bidirectionnelle et les contrôles des risques contribuent à l'équilibre.
/*backtest start: 2023-12-22 00:00:00 end: 2024-01-21 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Noro //2018 //@version=2 strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.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") 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") 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 = SMIsignal < -1 * limit and close < open and body and usesmi dn1 = SMIsignal > 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()