Estrategia de negociación de filtros de doble alcance

El autor:¿ Qué pasa?, Fecha: 2023-11-13 10:38:20
Las etiquetas:

img

Resumen general

La estrategia Twin Range Filter es una estrategia de trading basada en la volatilidad de precios. Utiliza dos indicadores de rango promedio con diferentes configuraciones de parámetros, combinados con la relación entre precio y rango, para generar señales de trading.

Estrategia lógica

Esta estrategia utiliza dos indicadores de rango suave con diferentes períodos de duración: un indicador de rango rápido (período predeterminado 27) y un indicador de rango lento (período predeterminado 55).

La estrategia Twin Range Filter compara el precio con los dos indicadores de rango para determinar si se encuentra actualmente dentro de un cierto rango de oscilación.

Específicamente, la estrategia utiliza una línea mediana como punto de referencia, que es el promedio de los dos indicadores de rango.

Para filtrar señales falsas, también agrega una condición: una señal solo se genera cuando el movimiento del precio actual es consistente con el período anterior.

En resumen, esta estrategia identifica el rango de oscilación con indicadores de rango gemelo y genera órdenes cuando el precio rompe el rango.

Ventajas

Las ventajas de la estrategia del filtro de doble alcance:

  1. Utiliza características de volatilidad de precios, adaptables a activos altamente volátiles como Bitcoin. Los indicadores de rango gemelo pueden localizar rangos de precios con mayor precisión.

  2. Los indicadores gemelos contienen diferentes marcos de tiempo: el rápido capta oportunidades a corto plazo, mientras que el lento considera tendencias a largo plazo.

  3. La adición de filtros de dirección de precios reduce las señales falsas de las fluctuaciones a corto plazo.

  4. Lógica simple y clara, fácil de entender e implementar, adecuada para el comercio de algo.

Los riesgos

Algunos riesgos de la estrategia a tener en cuenta:

  1. Se basa en indicadores de volatilidad y puede tener un rendimiento inferior en entornos de baja volatilidad.

  2. Los parámetros del rango deben optimizarse para diferentes productos, de lo contrario se pueden perder oportunidades comerciales o ocurrir señales falsas.

  3. No se considera la divergencia entre el precio y la volatilidad.

  4. Los niveles de stop loss pueden necesitar ajuste en entornos de alta volatilidad.

Mejoramiento

La estrategia puede mejorarse en varios aspectos:

  1. Prueba y optimiza los parámetros del rango para encontrar combinaciones óptimas para diferentes productos y plazos.

  2. Añadir mecanismos dinámicos de stop loss basados en la volatilidad reciente, para optimizar la estrategia de stop loss.

  3. Añadir filtros basados en la divergencia de volatilidad de precios para evitar señales falsas.

  4. Incorporar otros indicadores como los cambios de volumen para aumentar la certeza de la entrada.

  5. Prueba y añade los mecanismos de salida apropiados para la estrategia.

Resumen de las actividades

En general, el filtro de rango gemelo es una estrategia de negociación efectiva para activos altamente volátiles. Utiliza bien las características de volatilidad de precios y genera una lógica de negociación simple y clara. Con mejoras adicionales como la optimización de parámetros y la gestión de riesgos, puede convertirse en un componente valioso en un sistema de negociación cuántica. También proporciona información sobre el comercio algorítmico basado en las características de volatilidad del mercado.


/*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")



Más.