Estrategia de filtro de media móvil doble con ruptura de tendencia


Fecha de creación: 2023-11-27 17:03:08 Última modificación: 2023-11-27 17:03:08
Copiar: 0 Número de Visitas: 689
1
Seguir
1617
Seguidores

Estrategia de filtro de media móvil doble con ruptura de tendencia

Descripción general

Se trata de una estrategia que utiliza la línea de equilibrio y el canal de Brin para juzgar la tendencia, y se combina con el filtro de ruptura y el principio de parada. Se puede capturar la señal en el momento en que la tendencia cambia, reducir la señal errónea a través de la doble línea de equilibrio de filtración, y establecer paradas para controlar el riesgo.

Principio de estrategia

La estrategia se compone principalmente de las siguientes partes:

  1. Determinación de tendencias: utiliza el MACD para determinar las tendencias de precios, distinguiendo entre las tendencias de más y las de menos.

  2. Filtración de rango: utiliza el canal de Brin para determinar el rango de fluctuación de los precios y filtra las señales que no superan el rango.

  3. Confirmación de doble línea media: doble línea media compuesta por EMA rápido y EMA lento, para confirmar la señal de tendencia. La señal de compra solo se genera cuando EMA rápido> EMA lento.

  4. Mecanismo de stop loss: establece un punto de stop loss, que se cierra cuando el precio rompe el punto de stop loss hacia la dirección negativa.

La lógica de juicio de las señales entrantes es:

  1. El MACD lo calificó como una tendencia al alza
  2. Los precios se han disparado por el Canal de Bryn
  3. El EMA rápido es más alto que el EMA lento

Cuando se cumplen las tres condiciones anteriores, se genera una señal de compra.

La lógica de la posición de equilibrio se divide en dos tipos, la posición de parada y la posición de parada. El punto de parada es el precio de entrada multiplicado por una cierta proporción, y el punto de parada es el precio de entrada multiplicado por una cierta proporción.

Análisis de las ventajas

Esta estrategia tiene las siguientes ventajas:

  1. La tecnología de la nube permite capturar los cambios en las tendencias en tiempo real, con menos traceback.
  2. Mejora la calidad de la señal mediante filtración de señales erróneas de doble línea uniforme.
  3. El mecanismo de control de pérdidas es eficaz para controlar las pérdidas individuales.
  4. El espacio para optimizar los parámetros es amplio y se puede ajustar al estado óptimo.

Análisis de riesgos

La estrategia también tiene sus riesgos:

  1. Las señales erróneas generadas por el temblor pueden causar daños.
  2. La configuración incorrecta de los puntos de parada puede causar pérdidas innecesarias.
  3. Los parámetros incorrectos pueden hacer que la estrategia no funcione.

Para estos riesgos, se puede optimizar y mejorar mediante la optimización de los parámetros, el ajuste de la posición de parada, etc.

Dirección de optimización

La estrategia puede ser optimizada en las siguientes direcciones:

  1. Ajuste la longitud de las líneas medias dobles para encontrar la combinación óptima de parámetros.
  2. Prueba diferentes métodos de deterioro, como el deterioro de seguimiento, el deterioro de vibración, etc.
  3. Prueba de los parámetros MACD para encontrar el parámetro óptimo.
  4. Utiliza el aprendizaje automático para optimizar los parámetros.
  5. Se añade una señal de filtro condicional adicional.

Se puede encontrar el estado óptimo de la estrategia probando diferentes configuraciones de parámetros para evaluar la rentabilidad y el Sharpe ratio.

Resumir

Es una estrategia cuantitativa que utiliza el juicio de tendencias, el filtrado de rangos, la confirmación de doble equilátero y el pensamiento de parada de pérdidas. Puede determinar la dirección de la tendencia de manera efectiva y encontrar el equilibrio entre la maximización de las ganancias y el control del riesgo.

Código Fuente de la Estrategia
/*backtest
start: 2022-11-20 00:00:00
end: 2023-11-26 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Range Filter Buy and Sell Strategies", shorttitle="Range Filter Strategies", overlay=true,pyramiding = 5)

// Original Script > @DonovanWall
// Adapted Version > @guikroth
// 
// Updated PineScript to version 5
// Republished by > @tvenn
// Strategizing by > @RonLeigh
//////////////////////////////////////////////////////////////////////////
// Settings for 5min chart, BTCUSDC. For Other coin, change the parameters
//////////////////////////////////////////////////////////////////////////



SS = input.bool(false,"Percentage Take Profit Stop Loss")


longProfitPerc = input.float(title='LongProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortProfitPerc = input.float(title='ShortProfit(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


longLossPerc = input.float(title='LongStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01

shortLossPerc = input.float(title='ShortStop(%)', minval=0.0, step=0.1, defval=1.5) * 0.01


// Color variables
upColor   = color.white
midColor  = #90bff9
downColor = color.blue

// Source
src = input(defval=close, title="Source")

// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters
per = input.int(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input.float(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper) * m
    smoothrng
smrng = smoothrng(src, per, mult)

// 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(src, smrng)

// Filter Direction
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])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Colors
filtcolor = upward > 0 ? upColor : downward > 0 ? downColor : midColor
barcolor = src > filt and src > src[1] and upward > 0 ? upColor :
   src > filt and src < src[1] and upward > 0 ? upColor : 
   src < filt and src < src[1] and downward > 0 ? downColor : 
   src < filt and src > src[1] and downward > 0 ? downColor : midColor

filtplot = plot(filt, color=filtcolor, linewidth=2, title="Range Filter")

// Target
hbandplot = plot(hband, color=color.new(upColor, 70), title="High Target")
lbandplot = plot(lband, color=color.new(downColor, 70), title="Low Target")

// Fills
fill(hbandplot, filtplot, color=color.new(upColor, 90), title="High Target Range")
fill(lbandplot, filtplot, color=color.new(downColor, 90), title="Low Target Range")

// Bar Color
barcolor(barcolor)

// Break Outs
longCond = bool(na)
shortCond = bool(na)
longCond := src > filt and src > src[1] and upward > 0 or 
   src > filt and src < src[1] and upward > 0
shortCond := src < filt and src < src[1] and downward > 0 or 
   src < filt and src > src[1] and downward > 0

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1



// alertcondition(longCondition, title="Buy alert on Range Filter", message="Buy alert on Range Filter")
// alertcondition(shortCondition, title="Sell alert on Range Filter", message="Sell alert on Range Filter")
// alertcondition(longCondition or shortCondition, title="Buy and Sell alert on Range Filter", message="Buy and Sell alert on Range Filter")


////////////// 副

sensitivity = input(150, title='Sensitivity')
fastLength = input(20, title='FastEMA Length')
slowLength = input(40, title='SlowEMA Length')
channelLength = input(20, title='BB Channel Length')
multt = input(2.0, title='BB Stdev Multiplier')

DEAD_ZONE = nz(ta.rma(ta.tr(true), 100)) * 3.7

calc_macd(source, fastLength, slowLength) =>
    fastMA = ta.ema(source, fastLength)
    slowMA = ta.ema(source, slowLength)
    fastMA - slowMA

calc_BBUpper(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis + dev

calc_BBLower(source, length, multt) =>
    basis = ta.sma(source, length)
    dev = multt * ta.stdev(source, length)
    basis - dev

t1 = (calc_macd(close, fastLength, slowLength) - calc_macd(close[1], fastLength, slowLength)) * sensitivity

e1 = calc_BBUpper(close, channelLength, multt) - calc_BBLower(close, channelLength, multt)

trendUp = t1 >= 0 ? t1 : 0
trendDown = t1 < 0 ? -1 * t1 : 0

duoad = trendUp > 0 and trendUp > e1

kongad = trendDown > 0 and trendDown > e1



duo =  longCondition and duoad

kong = shortCondition and kongad


//Alerts
plotshape(longCondition  and trendUp > e1 and  trendUp > 0 , title="Buy Signal", text="Buy", textcolor=color.white, style=shape.labelup, size=size.small, location=location.belowbar, color=color.new(#aaaaaa, 20))
plotshape(shortCondition  and trendDown > e1 and  trendDown > 0 , title="Sell Signal", text="Sell", textcolor=color.white, style=shape.labeldown, size=size.small, location=location.abovebar, color=color.new(downColor, 20))




if  longCondition and trendUp > e1 and  trendUp > 0 
    strategy.entry('Long',strategy.long, comment = "buy" )

if  shortCondition and trendDown > e1 and  trendDown > 0 
    strategy.entry('Short',strategy.short, comment = "sell" )




longlimtPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortlimtPrice = strategy.position_avg_price * (1 - shortProfitPerc)
   
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



if (strategy.position_size > 0)  and SS == true
    
    strategy.exit(id="Long",comment_profit = "Profit",comment_loss = "StopLoss", stop=longStopPrice,limit = longlimtPrice)
    

if (strategy.position_size < 0)  and SS == true
    
    strategy.exit(id="Short",comment_profit = "Profit",comment_loss = "StopLoss", stop=shortStopPrice,limit = shortlimtPrice)