Estrategia de negociación de tiempo promedio móvil de ruptura de precios en dos direcciones

El autor:¿ Qué pasa?, Fecha: 2023-12-15 16:28:12
Las etiquetas:

img

Resumen general

La estrategia de negociación de promedios móviles de avance de precios de doble dirección es una estrategia de negociación cuantitativa que utiliza el avance de precios de promedios móviles para determinar las señales de negociación.

Estrategia lógica

La lógica central de esta estrategia es la siguiente:

  1. Calcular las medias móviles (EMA) de un período especificado (por ejemplo, 200 días) utilizando la función EMA.

  2. Compare el precio de cierre con la EMA para determinar si el precio rompe la EMA. Específicamente, cuando el precio de cierre está por encima de la EMA, el precio se rompe a través de la EMA; cuando el precio de cierre está por debajo de la EMA, el precio se rompe a través de la EMA.

  3. Determine señales largas y cortas basadas en los avances. Cuando el precio se rompe a través de la EMA, genere una señal larga; cuando el precio se rompe a través de la EMA, genere una señal corta.

  4. Cuando se activa la señal, se realiza una orden con un cierto porcentaje (por ejemplo, 100%) y se establecen los precios de stop loss y take profit.

  5. Cuando se toca el precio de stop loss o take profit, se cierra la posición.

  6. Repita el proceso para beneficiarse del momento de la ruptura del precio a través de los promedios móviles.

La estrategia es simple y directa de entender e implementar. Su objetivo es capturar el impulso a corto plazo mediante señales de ruptura de las medias móviles.

Ventajas

  • Lógica simple y clara, fácil de entender y validar.
  • Capacidad de seguimiento suave utilizando características de medias móviles.
  • Alta frecuencia de negociación, adecuada para operaciones a corto plazo.
  • Respuesta rápida a los cambios de precios, captura de buen momento.

Los riesgos

  • Un cierto nivel de retraso, puede perder el avance inicial del precio.
  • Comercio frecuente cuando es aserrado varias veces.
  • El riesgo de ser detenido en las inversiones bruscas.

Los métodos de optimización incluyen ajustes de parámetros, el uso de indicadores más efectivos, la reducción de la frecuencia de negociación, etc. Las paradas adaptativas y las condiciones de filtrado también pueden controlar los riesgos.

Direcciones de optimización

  • Prueba diferentes tipos y parámetros de medias móviles para obtener una mejor solución, por ejemplo, EMA, SMA, LWMA.
  • Las condiciones de filtración se añadirán para evitar operaciones con cuchillo de venta, por ejemplo, volumen, bandas de Bollinger, ATR, etc.
  • Optimizar y probar estrategias de stop loss y obtener ganancias para reducir riesgos.
  • Combinar el seguimiento de tendencias, la inversión media y otras estrategias para un sistema de negociación robusto.
  • Añadir parametrización para una mayor adaptabilidad.

Conclusión

La estrategia tiene una lógica relativamente simple de seguimiento de promedios móviles para capturar el impulso a corto plazo. Las ventajas incluyen capacidad de respuesta y facilidad de uso; las desventajas incluyen retraso e inercia. Se pueden hacer optimizaciones adicionales en la selección de indicadores, mecanismos de stop loss, técnicas de filtrado para hacer que la estrategia sea más sólida e integral.


/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 00:00:00
period: 1d
basePeriod: 1h
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/

// Credits to the original Script - Range Filter DonovanWall https://www.tradingview.com/script/lut7sBgG-Range-Filter-DW/
// This version is the old version of the Range Filter with less settings to tinker with

//@version=5
strategy(title='Range Filter - B&S Signals', shorttitle='RF - B&S Signals', initial_capital=1000, currency=currency.GBP, default_qty_value=100, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.075, overlay=true)


i_startTime = input(defval=timestamp('01 Jan 2020 12:00 +0000'), title='Backtest Start')
i_endTime = input(defval=timestamp('01 Jan 2024 12:00 +0000'), title='Backtest End')

inDateRange     = true
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Functions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longLossPerc = input.float(title='Long Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01
shortLossPerc = input.float(title='Short Stop Loss (%)', minval=0.0, step=0.1, defval=1) * 0.01

longTakePerc = input.float(title='Long Take(%)', minval=0.0, step=0.1, defval=1) * 0.01
shortTakePerc = input.float(title='Short Take (%)', minval=0.0, step=0.1, defval=1) * 0.01

emaLength = input.int(200, title="EMA Length")

    // Determine stop loss price

//Range Size Function
rng_size(x, qty, n) =>
//    AC       = Cond_EMA(abs(x - x[1]), 1, n)
    wper = n * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), n)
    AC = ta.ema(avrng, wper) * qty
    rng_size = AC
    rng_size

//Range Filter Function
rng_filt(x, rng_, n) =>
    r = rng_
    var rfilt = array.new_float(2, x)
    array.set(rfilt, 1, array.get(rfilt, 0))
    if x - r > array.get(rfilt, 1)
        array.set(rfilt, 0, x - r)
    if x + r < array.get(rfilt, 1)
        array.set(rfilt, 0, x + r)
    rng_filt1 = array.get(rfilt, 0)

    hi_band = rng_filt1 + r
    lo_band = rng_filt1 - r
    rng_filt = rng_filt1
    [hi_band, lo_band, rng_filt]

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Inputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Source
rng_src = input(defval=close, title='Swing Source')

//Range Period
rng_per = input.int(defval=20, minval=1, title='Swing Period')

//Range Size Inputs
rng_qty = input.float(defval=3.5, minval=0.0000001, title='Swing Multiplier')

//Bar Colors
use_barcolor = input(defval=false, title='Bar Colors On/Off')

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Definitions
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------

//Range Filter Values
[h_band, l_band, filt] = rng_filt(rng_src, rng_size(rng_src, rng_qty, rng_per), rng_per)

//Direction Conditions
var fdir = 0.0
fdir := filt > filt[1] ? 1 : filt < filt[1] ? -1 : fdir
upward = fdir == 1 ? 1 : 0
downward = fdir == -1 ? 1 : 0

//Trading Condition
longCond = rng_src > filt and rng_src > rng_src[1] and upward > 0 or rng_src > filt and rng_src < rng_src[1] and upward > 0
shortCond = rng_src < filt and rng_src < rng_src[1] and downward > 0 or rng_src < filt and rng_src > rng_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

//Colors
filt_color = upward ? #05ff9b : downward ? #ff0583 : #cccccc
bar_color = upward and rng_src > filt ? rng_src > rng_src[1] ? #05ff9b : #00b36b : downward and rng_src < filt ? rng_src < rng_src[1] ? #ff0583 : #b8005d : #cccccc


ema = ta.ema(close,emaLength)

//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
//Outputs
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
longStopPrice = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)

longTakePrice = strategy.position_avg_price * (1 + longTakePerc)
shortTakePrice = strategy.position_avg_price * (1 - shortTakePerc)

//Filter Plot
filt_plot = plot(filt, color=filt_color, linewidth=3, title='Filter', transp=67)

//Band Plots
h_band_plot = plot(h_band, color=color.new(#05ff9b, 100), title='High Band')
l_band_plot = plot(l_band, color=color.new(#ff0583, 100), title='Low Band')

//Band Fills
fill(h_band_plot, filt_plot, color=color.new(#00b36b, 92), title='High Band Fill')
fill(l_band_plot, filt_plot, color=color.new(#b8005d, 92), title='Low Band Fill')

//Bar Color
barcolor(use_barcolor ? bar_color : na)

if  inDateRange and close>ema
    strategy.entry("Long", strategy.long, when=longCondition)
    
if   inDateRange and close<ema
    strategy.entry("Short", strategy.short, when=shortCondition)


plot(ema)




//Plot Buy and Sell Labels
plotshape(longCondition, title='Buy Signal', text='BUY', textcolor=color.white, style=shape.labelup, size=size.normal, location=location.belowbar, color=color.new(color.green, 0))
plotshape(shortCondition, title='Sell Signal', text='SELL', textcolor=color.white, style=shape.labeldown, size=size.normal, location=location.abovebar, color=color.new(color.red, 0))

//Alerts
alertcondition(longCondition, title='Buy Alert', message='BUY')
alertcondition(shortCondition, title='Sell Alert', message='SELL')

if strategy.position_size > 0
    strategy.exit(id='Long', stop=longStopPrice, limit=longTakePrice)

if strategy.position_size < 0
    strategy.exit(id='Short', stop=shortStopPrice, limit=shortTakePrice)




Más.