Esta estrategia utiliza una combinación de tres indicadores técnicos diferentes para construir una estrategia de arbitraje transversal que captura las tendencias de precios en diferentes plazos de tiempo para lograr rendimientos excesivos de bajo riesgo.
Los tres indicadores técnicos utilizados en esta estrategia son Keltner Channel (KC), Volatility Stop (Vstop) y Williams Alligator (WAE). El canal de Keltner se utiliza para determinar si los precios están fuera del rango del canal y, por lo tanto, generar señales comerciales.
Cuando el precio es más alto que el carril superior del canal de Keltner, se considera una señal alcista.
La posición de stop loss se establece en función de la volatilidad de los precios y el ancho del canal, y se puede ajustar dinámicamente para garantizar una posición de stop loss, evitando al mismo tiempo posiciones de stop loss excesivamente conservadoras.
El indicador Williams Alligator juzga si los precios están en una fuerte tendencia alcista o bajista calculando el ancho del canal MACD y la banda de Bollinger.
Al combinar estos tres indicadores, las señales a través de diferentes marcos de tiempo se validan entre sí. Esto reduce la probabilidad de error de juicio y construye una lógica de estrategia optimizada.
La mayor ventaja de esta estrategia es la precisión de las señales de negociación proporcionadas por la combinación de múltiples indicadores. Los tres indicadores funcionan en diferentes marcos de tiempo y se validan entre sí, lo que puede reducir efectivamente la probabilidad de error de juicio y mejorar la precisión de las señales. Además, la configuración de Volatility Stop es dinámica y puede ajustar la posición de stop loss de acuerdo con la volatilidad en tiempo real para controlar aún más los riesgos.
En comparación con las estrategias de un solo indicador, esta estrategia combinada puede proporcionar señales comerciales más precisas y eficientes.
El principal riesgo de esta estrategia es que la configuración inadecuada de parámetros puede causar sobreajuste. Los tres indicadores tienen 8 parámetros en total. La configuración inadecuada puede afectar negativamente a la estrategia. Además, la relación de peso entre los indicadores también debe configurarse correctamente, de lo contrario las señales pueden neutralizarse entre sí y volverse inválidas.
Para reducir estos riesgos, la adaptabilidad a diferentes entornos de mercado debe considerarse plenamente durante la configuración de parámetros, y la combinación óptima de parámetros debe ajustarse a través del análisis de backtesting. Además, ajuste adecuadamente los pesos entre los indicadores para garantizar que las señales comerciales puedan activarse de manera efectiva. Cuando ocurran pérdidas consecutivas, considere reducir el tamaño de la posición para controlar las pérdidas.
El espacio de optimización de esta estrategia se centra principalmente en dos aspectos: ajuste de parámetros y mejora de las estrategias de stop loss.
Elegir parámetros de indicadores de manera más científica y optimizar las combinaciones de parámetros. Los algoritmos se pueden utilizar para encontrar los parámetros óptimos con objetivos como la maximización del rendimiento y la minimización del riesgo.
Mejorar la estrategia de stop loss para reducir aún más las pérdidas de stop innecesarias al tiempo que se garantiza la stop loss, mejorando así la tasa de ganancia.
Optimizar los pesos entre los indicadores y la lógica de los juicios de señales comerciales para reducir la tasa de errores de juicio.
Trate de introducir modelos de aprendizaje automático para lograr la optimización automática de parámetros o utilice programación de aprendizaje de refuerzo profundo para la evaluación y mejora de la estrategia.
Esta estrategia construye un sistema de arbitraje de ciclo cruzado a través de la combinación de Keltner Channel, Volatility Stop y Williams Alligator. La combinación de múltiples indicadores mejora la precisión de la señal y controla los riesgos de stop loss dinámicos.
/*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"}] */ //@version=4 strategy("QuarryLake", overlay=true) ///Ultilized modified full kelly for this strategy = 36% ///Keltner channel/// nPeriod = input(title="Keltner Period", type=input.integer, defval=200, minval=1) Mult = input(title="Keltner Mult", type=input.integer, defval=5, minval=1) xPrice = ema(hlc3, nPeriod) xMove = ema(high - low, nPeriod) xMoveMult = xMove * Mult xUpper = xPrice + xMoveMult xLower = xPrice - xMoveMult // plot(xPrice, color=red, title="KSmid") p1 = plot(xUpper, color=color.white, title="KSup") p2 = plot(xLower, color=color.white, title="KSdn") fill(p1, p2, color=close > xUpper ? color.green : close < xLower ? color.red : color.white) kclongcondition = close > xUpper kcshortcondition = close < xLower kccloselongcondition = crossunder(close, xUpper) kccloseshortcondition = crossover(close, xLower) ///Volatility Stop/// length = input(title="Vstop length", type=input.integer, defval=3, minval=1) mult1 = 1.5 atr_ = atr(length) max1 = 0.0 min1 = 0.0 is_uptrend_prev = false stop = 0.0 vstop_prev = 0.0 vstop1 = 0.0 is_uptrend = false is_trend_changed = false max_ = 0.0 min_ = 0.0 vstop = 0.0 max1 := max(nz(max_[1]), close) min1 := min(nz(min_[1]), close) is_uptrend_prev := nz(is_uptrend[1], true) stop := is_uptrend_prev ? max1 - mult1 * atr_ : min1 + mult1 * atr_ vstop_prev := nz(vstop[1]) vstop1 := is_uptrend_prev ? max(vstop_prev, stop) : min(vstop_prev, stop) is_uptrend := close - vstop1 >= 0 is_trend_changed := is_uptrend != is_uptrend_prev max_ := is_trend_changed ? close : max1 min_ := is_trend_changed ? close : min1 vstop := is_trend_changed ? is_uptrend ? max_ - mult1 * atr_ : min_ + mult1 * atr_ : vstop1 plot(vstop, color=is_uptrend ? color.green : color.red, style=plot.style_line, linewidth=1) vstoplongcondition = close > vstop vstoplongclosecondition = crossunder(close, vstop) vstopshortcondition = close < vstop vstopshortclosecondition = crossover(close, vstop) ///Waddah Attar Explosion/// sensitivity = input(150, title="Sensitivity") fastLength = input(20, title="FastEMA Length") slowLength = input(40, title="SlowEMA Length") channelLength = input(20, title="BB Channel Length") mult = input(2.0, title="BB Stdev Multiplier") DEAD_ZONE = nz(rma(tr(true), 100)) * 3.7 calc_macd(source, fastLength, slowLength) => fastMA = ema(source, fastLength) slowMA = ema(source, slowLength) fastMA - slowMA calc_BBUpper(source, length, mult) => basis = sma(source, length) dev = mult * stdev(source, length) basis + dev calc_BBLower(source, length, mult) => basis = sma(source, length) dev = mult * stdev(source, length) basis - dev t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity t2 = (calc_macd(close[2], fastLength, slowLength) - calc_macd(close[3], fastLength, slowLength)) * sensitivity e1 = calc_BBUpper(close, channelLength, mult) - calc_BBLower(close, channelLength, mult) trendUp = t1 >= 0 ? t1 : 0 trendDown = t1 < 0 ? -1 * t1 : 0 waelongcondition = trendUp and trendUp > DEAD_ZONE and trendUp > e1 waeshortcondition = trendDown and trendDown > DEAD_ZONE and trendDown > e1 ///Long Entry/// longcondition = kclongcondition and vstoplongcondition and waelongcondition if longcondition strategy.entry("Long", strategy.long) ///Long exit/// closeconditionlong = kccloselongcondition or vstoplongclosecondition if closeconditionlong strategy.close("Long") ///Short Entry/// shortcondition = kcshortcondition and vstopshortcondition and waeshortcondition if shortcondition strategy.entry("Short", strategy.short) ///Short exit/// closeconditionshort = kccloseshortcondition or vstopshortclosecondition if closeconditionshort strategy.close("Short") ///Free Hong Kong, the revolution of our time///