
La estrategia se basa en el diseño de Kaufman Adaptive Moving Average (KAMA) para ajustar dinámicamente las posiciones de negociación y seguir automáticamente las tendencias del mercado. Las principales funciones de la estrategia incluyen:
Mediante el uso de estas funciones, la estrategia trata de obtener beneficios adicionales de la tendencia, mientras controla el riesgo.
La estrategia se basa en el trabajo de Kaufman en el indicador de la Adaptación a la Media Móvil. KAMA ajusta dinámicamente el peso y la suavidad de la media mediante el cálculo de los ratios de la dinámica y la volatilidad de los precios, para responder más rápidamente a los cambios en los precios.
Cuando el KAMA cruza la línea de parada descendente, la tendencia se invierte y genera una señal de compra; cuando el KAMA cruza la línea de parada descendente, la tendencia se invierte y genera una señal de venta. Una vez en posición, la estrategia calcula una distancia de parada dinámica según el ATR y establece una línea de parada.
De esta manera, la estrategia puede seguir la tendencia y mover la línea de parada gradualmente hasta que se activa la línea de parada o se activa la señal de reversión y se cierra la posición.
La estrategia tiene las siguientes ventajas en comparación con las estrategias tradicionales de medias móviles:
En general, las estrategias son rápidas y controlables, lo cual es típico de las estrategias de seguimiento de tendencias.
La estrategia también tiene sus riesgos:
Estos riesgos pueden ser controlados por métodos como la optimización de la distancia de pérdidas, la configuración del porcentaje máximo de pérdidas. También se pueden combinar con otros indicadores como confirmación y evitar transacciones erróneas.
La estrategia se puede optimizar en las siguientes áreas:
Por ejemplo, se puede probar la adición de MACD como indicador de confirmación auxiliar, al mismo tiempo que se solicita que MACDDif también sea positivo y ampliado. Esto puede filtrar algunas señales falsas y evitar la repetición innecesaria de la apertura de la posición.
La estrategia funciona sin problemas en general, utiliza un stop loss dinámico para seguir la tendencia y bloquea al máximo las ganancias de la tendencia. La adaptabilidad del indicador KAMA también permite que la estrategia siga el ritmo de los cambios rápidos en el mercado.
/*backtest
start: 2024-01-26 00:00:00
end: 2024-02-25 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("THMA - Bharath Vc Improved", overlay=true, process_orders_on_close=true)
// Function to calculate pips with higher precision
getPips(price) =>
difc = syminfo.mintick
hlpips = price / difc
math.round(hlpips / syminfo.mintick) * syminfo.mintick
// Inputs
buyMess = input.string("Buy Message","Buy Alert Message")
sellMess = input.string("Sell Message","Sell Alert Message")
buyExitMessage = input.string("Buy Exit","Buy Exit Alert Message" )
sellExitMessage = input.string("Sell Exit","Sell Exit Alert Message" )
tmf = input.timeframe("", "Timeframe")
length = input(title='Length', defval=14)
fastLength = input(title='Fast EMA Length', defval=2)
slowLength = input(title='Slow EMA Length', defval=30)
src = input(title='Source', defval=close)
highlight = input(title='Highlight ?', defval=true)
awaitBarConfirmation = input(title='Await Bar Confirmation ?', defval=true)
// Function to calculate the TMA
gettma() =>
mom = math.abs(ta.change(src, length))
volatility = math.sum(math.abs(ta.change(src)), length)
er = volatility != 0 ? mom / volatility : 0
fastAlpha = 2 / (fastLength + 1)
slowAlpha = 2 / (slowLength + 1)
alpha = math.pow(er * (fastAlpha - slowAlpha) + slowAlpha, 2)
kama = 0.0
kama := alpha * src + (1 - alpha) * nz(kama[1], src)
await = awaitBarConfirmation ? barstate.isconfirmed : true
maColor = highlight ? kama > kama[1] and await ? color.green : color.red : color.new(color.purple, 0)
thma = kama
hma_dif = (thma - thma[2])/2
colour = hma_dif > 0 ? color.green : color.red
isGreen = hma_dif > 0
[thma, isGreen, colour]
// Dynamic pip size based on ATR to adapt better to smaller timeframes
pips = ta.atr(14) * 0.1
// Main execution logic
var float psl = na
var int lastSignal = 0
var float lastPsl = na
[thma, isGreen, colour] = request.security(syminfo.tickerid, tmf, gettma(), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
plot(thma, title='KAMA', linewidth=2, color=colour)
if ta.crossover(thma, psl) and strategy.position_size < 0
strategy.exit("Sell Exit", stop=thma, alert_message=sellExitMessage)
if ta.crossunder(thma, psl) and strategy.position_size > 0
strategy.exit("Buy Exit", stop=thma, alert_message=buyExitMessage)
if isGreen and strategy.position_size <= 0
if na(psl)
psl := close + getPips(pips)
strategy.entry("Buy", strategy.long, alert_message=buyMess)
lastSignal := 1
if not isGreen and strategy.position_size >= 0
if na(psl)
psl := close - getPips(pips)
strategy.entry("Sell", strategy.short, alert_message=sellMess)
lastSignal := -1
if (thma >= lastPsl or na(lastPsl)) and thma > psl
psl := psl + getPips(pips)
lastPsl := psl
if (thma <= lastPsl or na(lastPsl)) and thma < psl
psl := psl - getPips(pips)
lastPsl := psl
plot(psl, title="Position Stop Level", style=plot.style_stepline, color=color.blue)
plot(lastPsl, title="Last Position Stop Level", style=plot.style_cross, color=color.red)