La estrategia es un sistema de análisis integrado de varios indicadores, basado principalmente en el VAWSI (índice de volumen y fuerza ponderada ATR), el indicador de continuidad de tendencias y la versión modificada de ATR para juzgar la tendencia del mercado y los posibles puntos de reversión. La estrategia también introduce el cálculo de la longitud de la dinámica para adaptarse a las diferentes condiciones del mercado.
El núcleo de la estrategia consiste en medir la intensidad, duración y volatilidad de las tendencias del mercado a través de una serie de indicadores personalizados para encontrar el mejor momento de negociación. Es especialmente adecuado para mercados con tendencias evidentes, pero también incluye mecanismos de adaptación para tratar diferentes estados del mercado.
Indicador VAWSI: es un indicador original, similar al RSI, pero que utiliza el VAWMA (medios móviles ponderados por volumen y ATR) en lugar del RMA.
Indicador de continuidad de tendencia: otro indicador original, utilizado para medir la duración de una tendencia. Calcula la máxima desviación de los datos de origen con respecto a los puntos más altos/más bajos dentro de una longitud específica, y luego acumula esta desviación y crea un índice de intensidad.
La versión modificada de ATR: toma el valor máximo de la fuente de datos anterior, y luego toma el valor absoluto de su cambio y se unifica con los datos de la fuente.
Cálculo de la longitud dinámica: el método de cálculo de la longitud dinámica de BlackCat1402 se utiliza para ajustar los parámetros de longitud del indicador en función de las condiciones del mercado.
Análisis integrado: combina las lecturas del VAWSI, la continuidad de la tendencia y el ATR para generar un indicador integrado. Un valor final más bajo indica una reversión inminente y un valor más alto indica inestabilidad o agitación en el mercado.
Dinámica de pérdidas y ganancias: los niveles de pérdidas y ganancias dinámicas se calculan en función del indicador integral y la dirección de la tendencia actual.
Señales de negociación: cuando el precio cruza completamente la línea de brecha calculada, el sistema confirma el cruce y genera una señal de negociación.
Análisis multidimensional: mediante la combinación de varios indicadores, las estrategias pueden analizar el mercado desde diferentes perspectivas, mejorando la precisión de los juicios.
Adaptabilidad: El cálculo de la longitud dinámica permite que las estrategias se adapten a diferentes condiciones del mercado, lo que aumenta la flexibilidad de las estrategias.
Gestión de riesgos: la configuración de stop loss dinámico y la de beneficio ayudan a controlar mejor el riesgo y adaptarse a los cambios en el mercado.
Indicadores originales: el VAWSI y el indicador de continuidad de tendencias ofrecen una visión única del mercado que puede captar señales que los indicadores tradicionales ignoran.
Previene el rediseño: el uso de barstate.isconfirmed asegura que la señal no sea rediseñada, lo que mejora la precisión de la detección.
Personalización: Se pueden ajustar varios parámetros para que la estrategia se adapte a diferentes variedades de transacciones y marcos de tiempo.
Optimización excesiva: un gran número de parámetros puede conducir a una optimización excesiva, que no funciona bien en las operaciones en disco.
Adaptabilidad al mercado: Aunque se desempeña bien en algunos mercados, puede no ser aplicable a todas las condiciones del mercado, especialmente en mercados con menor volatilidad.
Complejidad: La complejidad de las estrategias puede hacer que sean difíciles de entender y mantener, lo que aumenta el riesgo de errores operativos.
Computación intensiva: múltiples indicadores personalizados y cálculos dinámicos pueden causar una mayor carga de cálculo que afecta la velocidad de ejecución.
Depende de los datos históricos: la estrategia utiliza una gran cantidad de datos históricos para realizar los cálculos, lo que en algunos casos puede causar un retraso.
Optimización de parámetros: Utiliza algoritmos de aprendizaje automático para optimizar varios parámetros de peso y longitud para mejorar el rendimiento de la estrategia en diferentes condiciones de mercado.
Reconocimiento de estado de mercado: añade un módulo de reconocimiento de estado de mercado para ajustar automáticamente los parámetros de la estrategia en diferentes entornos de mercado.
Filtración de señales: introducción de mecanismos de filtración adicionales, como el límite de la intensidad de la tendencia, para reducir las señales falsas.
Análisis del volumen de tránsito: profundizar en el análisis del volumen de tránsito, con la posibilidad de introducir la identificación de la forma de tránsito para aumentar la fiabilidad de la señal.
Análisis de varios marcos de tiempo: integración de señales de varios marcos de tiempo para mejorar la solidez de las decisiones comerciales.
Optimización de la gestión de riesgos: Implementación de estrategias de gestión de riesgos más complejas, como el dimensionamiento dinámico de posiciones y el stop loss en varios niveles.
Eficiencia de cálculo: optimización del código para aumentar la eficiencia de cálculo, especialmente cuando se trata de grandes cantidades de datos históricos.
El VAWSI y la estrategia de reversión de tendencia continua es un sistema de negociación complejo y completo, que combina múltiples indicadores de innovación y ajustes de parámetros dinámicos. Su ventaja radica en el análisis de mercado multidimensional y la autoadaptación, que le permite buscar oportunidades de reversión potenciales en diferentes condiciones de mercado. Sin embargo, la complejidad de la estrategia también conlleva desafíos de optimización excesiva y adaptabilidad.
La estrategia tiene el potencial de convertirse en una poderosa herramienta de negociación mediante una optimización adicional, especialmente en la regulación de parámetros, la identificación del estado del mercado y la gestión del riesgo. Sin embargo, los usuarios deben tener en cuenta que ninguna estrategia es perfecta y que es necesario un monitoreo y ajuste continuos. En aplicaciones reales, se recomienda realizar pruebas adecuadas en cuentas simuladas y combinar con otras herramientas de análisis y conocimiento del mercado para tomar decisiones comerciales.
/*backtest
start: 2024-05-21 00:00:00
end: 2024-06-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("VAWSI and Trend Persistance Reversal", overlay=true, max_bars_back = 4999, process_orders_on_close = true)
//INPUTS
sltp = input.float(title = "Minimum SL/TP", defval = 5.0)
rsi_weight = input.float(title = "Wawsi weight", defval = 100.0)
half_weight= input.float(title = "Trend Persistence Weight", defval = 79.0)
atr_weight = input.float(title = "ATR Weight", defval = 20.0)
com_mult = input.float(title = "Combination Mult", defval = 1, step = .001)
smoothing = input.int(title = "Trend Persistence smooth length", defval = 3)
CycPart = input.float(1.1, step = .001, title = "Length Cycle Decimal")
src = close
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)
//BlackCat1402's Dynamic Length Calculation
EhlersHoDyDC(Price, CycPart) =>
// Vars:
Smooth = 0.00
Detrender = 0.00
I1 = 0.00
Q1 = 0.00
jI = 0.00
jQ = 0.00
I2 = 0.00
Q2 = 0.00
Re = 0.00
Im = 0.00
Period = 0.00
SmoothPeriod = 0.00
pi = 2 * math.asin(1)
DomCycle = 0.0
//Hilbert Transform
Smooth := bar_index > 5 ? (4 * Price + 3 * nz(Price[1]) + 2 * nz(Price[2]) + nz(Price[3])) / 10 : Smooth
Detrender := bar_index > 5 ? (.0962 * Smooth + .5769 * nz(Smooth[2]) - .5769 * nz(Smooth[4]) - .0962 * nz(Smooth[6])) * (.075 * nz(Period[1]) + .54) : Detrender
//Compute InPhase and Quadrature components
Q1 := bar_index > 5 ? (.0962 * Detrender + .5769 * nz(Detrender[2]) - .5769 * nz(Detrender[4]) - .0962 * nz(Detrender[6])) * (.075 * nz(Period[1]) + .54) : Q1
I1 := bar_index > 5 ? nz(Detrender[3]) : I1
//Advance the phase of I1 and Q1 by 90 degrees
jI := (.0962 * I1 + .5769 * nz(I1[2]) - .5769 * nz(I1[4]) - .0962 * nz(I1[6])) * (.075 * nz(Period[1]) + .54)
jQ := (.0962 * Q1 + .5769 * nz(Q1[2]) - .5769 * nz(Q1[4]) - .0962 * nz(Q1[6])) * (.075 * nz(Period[1]) + .54)
//Phasor addition for 3 bar averaging
I2 := I1 - jQ
Q2 := Q1 + jI
//Smooth the I and Q components before applying the discriminator
I2 := .2 * I2 + .8 * nz(I2[1])
Q2 := .2 * Q2 + .8 * nz(Q2[1])
//Homodyne Discriminator
Re := I2 * nz(I2[1]) + Q2 * nz(Q2[1])
Im := I2 * nz(Q2[1]) - Q2 * nz(I2[1])
Re := .2 * Re + .8 * nz(Re[1])
Im := .2 * Im + .8 * nz(Im[1])
Period := Im != 0 and Re != 0 ? 2 * pi / math.atan(Im / Re) : Period
Period := Period > 1.5 * nz(Period[1]) ? 1.5 * nz(Period[1]) : Period
Period := Period < .67 * nz(Period[1]) ? .67 * nz(Period[1]) : Period
//Limit Period to be within the bounds of 6 bar and 50 bar cycles
Period := Period < 6 ? 6 : Period
Period := Period > 50 ? 50 : Period
Period := .2 * Period + .8 * nz(Period[1])
SmoothPeriod := .33 * Period + .67 * nz(SmoothPeriod[1])
//it can add filter to Period here
DomCycle := math.ceil(CycPart * SmoothPeriod) > 34 ? 34 : math.ceil(CycPart * SmoothPeriod) < 1 ? 1 : math.ceil(CycPart * SmoothPeriod)
DomCycle
wma(src, length) =>
wma = 0.0
sum = 0.0
norm = length * (length + 1) / 2
for i = 0 to length - 1
sum := sum + src[i] * (length - i)
wma := sum / norm
length = math.round(math.ceil(EhlersHoDyDC(hclose,CycPart)))
// Traditional Function initialization
highest_custom(src, length) =>
x = src
for i = 0 to math.min(length, 4999)
if src[i] > x
x := src[i]
x
lowest_custom(src, length) =>
x = src
for i = 0 to math.min(length, 4999)
if src[i] < x
x := src[i]
x
rma(src, len) =>
sum = 0.0
for i = 0 to len - 1
math.min(1, len)
sum += src[i]
rma = sum / len
rma := nz(rma[1]) * (len - 1) / len + src / len
sma(src, length) =>
math.sum(src, length) / length
hln(src, length) =>
TR = math.max(math.abs(src - src[1]), high - low)
TR := src / math.abs(ta.change(rma(TR, length)))
TR := (1 / TR) * 100
vawma(src, length) =>
atr = ta.atr(1)
aavg = sma(atr, length)
vavg = sma(volume, length)
weighted_sum = 0.0
sum_weights = 0.0
weighted = 0.0
for i = 0 to length
weight = ((volume[i] / vavg + (atr[i]) / aavg) / 2)
weighted_sum += src[i] * weight
sum_weights += weight
a = (weighted_sum / sum_weights)
vawsi(src, len) =>
rmaUp = vawma(math.max(ta.change(src), 0), len)
rmaDown = vawma(-math.min(ta.change(src), 0), len)
rsi = 100 - (100 / (1 + rmaUp / rmaDown))
trendPersistence(src, length, smoothing) =>
trendu = math.abs(src - highest_custom(src, length))
trendd = math.abs(src - lowest_custom(src, length))
trendu := wma(trendu, smoothing)
trendd := wma(trendd, smoothing)
trendu := ta.change(ta.cum(trendu))
trendd := ta.change(ta.cum(trendd))
trend = wma(math.max(trendu, trendd), smoothing)
rmaUp = rma(math.max(ta.change(trend), 0), length)
rmaDown = rma(-math.min(ta.change(trend), 0), length)
rsi = 100 - (100 / (1 + rmaUp / rmaDown))
//Strategy Calculations
sl = ((100 - sltp) / 100) * close
tp = ((100 + sltp) / 100) * close
var bool crossup = na
var bool crossdown = na
var float dir = na
var float BearGuy = 0
BullGuy = ta.barssince(crossup or crossdown)
if na(BullGuy)
BearGuy += 1
else
BearGuy := math.min(BullGuy, 4999)
rsiw = rsi_weight / 100
cew = half_weight / 100
atrw = atr_weight / 100
atr = hln(hclose, length) * atrw
ce = 1 / trendPersistence(hclose, length, smoothing)
com = 1 / math.max(math.abs(vawsi(hclose, length) - 50) * 2, 20)
comfin = (((com * rsiw) + (ce * cew) - atr)) * com_mult
lower = highest_custom(math.min((math.max(highest_custom(src, BearGuy) * (1 - comfin), sl)), src[1]), BearGuy)
upper = lowest_custom(math.max((math.min(lowest_custom(src, BearGuy) * (1 + comfin), tp)), src[1]), BearGuy)
var float thresh = na
if na(thresh)
thresh := lower
if na(dir)
dir := 1
if crossdown
dir := -1
if crossup
dir := 1
if dir == 1
thresh := lower
if dir == -1
thresh := upper
crossup := ta.crossover(hclose, thresh) and barstate.isconfirmed
crossdown := ta.crossunder(hclose, thresh) and barstate.isconfirmed
//STRATEGY
if crossup
strategy.entry("long", strategy.long)
if crossdown
strategy.entry("Short", strategy.short)
//PLOTTING
col = hclose > thresh ? color.lime : color.red
plot(thresh, linewidth = 2, color = color.new(col[1], 0))