Esta estrategia está diseñada sobre la base de la media móvil adaptativa de Kaufman (KAMA) para ajustar dinámicamente las posiciones de negociación y realizar un seguimiento automático de las tendencias del mercado.
Mediante la aplicación de estas funciones, la estrategia trata de obtener beneficios adicionales de las tendencias al tiempo que controla los riesgos.
La estrategia funciona basándose en el indicador de la media móvil adaptativa de Kaufman. KAMA calcula la relación entre el impulso del precio y la volatilidad para ajustar dinámicamente el peso y la suavidad de la media móvil, lo que le permite responder más rápido a los cambios de precios.
Cuando KAMA cruza por encima de la línea de stop loss bajista, indica una inversión de tendencia y activa una señal de compra. Cuando KAMA cruza por debajo de la línea de stop loss al alza, sugiere una inversión de tendencia y activa una señal de venta. Después de ingresar a una posición, la estrategia calcula una distancia de stop loss dinámica basada en ATR y establece una línea de stop loss favorable. A medida que KAMA se mueve en una dirección favorable, la línea de stop loss también se ajusta en consecuencia, moviéndose a una posición más favorable para obtener más ganancias.
De esta manera, la estrategia puede seguir la tendencia, mover gradualmente la línea de stop loss hasta que se activa o se activa una señal inversa para cerrar la posición.
En comparación con las estrategias tradicionales de promedios móviles, esta estrategia tiene las siguientes ventajas:
En general, la estrategia es sensible, controlable y un sistema típico de seguimiento de tendencias.
La estrategia también conlleva algunos riesgos:
Para gestionar estos riesgos, se pueden utilizar métodos como optimizar la distancia de stop loss y establecer un porcentaje máximo de stop loss.
Las posibles direcciones para optimizar la estrategia incluyen:
Por ejemplo, el MACD se puede agregar como un indicador de confirmación auxiliar, lo que requiere que el MACD Dif sea positivo y se expanda junto con la cruz de oro de KAMA. Esto puede filtrar algunas señales falsas y evitar entradas repetidas innecesarias.
El funcionamiento general de esta estrategia es suave. Al utilizar un stop loss dinámico para rastrear tendencias y maximizar las ganancias de tendencia, junto con la adaptabilidad del indicador KAMA para responder rápidamente a los rápidos cambios del mercado, esta estrategia puede convertirse en un sistema de seguimiento de tendencias eficiente después de cierta optimización, adecuado para el comercio a medio y largo plazo.
/*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)