
La idea central de esta estrategia es utilizar la línea media T3 y el ATR para adaptarse a los paros móviles para capturar los puntos de entrada y salida de la tendencia, que pertenece a la estrategia de seguimiento de tendencias. Cuando el precio rompe la línea media T3, genera una señal de negociación y utiliza el valor de ATR para configurar el punto de parada y el punto de parada en el punto de ruptura, para lograr el parón automático de la pérdida.
La estrategia consiste principalmente en el indicador de línea media T3, el indicador ATR y el mecanismo de stop loss móvil ATR.
La línea media T3 es un promedio móvil de suavidad que reduce el atraso de la curva y la hace reaccionar más rápidamente a los cambios de precio. Cuando el precio se rompe por debajo de la línea media, produce una señal de compra; cuando el precio se rompe por encima de la línea media, produce una señal de venta.
El indicador ATR se utiliza para calcular el grado de volatilidad del mercado y establecer el punto de parada. El valor más alto de ATR indica que la volatilidad del mercado es mayor, por lo que es necesario establecer un alto más amplio. El valor más bajo de ATR indica que la volatilidad del mercado es menor y se puede establecer un alto más estrecho.
El mecanismo de parada móvil de ATR es la posición de la línea de parada en tiempo real según el valor de ATR, para que la línea de parada pueda seguir el precio y mantenerse dentro de un rango razonable. De esta manera, se evita que la distancia de parada demasiado cercana sea sacudida y se evita que la distancia de parada demasiado amplia no pueda controlar el riesgo de manera efectiva.
Utilizando la combinación de T3 para determinar la dirección, ATR para calcular la volatilidad y ATR para detener el movimiento, la estrategia permite una captura de tendencias y un control de riesgo más eficientes.
La estrategia tiene las siguientes ventajas:
La aplicación de la línea media T3 mejora la precisión de la captura de tendencias.
El indicador ATR calcula dinámicamente la volatilidad del mercado, los puntos de pérdida y los puntos de parada más razonables.
ATR es un mecanismo móvil de suspensión de pérdidas que permite que la línea de suspensión siga el precio en tiempo real y controle el riesgo de manera efectiva.
Integración de los indicadores de juicio y los mecanismos de detención de pérdidas para automatizar el seguimiento de tendencias de las operaciones.
Se puede conectar a una plataforma de comercio externa a través de un webhook para automatizar los pedidos.
La estrategia también tiene sus riesgos:
Los parámetros de la línea media T3 están mal configurados y pueden perder oportunidades de tendencia más favorables. Se pueden probar los parámetros de diferentes períodos para encontrar el parámetro óptimo.
El cálculo del ATR es inexacto, la distancia de parada es demasiado grande o demasiado pequeña para controlar el riesgo de manera efectiva. Se puede ajustar el parámetro del ciclo ATR en combinación con las características de la volatilidad del mercado.
En el caso de una fuerte volatilidad, la línea de pérdidas puede romperse y causar pérdidas excesivas. Se puede establecer una línea de pérdidas total razonable para evitar pérdidas individuales excesivas.
En el caso de una operación bidireccional repetida, es posible que el stop se active con frecuencia. La distancia de parada móvil de ATR puede ser liberada adecuadamente.
La estrategia puede ser optimizada en los siguientes aspectos:
Optimización de los parámetros de la línea media de T3 para encontrar el ciclo de suavizado más adecuado.
Prueba los diferentes parámetros del ciclo ATR para calcular el valor ATR que mejor refleje la volatilidad del mercado.
Optimización del rango de elasticidad de la distancia de frenado móvil ATR para evitar que el frenado sea demasiado sensible.
Añadir las condiciones de filtración adecuadas para evitar el comercio frecuente de mercados de oscilación bidireccional.
La combinación de indicadores de tendencia para juzgar mejorará la precisión de la dirección de ganancias.
Optimización automática de los parámetros mediante métodos de aprendizaje automático.
Esta estrategia integra el uso de la línea media T3 para determinar la dirección de la tendencia, el indicador ATR para calcular el stop loss y el mecanismo de stop loss móvil ATR para ajustar el stop loss, para lograr el seguimiento automático de la tendencia y el control de riesgo eficiente, es una estrategia de seguimiento de tendencia confiable. En la aplicación práctica, aún se necesita prueba y optimización continua para encontrar la combinación de parámetros más adecuada para el entorno del mercado actual, para obtener un mejor efecto de la estrategia.
/*backtest
start: 2024-01-21 00:00:00
end: 2024-02-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title='UT Bot Alerts (QuantNomad) Strategy', 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 and buySignal3, alert_message=OCOMarketLong)
strategy.entry("Short", strategy.short, when=sell and sellSignal3, 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')