Estrategia de filtración de media móvil doble para el avance del rango

El autor:¿ Qué pasa?, Fecha: 2023-11-27 17:03:08
Las etiquetas:

img

Resumen general

Esta es una estrategia que utiliza promedios móviles y bandas de Bollinger para el juicio de tendencia, combinado con filtración de ruptura y principios de stop loss. Puede capturar señales de manera oportuna cuando cambia la tendencia, reducir señales falsas a través de filtración doble de promedios móviles y controlar los riesgos estableciendo stop loss.

Principio de la estrategia

La estrategia consta de las siguientes partes principales:

  1. Juicio de tendencia: Utilice el MACD para juzgar la tendencia de los precios y distinguir las tendencias alcistas y bajistas.

  2. Filtración de rango: Utilice bandas de Bollinger para juzgar el rango de fluctuación de precios y filtrar las señales que no rompen el rango.

  3. Confirmación de la media móvil doble: la EMA rápida y la EMA lenta forman la media móvil doble para confirmar las señales de tendencia.

  4. Mecanismo de stop loss: Establece puntos de stop loss. Cierra posiciones cuando los precios rompen los puntos de stop loss en direcciones desfavorables.

La lógica de las señales de entrada es:

  1. El MACD juzga una tendencia al alza
  2. El precio rompe el carril superior de las bandas de Bollinger
  3. La EMA rápida es más alta que la EMA lenta

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

Hay dos tipos de posiciones de cierre, take profit y stop loss. El take profit es el precio de entrada multiplicado por un cierto porcentaje, y el stop loss es el precio de entrada multiplicado por un cierto porcentaje.

Análisis de ventajas

Las ventajas de esta estrategia son:

  1. Puede capturar los cambios de tendencia de manera oportuna con menos tracebacks.
  2. Reducir las señales falsas mediante el filtrado con medias móviles dobles, mejorando la calidad de la señal.
  3. El mecanismo de stop loss controla eficazmente las pérdidas individuales.
  4. Gran espacio de optimización de parámetros que se puede ajustar al estado óptimo.

Análisis de riesgos

Esta estrategia también presenta algunos riesgos:

  1. Las señales falsas generadas en los mercados laterales pueden conducir a pérdidas.
  2. La regulación incorrecta de las pérdidas de detención puede dar lugar a pérdidas innecesarias.
  3. Los parámetros inadecuados pueden resultar en un mal desempeño de la estrategia.

Para hacer frente a estos riesgos, la estrategia puede optimizarse ajustando los parámetros, estableciendo posiciones de stop loss, etc.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Ajuste la longitud media móvil para encontrar la combinación óptima de parámetros.
  2. Los métodos de prueba de pérdidas de parada diferentes, tales como pérdida de parada de seguimiento, pérdida de parada oscilante, etc.
  3. Prueba los parámetros MACD para encontrar los ajustes óptimos.
  4. Utilice el aprendizaje automático para la optimización automática de parámetros.
  5. Añadir condiciones adicionales a las señales de filtro.

Al probar diferentes configuraciones de parámetros y evaluar los rendimientos y las proporciones de Sharpe, se puede encontrar el estado óptimo de la estrategia.

Conclusión

Esta es una estrategia cuantitativa que utiliza el juicio de tendencia, el filtrado de rango, la confirmación de dos promedios móviles y las ideas de stop loss. Puede determinar efectivamente la dirección de la tendencia y lograr un equilibrio entre la maximización de ganancias y el control de riesgos. A través de la optimización de parámetros, el aprendizaje automático y otros medios, la estrategia tiene mucho margen de mejora para lograr mejores resultados.


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


Más.