Stratégie de négociation des moyennes mobiles ajustées à la volatilité

Auteur:ChaoZhang est là., Date: 2023-11-07 17:18:05 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie utilise une combinaison de la moyenne mobile T3, de l'indicateur ATR et de Heikin Ashi pour identifier les signaux d'achat et de vente, et utilise l'ATR pour calculer les niveaux de stop loss et de profit pour la tendance après la négociation.

Analyse des principes

Calculs des indicateurs

  • Moyenne mobile T3: Calcule une moyenne mobile T3 lissée (période par défaut 100) pour déterminer la direction de la tendance

  • ATR: Calcule la fourchette réelle moyenne, utilisée pour déterminer la taille de la perte d'arrêt/du bénéfice de prise

  • ATR Trailing Stop: Calcule un stop loss basé sur ATR qui est ajusté en fonction des mouvements de prix et de la volatilité

Logique du commerce

  • Signal d'achat: déclenché lorsque la clôture dépasse l'arrêt de trail ATR et est inférieure à la moyenne mobile T3

  • Signal de vente: déclenché lorsque la clôture passe en dessous de l'arrêt de trail ATR et est supérieure à la moyenne mobile T3

  • Le montant de l'obligation est calculé à partir de la valeur de l'obligation.

Entrée et sortie

  • Entrée longue: Stop loss est le prix d'entrée moins ATR, take profit est le prix d'entrée plus ATR * ratio risque/rendement

  • Entrée courte: Stop-loss est le prix d'entrée plus ATR, take profit est le prix d'entrée moins ATR * ratio risque/rendement

  • Sortie lorsque le prix atteint les niveaux de stop loss ou de take profit

Analyse des avantages

Réaction rapide

La période de défaut de la moyenne mobile T3 est de 100, plus sensible que les moyennes mobiles typiques pour une réaction plus rapide aux variations de prix

Contrôle des risques

L'ATR trailing stop se déplace avec la volatilité du marché pour éviter d'être arrêté.

La tendance suivante

ATR trailing stop suit la tendance, évitant la sortie prématurée même pendant les retraits à court terme

Optimisation des paramètres

Les périodes pour le T3 et l'ATR peuvent être optimisées pour différents marchés afin d'améliorer la robustesse

Analyse des risques

Arrêtez la perte

Des mouvements de prix sévères pourraient pénétrer le stop loss provoquant une perte.

Retour sur la tendance

Les pertes possibles si la tendance s'inverse et que le prix franchit l'arrêt de suivi.

Optimisation et surajustement

L'optimisation des paramètres risque de suradapter les données historiques limitées.

Des possibilités d'amélioration

  • Tester différentes périodes de moyenne mobile T3 pour trouver un équilibre optimal de sensibilité et de stabilité

  • Optimiser la période ATR pour trouver le meilleur contrôle des risques et la meilleure tendance après équilibre

  • Incorporer RSI, MACD pour éviter les mauvaises transactions à des points tournants

  • Apprentissage automatique pour des paramètres automatisés optimaux, réduisant les biais manuels

  • Ajouter des règles de dimensionnement des positions pour mieux contrôler le risque

Résumé

Cette stratégie combine les avantages du T3 et de l'ATR pour permettre une réponse rapide avec un contrôle des risques. Des améliorations supplémentaires de la stabilité et de l'efficacité sont possibles grâce à l'optimisation des paramètres et à des filtres supplémentaires.


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

//@version=5
strategy(title='UT Bot Alerts (QuantNomad) Strategy w/ NinjaView', overlay=true)
T3 = input(100)//600
// Input for Long Settings
// Input for Long Settings


xPrice3 = close
xe1 = ta.ema(xPrice3, T3)
xe2 = ta.ema(xe1, T3)
xe3 = ta.ema(xe2, T3)
xe4 = ta.ema(xe3, T3)
xe5 = ta.ema(xe4, T3)
xe6 = ta.ema(xe5, T3)

b3 = 0.7
c1 = -b3*b3*b3
c2 = 3*b3*b3+3*b3*b3*b3
c3 = -6*b3*b3-3*b3-3*b3*b3*b3
c4 = 1+3*b3+b3*b3*b3+3*b3*b3
nT3Average = c1 * xe6 + c2 * xe5 + c3 * xe4 + c4 * xe3

//plot(nT3Average, color=color.white, title="T3")

// Buy Signal - Price is below T3 Average
buySignal3 = xPrice3 < nT3Average
sellSignal3 = xPrice3 > nT3Average
// Inputs
a = input(1, title='Key Value. "This changes the sensitivity"')
c = input(50, title='ATR Period')
h = input(true, title='Signals from Heikin Ashi Candles')
riskRewardRatio = input(1, title='Risk Reward Ratio')

xATR = ta.atr(c)
nLoss = a * xATR

src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=barmerge.lookahead_off) : close

xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2

pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossunder(ema, xATRTrailingStop)

buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below

barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop

plotshape(buy, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(sell, title='Sell', text='Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

barcolor(barbuy ? color.new(color.green, 90) : na)
barcolor(barsell ? color.new(color.red, 90) : na)

var float entryPrice = na
var float takeProfitLong = na
var float stopLossLong = na
var float takeProfitShort = na
var float stopLossShort = na

if buy and buySignal3
    entryPrice := src
    takeProfitLong := entryPrice + nLoss * riskRewardRatio
    stopLossLong := entryPrice - nLoss
    takeProfitShort := na
    stopLossShort := na

if sell and sellSignal3
    entryPrice := src
    takeProfitShort := entryPrice - nLoss * riskRewardRatio
    stopLossShort := entryPrice + nLoss
    takeProfitLong := na
    stopLossLong := na

// Strategy order conditions
acct = "Sim101"
ticker = "ES 12-23"
qty = 1

OCOMarketLong = '{ "alert": "OCO Market Long", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '", "qty": "' + str.tostring(qty) + '", "take_profit_price": "' + str.tostring(takeProfitLong) + '", "stop_price": "' + str.tostring(stopLossLong) + '", "tif": "DAY" }'
OCOMarketShort = '{ "alert": "OCO Market Short", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '", "qty": "' + str.tostring(qty) + '", "take_profit_price": "' + str.tostring(takeProfitShort) + '", "stop_price": "' + str.tostring(stopLossShort) + '", "tif": "DAY" }'
CloseAll = '{ "alert": "Close All", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '" }'

strategy.entry("Long", strategy.long, when=buy ,alert_message=OCOMarketLong)
strategy.entry("Short", strategy.short, when=sell , alert_message=OCOMarketShort)

// Setting the take profit and stop loss for long trades
strategy.exit("Take Profit/Stop Loss", "Long", stop=stopLossLong, limit=takeProfitLong,alert_message=CloseAll)

// Setting the take profit and stop loss for short trades
strategy.exit("Take Profit/Stop Loss", "Short", stop=stopLossShort, limit=takeProfitShort,alert_message=CloseAll)

// Plot trade setup boxes
bgcolor(buy ? color.new(color.green, 90) : na, transp=0, offset=-1)
bgcolor(sell ? color.new(color.red, 90) : na, transp=0, offset=-1)

longCondition = buy and not na(entryPrice)
shortCondition = sell and not na(entryPrice)

var line longTakeProfitLine = na
var line longStopLossLine = na
var line shortTakeProfitLine = na
var line shortStopLossLine = na

if longCondition
    longTakeProfitLine := line.new(bar_index, takeProfitLong, bar_index + 1, takeProfitLong, color=color.green, width=2)
    longStopLossLine := line.new(bar_index, stopLossLong, bar_index + 1, stopLossLong, color=color.red, width=2)
    label.new(bar_index + 1, takeProfitLong, str.tostring(takeProfitLong, "#.#####"), color=color.green, style=label.style_none, textcolor=color.green, size=size.tiny)
    label.new(bar_index + 1, stopLossLong, str.tostring(stopLossLong, "#.#####"), color=color.red, style=label.style_none, textcolor=color.red, size=size.tiny)

if shortCondition
    shortTakeProfitLine := line.new(bar_index, takeProfitShort, bar_index + 1, takeProfitShort, color=color.green, width=2)
    shortStopLossLine := line.new(bar_index, stopLossShort, bar_index + 1, stopLossShort, color=color.red, width=2)
    label.new(bar_index + 1, takeProfitShort, str.tostring(takeProfitShort, "#.#####"), color=color.green, style=label.style_none, textcolor=color.green, size=size.tiny)
    label.new(bar_index + 1, stopLossShort, str.tostring(stopLossShort, "#.#####"), color=color.red, style=label.style_none, textcolor=color.red, size=size.tiny)

alertcondition(buy, 'UT Long', 'UT Long')
alertcondition(sell, 'UT Short', 'UT Short')


Plus de