Une version extrême de la stratégie des moyennes mobiles de Noro

Auteur:ChaoZhang est là., Date: 2024-01-31 17h53
Les étiquettes:

img

Résumé

Cette stratégie utilise deux indicateurs de moyenne mobile pour identifier la direction de la tendance et les opportunités longues / courtes. La moyenne mobile plus lente (ligne bleue) est utilisée pour déterminer la direction globale de la tendance, tandis que la moyenne mobile plus rapide (ligne rouge) combinée au canal de prix est utilisée pour découvrir les opportunités de trading.

La logique de la stratégie

  1. Calculer deux moyennes mobiles - une moyenne mobile plus lente avec la période 21 pour déterminer la tendance globale, et une moyenne mobile plus rapide avec la période 5 qui se combine avec le canal de prix pour trouver des opportunités de négociation.

  2. Vérifiez si le prix actuel traverse le canal de prix formé au cours de la période précédente.

  3. Comptez le nombre et la direction des bougies récentes. Par exemple, plusieurs bougies baissières consécutives peuvent signaler une opportunité longue, tandis que des bougies haussières consécutives peuvent signaler une opportunité courte. Le nombre de bougies est configurable via le paramètre Bars.

  4. Combinez tous les facteurs ci-dessus pour générer des signaux long/short. Un signal est déclenché lorsque le mouvement du prix s'aligne sur la direction de la tendance MA plus lente, un MA rapide ou un canal de prix produit un signal et que le mouvement du chandelier correspond à la condition.

Les avantages

  1. Le système de moyenne mobile double suit efficacement la direction de la tendance.

  2. Un MA plus rapide et un canal de prix combinés détectent les premiers points de rupture pour saisir les opportunités de négociation.

  3. Considère également la direction du chandelier et compte pour éviter d'être pris au piège par les renversements du marché.

  4. Les paramètres MA personnalisables fonctionnent pour différents produits et délais.

Risques et atténuations

  1. Les MAs doubles peuvent produire de faux signaux pendant les marchés latéraux. peuvent ajouter des oscillateurs ou ATR pour éviter les marchés agités.

  2. Il risque toujours d'être pris au piège par des mouvements de marché exceptionnels.

  3. Impossible d'éviter complètement les retours en arrière, nous continuerons à améliorer la logique et les paramètres pour rendre la stratégie plus robuste.

Des possibilités d'amélioration

  1. Ajoutez des indicateurs de soutien comme ADX, MACD pour éviter les mauvais échanges sur les marchés instables.

  2. Le calcul dynamique du stop loss, par exemple basé sur l'ATR et la préférence de risque.

  3. Optimisation des paramètres par apprentissage automatique pour une capacité d'adaptation.

  4. Paramètres de réglage précis basés sur les caractéristiques de l'instrument, par exemple des périodes plus courtes pour les crypto.

Conclusion

Dans l'ensemble, cette stratégie fonctionne très bien dans le suivi des marchés en tendance, avec des opportunités de rupture supplémentaires. Avec des améliorations appropriées, elle peut être transformée en une stratégie quantitative de haute qualité commercialement viable. Nous continuerons à l'améliorer pour négocier plus de marchés de manière stable.


/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy(title = "Noro's Trend MAs Strategy v1.9 Extreme", shorttitle = "Trend MAs str 1.9 extreme", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0)

//Settings
needlong = input(true, "long")
needshort = input(true, "short")
needstops = input(false, "stops")
stoppercent = input(5, defval = 5, minval = 1, maxval = 50, title = "Stop, %")
useohlc4 = input(false, defval = false, title = "Use OHLC4")
usefastsma = input(true, "Use fast MA Filter")
fastlen = input(5, defval = 5, minval = 1, maxval = 50, title = "fast MA Period")
slowlen = input(21, defval = 20, minval = 2, maxval = 200, title = "slow MA Period")
bars = input(2, defval = 2, minval = 0, maxval = 3, title = "Bars Q")
needbg = input(false, defval = false, title = "Need trend Background?")
needarr = input(false, defval = false, title = "Need entry arrows?")
needex = input(true, defval = true, title = "Need extreme? (crypto/fiat only!!!)")

src = useohlc4 == true ? ohlc4 : close

//PriceChannel 1
lasthigh = highest(src, slowlen)
lastlow = lowest(src, slowlen)
center = (lasthigh + lastlow) / 2

//PriceChannel 2
lasthigh2 = highest(src, fastlen)
lastlow2 = lowest(src, fastlen)
center2 = (lasthigh2 + lastlow2) / 2

//Trend
trend = low > center and low[1] > center[1] ? 1 : high < center and high[1] < center[1] ? -1 : trend[1]

//Bars
bar = close > open ? 1 : close < open ? -1 : 0
redbars = bars == 0 ? 1 : bars == 1 and bar == -1 ? 1 : bars == 2 and bar == -1 and bar[1] == -1 ? 1 : bars == 3 and bar == -1 and bar[1] == -1 and bar[2] == -1 ? 1 : 0
greenbars = bars == 0 ? 1 : bars == 1 and bar == 1 ? 1 : bars == 2 and bar == 1 and bar[1] == 1 ? 1 : bars == 3 and bar == 1 and bar[1] == 1 and bar[2] == 1 ? 1 : 0

//Signals
up = trend == 1 and (low < center2 or usefastsma == false) and (redbars == 1) ? 1 : 0
dn = trend == -1 and (high > center2 or usefastsma == false) and (greenbars == 1) ? 1 : 0

up2 = high < center and high < center2 and bar == -1 ? 1 : 0
dn2 = low > center and low > center2 and bar == 1 ? 0 : 0

//Lines
plot(center, color = blue, linewidth = 3, transp = 0, title = "Slow MA")
plot(center2, color = red, linewidth = 3, transp = 0, title = "PriceChannel 2")

//Arrows
plotarrow(up == 1 and needarr == true ? 1 : 0, colorup = black, colordown = black, transp = 0)
plotarrow(dn == 1 and needarr == true ? -1 : 0, colorup = black, colordown = black, transp = 0)

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

//Alerts
alertcondition(up == 1, title='buy', message='Uptrend')
alertcondition(dn == 1, title='sell', message='Downtrend')

//Trading
stoplong = up == 1 and needstops == true ? close - (close / 100 * stoppercent) : stoplong[1]
stopshort = dn == 1 and needstops == true ? close + (close / 100 * stoppercent) : stopshort[1]

longCondition = up == 1 or (up2 == 1 and needex == true)
if (longCondition)
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na)
    strategy.exit("Stop Long", "Long", stop = stoplong)

shortCondition = dn == 1
if (shortCondition)
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)
    strategy.exit("Stop Short", "Short", stop = stopshort)

Plus de