
La estrategia de filtración de vibración de doble onda es una estrategia de negociación basada en la volatilidad de los precios. Utiliza un indicador de rango de fluctuación promedio de dos configuraciones de parámetros diferentes, que combina la relación entre el precio y el rango de fluctuación para generar una señal de negociación. La estrategia se aplica a activos digitales de alta volatilidad como Bitcoin.
La estrategia utiliza dos indicadores de rango de fluctuación suave de diferentes longitudes de período: rango de fluctuación rápida ((período predeterminado 27) y rango de fluctuación lenta ((período predeterminado 55)). La fórmula para calcular el rango de fluctuación es: el promedio de movimiento de la amplitud de fluctuación de precios en el período actual multiplicado por un múltiplo ((como 1.6)).
La estrategia de filtro de oscilación de doble onda es comparar la relación entre el precio y los dos indicadores de rango de oscilación para determinar si el precio se encuentra actualmente dentro de un rango de oscilación de cierta magnitud. Cuando el precio rompe el rango de oscilación, se genera una señal de negociación.
En concreto, la estrategia utiliza la línea media como punto de referencia, y la línea media como el promedio de los dos indicadores de rango de fluctuación. Se produce una señal de brecha cuando el precio está por encima de la línea media y por debajo de la línea media.
Para filtrar los informes falsos, la estrategia también añade una condición: la señal se emite sólo cuando el precio está en consonancia con el precio de un ciclo anterior. Por ejemplo, la señal de multiplicación se emite sólo cuando el precio sube y supera un rango de fluctuación de la línea media.
En resumen, la estrategia utiliza un indicador de rango de doble oscilación para identificar zonas de convulsión y generar instrucciones de negociación con una señal de que el precio ha roto la zona de convulsión. Al mismo tiempo, se agrega un filtro de dirección del precio para reducir las señales erróneas.
Las ventajas de una estrategia de filtración de vibración de doble onda son:
Utilizando las características de volatilidad de los precios, puede adaptarse a activos de alta volatilidad como Bitcoin. El indicador de doble rango de fluctuación puede determinar con mayor precisión las zonas de oscilación de los precios.
El índice de rango de doble oscilación contiene diferentes longitudes de tiempo. El índice rápido capta oportunidades de brecha a corto plazo, mientras que el índice lento considera tendencias a largo plazo.
La inclusión de condiciones de filtración de la dirección del precio puede reducir las señales erróneas causadas por la volatilidad a corto plazo.
La lógica de transacción es simple, clara, fácil de entender y adecuada para la transacción cuantitativa.
La estrategia de filtración de vibración de doble onda también tiene algunos riesgos a tener en cuenta:
Dependiendo de los indicadores de volatilidad, puede no funcionar bien en mercados con baja volatilidad.
Los parámetros de rango de fluctuación necesitan ser ajustados y optimizados para diferentes variedades, de lo contrario se perderán oportunidades de negociación o se generarán señales erróneas.
No se tiene en cuenta la desviación del precio de la volatilidad. Cuando la volatilidad aumenta y el precio no corresponde a la subida, puede emitir una señal errónea.
En un entorno de alta volatilidad, la configuración del punto de parada puede necesitar ajustes. Un punto de parada demasiado radical se detiene con frecuencia.
La estrategia puede ser optimizada en los siguientes aspectos:
Prueba y optimización de los parámetros del rango de oscilación para encontrar la combinación óptima de parámetros para diferentes ciclos de diferentes variedades.
Incorporar un mecanismo para ajustar la posición de parada en función de la evolución reciente de la tasa de volatilidad y optimizar la estrategia de parada.
Aumentar las condiciones de filtración basadas en el desvío de los precios de la volatilidad para evitar señales erróneas.
En combinación con otros indicadores, como el cambio en el volumen de transacciones, aumenta la certeza de entrada.
Probar y agregar mecanismos de suspensión y salida adecuados para la estrategia.
La estrategia de filtración de vibración de doble onda es una estrategia de negociación efectiva para activos altamente volátiles en general. Utiliza correctamente las características de la fluctuación de los precios y produce una lógica de negociación simple y clara. Se puede perfeccionar aún más a través de la optimización de parámetros, la gestión de riesgos, etc. La estrategia puede convertirse en un componente valioso del sistema de negociación cuantitativa.
/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 30m
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/
// © colinmck, greenmask9
//@version=4
strategy(title="Twin Range Filter Algo", overlay=true)
source = input(defval=close, title="Source")
// Smooth Average Range
per1 = input(defval=27, minval=1, title="Fast period")
mult1 = input(defval=1.6, minval=0.1, title="Fast range")
per2 = input(defval=55, minval=1, title="Slow period")
mult2 = input(defval=2, minval=0.1, title="Slow range")
smoothrng(x, t, m) =>
wper = t * 2 - 1
avrng = ema(abs(x - x[1]), t)
smoothrng = ema(avrng, wper) * m
smoothrng
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2
// Range Filter
rngfilt(x, r) =>
rngfilt = x
rngfilt := x > nz(rngfilt[1]) ? x - r < nz(rngfilt[1]) ? nz(rngfilt[1]) : x - r :
x + r > nz(rngfilt[1]) ? nz(rngfilt[1]) : x + r
rngfilt
filt = rngfilt(source, smrng)
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])
hband = filt + smrng
lband = filt - smrng
longCond = bool(na)
shortCond = bool(na)
longCond := source > filt and source > source[1] and upward > 0 or source > filt and source < source[1] and upward > 0
shortCond := source < filt and source < source[1] and downward > 0 or source < filt and source > source[1] and downward > 0
CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
long = longCond and CondIni[1] == -1
short = shortCond and CondIni[1] == 1
// Plotting
// Strategy
// From this part on, programmer is greenmaks9
//
Separator = input(title="Following conditions and backtest algorithm are added by @greenmask9 🎯, original script is written by @colinmck 👍. Read both of their's release notes for more info on how this script works.", type=input.bool, defval=false)
disabler = input(title="Disable greenmask9's ATR conditions", type=input.bool, defval=false)
//second
l2 = input(title="ATR1", defval=32, minval=1)
s2 = input(title="Smoothing", defval="SMA", options=["RMA", "SMA", "EMA", "WMA"])
atr2(source, l2) =>
if s2 == "SMA"
sma(source, l2)
else
if s2 == "RMA"
rma(source, l2)
else
if s2 == "EMA"
ema(source, l2)
else
wma(source, l2)
//third
l3 = input(title="ATR2", defval=64, minval=1)
s3 = input(title="Smoothing", defval="RMA", options=["RMA", "SMA", "EMA", "WMA"])
atr3(source, l3) =>
if s3 == "RMA"
rma(source, l3)
else
if s3 == "SMA"
sma(source, l3)
else
if s3 == "EMA"
ema(source, l3)
else
wma(source, l3)
atr20=atr2(tr(true), l2)
atr30=atr3(tr(true), l3)
strategy.initial_capital = 50000
ordersize=floor(strategy.initial_capital/close)
profit = input(title="Ticks profit", type=input.integer, defval=900)
stop = input(title="Ticks stoploss", type=input.integer, defval=300)
maxcandles_till_close = input(title="Time stoploss", type=input.integer, defval=17)
bull = long and (atr20<atr30 or disabler)
bear = short and (atr20<atr30 or disabler)
bullclock = barssince(bull)
bearclock = barssince(bear)
if (bull)
strategy.entry("Twin Long", strategy.long, ordersize)
strategy.exit("Exit", from_entry = "Twin Long", profit = profit, loss = stop)
if (bear)
strategy.entry("Twin Short", strategy.short, ordersize)
strategy.exit("Exit", from_entry = "Twin Short", profit = profit, loss = stop)
//time stoploss
strategy.close("Twin Long", when = bullclock == maxcandles_till_close, comment = "Timed out")
strategy.close("Twin Short", when = bearclock == maxcandles_till_close, comment = "Timed out")