Esta estrategia emplea el indicador de Kaufman Adaptive Moving Average (KAMA) para diseñar un sistema de negociación de tendencia. Puede rastrear rápidamente las tendencias cuando se forman y filtrar el ruido durante los mercados agitados. Al mismo tiempo, el sistema también integra Parabolic SAR (PSAR) y Average True Range Trailing Stop como mecanismos de stop loss con fuertes capacidades de control de riesgos.
La longitud del indicador KAMA se ajusta dinámicamente en función de la volatilidad reciente del mercado. Cuando los cambios de precios son mayores que el ruido reciente, la ventana EMA se hace más corta. Cuando los cambios de precios son más pequeños que el ruido reciente, la ventana EMA se hace más larga. Esto permite a KAMA rastrear rápidamente las tendencias mientras filtra el ruido durante los mercados agitados.
El sistema juzga principalmente la dirección de la tendencia basada en el KAMA más rápido (KAMA 1). Va largo cuando KAMA 1 apunta hacia arriba y va corto cuando KAMA 1 apunta hacia abajo. Para filtrar las roturas falsas, se establece un filtro KAMA. Las señales comerciales solo se generan cuando el cambio en KAMA 1 excede una desviación estándar de las fluctuaciones recientes.
Para el stop loss, el sistema proporciona tres métodos opcionales de stop loss: la inversión KAMA, la inversión PSAR y la parada de seguimiento ATR. Los inversores pueden elegir uno o una combinación para usar.
El diseño único del indicador KAMA permite al sistema capturar rápidamente las tendencias emergentes, detener las operaciones durante los mercados agitados, controlar eficazmente la frecuencia de las operaciones y reducir los deslizamientos innecesarios y los costos de comisión.
El sistema tiene múltiples mecanismos de stop loss incorporados, los inversores pueden elegir el esquema de stop loss adecuado de acuerdo con sus preferencias personales de riesgo para controlar eficazmente una sola pérdida.
El sistema se basa enteramente en indicadores y líneas de stop loss, evitando los problemas comunes de entrada errónea causados por el cambio de transacciones.
La configuración de múltiples parámetros y combinaciones de condiciones proporcionan un gran espacio para la personalización del sistema.
El sistema no tiene en cuenta los riesgos sistémicos y no puede controlar eficazmente las pérdidas en condiciones extremas de mercado.
Puede que sea necesario ajustar el sistema PARAMETROS según diferentes productos y frecuencias, de lo contrario producirá resultados demasiado agresivos o demasiado conservadores.
Si se confía únicamente en el indicador KAMA para el stop loss, es fácil quedar atrapado en problemas durante los mercados agitados.
Añadir indicadores de filtración de tendencias como el ADX o la volatilidad implícita para evitar generar señales erróneas durante las etapas de transición de tendencias y chocantes.
Optimizar y probar los parámetros para productos individuales y frecuencias fijas para mejorar la estabilidad.
Pruebe modelos de aprendizaje automático en lugar de optimización de parámetros. Entrene redes neuronales o modelos de árboles de decisión con muchos datos históricos para juzgar el momento de entrada y salida y detener la pérdida.
Intente migrar la estrategia a otros productos como las criptomonedas. Esto puede requerir ajustar PARAMETROS o agregar otros indicadores auxiliares.
Esta estrategia integra KAMA para el juicio de tendencias y múltiples métodos de stop loss para realizar un seguimiento efectivo de las direcciones de tendencias y controlar los riesgos. La singularidad del indicador KAMA permite a la estrategia determinar rápidamente la dirección de las tendencias emergentes y evitar problemas de ruptura falsa. PARAMETROS personalizables y optimizables proporcionan a los usuarios un gran espacio para el ajuste personalizado. Al optimizar PARAMETROS e integrar modelos de aprendizaje automático para productos y frecuencias individuales, el rendimiento de la estrategia puede mejorarse aún más.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © BenHampson // @version=4 // Credit to: // - ChuckBanger for much of the KAMA code // - cheatcountry for the KAMA Filter code // - millerrh for much of the ATR Stop code // - racer8 for much of the Position Sizing code // I have combined aspects of their work and built upon it to form a strategy I like. // The KAMA, with its filter, is used for entry. // An ATR trailing stop loss, PSAR, and the KAMA can all optionally be used as exits, or you can use a combination of the three. strategy(title="KAMA Strategy - Kaufman's Adaptive Moving Average", shorttitle="KAMA Strategy", overlay=true) src = input(title="Source", type=input.source, defval=close) // Exits KAMA1SL = input(title = 'KAMA 1 Stop Loss', type = input.bool, defval = true) ATRTSL = input(title = 'ATR Trailing Stop Loss', type = input.bool, defval = false) PSARSL = input(title = 'PSAR Stop Loss', type = input.bool, defval = false) // KAMA 1 (Fastest) length1 = input(title="KAMA 1: Length", type=input.integer, defval=14) fastLength1 = input(title="KAMA 1: Fast KAMA Length", type=input.integer, defval=2) slowLength1 = input(title="KAMA 1: Slow KAMA Length", type=input.integer, defval=20) length2 = input(title="KAMA 2: Length 2", type=input.integer, defval=15) fastLength2 = input(title="KAMA 2: Fast KAMA Length", type=input.integer, defval=3) slowLength2 = input(title="KAMA 2: Slow KAMA Length", type=input.integer, defval=22) length3 = input(title="KAMA 3: Length 3", type=input.integer, defval=16) fastLength3 = input(title="KAMA 3: Fast KAMA Length", type=input.integer, defval=4) slowLength3 = input(title="KAMA 3: Slow KAMA Length", type=input.integer, defval=24) length4 = input(title="KAMA 4: Length", type=input.integer, defval=17) fastLength4 = input(title="KAMA 4: Fast KAMA Length", type=input.integer, defval=5) slowLength4 = input(title="KAMA 4: Slow KAMA Length", type=input.integer, defval=26) // KAMA 5 (Medium) length5 = input(title="KAMA 5: Length", type=input.integer, defval=18) fastLength5 = input(title="KAMA 5: Fast KAMA Length", type=input.integer, defval=6) slowLength5 = input(title="KAMA 5: Slow KAMA Length", type=input.integer, defval=28) length6 = input(title="KAMA 6: Length", type=input.integer, defval=19) fastLength6 = input(title="KAMA 6: Fast KAMA Length", type=input.integer, defval=7) slowLength6 = input(title="KAMA 6: Slow KAMA Length", type=input.integer, defval=30) length7 = input(title="KAMA 7: Length", type=input.integer, defval=20) fastLength7 = input(title="KAMA 7: Fast KAMA Length", type=input.integer, defval=8) slowLength7 = input(title="KAMA 7: Slow KAMA Length", type=input.integer, defval=32) // KAMA 8 (Slowest) length8 = input(title="KAMA 8: Length", type=input.integer, defval=21) fastLength8 = input(title="KAMA 8: Fast KAMA Length", type=input.integer, defval=9) slowLength8 = input(title="KAMA 8: Slow KAMA Length", type=input.integer, defval=34) // Kaufman's Adaptive Moving Average getKAMA(src, length1, fastLength1, slowLength1) => mom = abs(change(src, length1)) volatility = sum(abs(change(src)), length1) // Efficiency Ratio er = volatility != 0 ? mom / volatility : 0 fastAlpha = 2 / (fastLength1 + 1) slowAlpha = 2 / (slowLength1 + 1) // KAMA Alpha sc = pow((er * (fastAlpha - slowAlpha)) + slowAlpha, 2) kama = 0.0 kama := sc * src + (1 - sc) * nz(kama[1]) kama kama1 = getKAMA(src, length1, fastLength1, slowLength1) kama2 = getKAMA(src, length2, fastLength2, slowLength2) kama3 = getKAMA(src, length3, fastLength3, slowLength3) kama4 = getKAMA(src, length4, fastLength4, slowLength4) kama5 = getKAMA(src, length5, fastLength5, slowLength5) kama6 = getKAMA(src, length6, fastLength6, slowLength6) kama7 = getKAMA(src, length7, fastLength7, slowLength7) kama8 = getKAMA(src, length8, fastLength8, slowLength8) //If the kama1 has increased... kama1delta = kama1[0] - kama1[1] kama3delta = kama3[0] - kama3[1] kama8delta = kama8[0] - kama8[1] // KAMA Plots plot(kama1, title="KAMA 1", color=#e91e63, display=display.all, linewidth=2) plot(kama2, title="KAMA 2", color=color.red, display=display.all) plot(kama3, title="KAMA 3", color=color.red, display=display.all) plot(kama4, title="KAMA 4", color=color.orange, display=display.all) plot(kama5, title="KAMA 5", color=color.orange, display=display.all) plot(kama6, title="KAMA 6", color=color.yellow, display=display.all) plot(kama7, title="KAMA 7", color=color.yellow, display=display.all) plot(kama8, title="KAMA 8", color=color.white, display=display.all) //========================================= KAMA FILTER =========================================== // Copyright (c) 2019-present, Franklin Moormann (cheatcountry) // Moving Average Adaptive Filter [CC] script may be freely distributed under the MIT license. entryFilter = input(title="KAMA Entry Filter", type=input.float, defval=1, minval=0.01) exitFilter = input(title="KAMA Exit Filter", type=input.float, defval=0.5, minval=0.01) entryMAAF = entryFilter * stdev(kama1delta, length1) exitMAAF = exitFilter * stdev(kama1delta, length1) srcEma = ema(src, length1) //========================================= TRAILING ATR STOP ==================================== // The following is an adaptation of Trailing ATR Stops by @millerrh // He based it on scripts by @garethyeo & @SimpleCryptoLife // Inputs atrLookback = input(defval=14,title="Trailing ATR Lookback Period",type=input.integer) multiplier = input(defval=3,title="Trailing ATR Multiplier",type=input.float, step=0.1, minval=0.5, maxval=4) trailMode = input(title="Trail Mode", defval="Trailing", options=["Running", "Trailing"]) trigInput = input(title="Trigger Trailing Stop On", defval="Wick", options=["Close","Wick"]) // Calculate ATR atrValue = atr(atrLookback) atrMultiplied = atrValue * multiplier // Plot the price minus the ATR atrLow = low - atrMultiplied // Calculate the low trailing ATRs every time. The trailing stop loss never goes down. // Set them to something to start with trailAtrLow = atrLow // If the ATR Low has gone up AND it has gone above the trail, the low trailing ATR should also go up. If the ATR Low has gone up or down, but not below the trail, the ATR trail stays where it is trailAtrLow := na(trailAtrLow[1]) ? trailAtrLow : atrLow >= trailAtrLow[1] ? atrLow : trailAtrLow[1] // Trigger stop based on candle close or low trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na // Determine if price is below support supportHit = trigSupport <= trailAtrLow // If price is below support, reset the trailing ATR trailAtrLow := supportHit ? atrLow : trailAtrLow // Plot Lines plotLow = ATRTSL ? trailAtrLow : na plot(plotLow, title="ATR Low", color=color.white, transp=50, style=plot.style_linebr, linewidth=1, display=display.all) //====================================== PSAR STOP ========================================== start = input(0.02, "PSAR Start") increment = input(0.02, "PSAR Increment") maximum = input(0.2, "PSAR Max Value") psar = sar(start, increment, maximum) psarPlot = PSARSL ? psar : na plot(psarPlot, "Parabolic SAR", style=plot.style_cross, color=#3A6CA8, display=display.all) //========================================= ENTRY & EXITS ===================================================== // Entry long = kama1delta > 0 and kama1delta > entryMAAF strategy.entry("Buy", true, when = long) // Close longClose = (PSARSL ? crossunder(close, psar) : na) or (KAMA1SL ? kama1delta < 0 and abs(kama1delta) > exitMAAF : na) or (ATRTSL ? supportHit : na) strategy.close("Buy", when = longClose, comment = "Sell")