Estrategia de patrón de impulso ABCD

El autor:¿ Qué pasa?, Fecha: 2023-09-24 13:08:28
Las etiquetas:

Resumen general

Esta estrategia utiliza el indicador fractal de Williams para identificar picos y mínimos de precios y combina patrones ABCD para determinar la dirección de la tendencia.

Estrategia lógica

  1. Utilice el indicador fractal de Williams para identificar picos y mínimos de precios. Se utilizan diferentes patrones para determinar patrones alcistas o bajistas ABCD.

  2. Criterios de identificación del patrón ABCD:

    • La distancia entre AB y CD es similar, y la distancia entre BC y CD cumple ciertos requisitos proporcionales (entre 0.382-0.886 y 1.13-2.618).

    • El punto D inferior al punto C es un patrón alcista.

  3. Utilice la función barsince para determinar qué direccións fractal está más cerca de la corriente para juzgar la dirección general de la tendencia.

  4. Introduzca largo/corto después de identificar el patrón ABCD y establezca el stop loss y el take profit para seguir las tendencias a mediano plazo.

Análisis de ventajas

  1. El indicador fractal de Williams ayuda a identificar los puntos de inflexión con mayor precisión.

  2. Los criterios del patrón ABCD son simples y confiables, fáciles de automatizar.

  3. Juzgar la dirección de la tendencia principal con barsince evita pérdidas por fallas.

  4. Siguiendo las tendencias con stop loss y take profit después de la entrada.

Análisis de riesgos

  1. El fractal Williams puede retrasarse y perder puntos de inflexión causando pérdidas.

  2. Los patrones ABCD múltiples que se superponen pueden causar una identificación errónea en los gráficos a medio plazo.

  3. La dirección errónea de la tendencia principal aumenta el riesgo de quedar atrapado en operaciones a mediano plazo.

  4. El stop loss demasiado apretado puede ser detenido fácilmente. El stop loss demasiado ancho puede causar un seguimiento pobre.

Soluciones posibles:

  1. Pruebe otros indicadores para ayudar a identificar los puntos de inflexión de manera más efectiva.

  2. Optimizar los parámetros del patrón ABCD para hacer la identificación más estricta y confiable.

  3. Mejorar la identificación de tendencias principales para evitar sesgos de dirección incorrecta.

  4. Prueba diferentes relaciones stop loss/take profit para encontrar los puntos óptimos.

Direcciones de optimización

  1. Prueba el MACD, el KDJ y otros indicadores para mejorar la precisión de las señales de entrada.

  2. Optimizar los parámetros basados en diferentes productos y plazos para encontrar los niveles óptimos de stop loss/take profit.

  3. Optimizar los períodos de revisión de barras para encontrar las mejores combinaciones de parámetros de acuerdo con las condiciones cambiantes del mercado.

  4. Añadir promedios móviles, etc. para filtrar las señales y mejorar la estabilidad.

  5. Introducir algoritmos de aprendizaje automático y más datos para mejorar la precisión del reconocimiento de patrones.

Resumen de las actividades

La lógica de la estrategia es clara y confiable en general, utilizando patrones fractales de Williams y ABCD para determinar la dirección de la tendencia a mediano plazo, combinando con el filtrado de tendencias, stop loss y take profit para seguir tendencias para obtener ganancias.


/*backtest
start: 2023-09-16 00:00:00
end: 2023-09-23 00:00:00
period: 45m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4
// @author=Daveatt - BEST

// ABCD Pattern Strat

StrategyName        = "BEST ABCD Pattern Strategy"
ShortStrategyName   = "BEST ABCD Pattern Strategy" 

// strategy(title=StrategyName, shorttitle=ShortStrategyName, overlay=true, 
//  pyramiding=2, default_qty_value=100, precision=7, currency=currency.USD,
//  commission_value=0.2,commission_type=strategy.commission.percent, initial_capital=1000000,
//  default_qty_type=strategy.fixed)

filterBW = input(false, title="filter Bill Williams Fractals?")

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////// UTILITIES ///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

//  ||-----------------------------------------------------------------------------------------------------||
//  ||---   Fractal Recognition Functions:  ---------------------------------------------------------------||
isRegularFractal(mode, _high, _low) =>
    ret = mode == 1 ? _high[4] < _high[3] and _high[3] < _high[2] and _high[2] > _high[1] and _high[1] > _high[0] :
     mode == -1 ? _low[4] > _low[3] and _low[3] > _low[2] and _low[2] < _low[1] and _low[1] < _low[0] : false

isBWFractal(mode, _high, _low) =>
    ret = mode == 1 ? _high[4] < _high[2] and _high[3] <= _high[2] and _high[2] >= _high[1] and _high[2] > _high[0] :
     mode == -1 ? _low[4] > _low[2] and _low[3] >= _low[2] and _low[2] <= _low[1] and _low[2] < _low[0] : false

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
////////////////////////////// ABCD PATTERN ///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

f_abcd()=>

    _r = timeframe.period
    _g = barmerge.gaps_off
    _l = barmerge.lookahead_on

    _high = high
    _low = low

    filteredtopf = filterBW ? isRegularFractal(1, _high, _low) : isBWFractal(1, _high, _low)
    filteredbotf = filterBW ? isRegularFractal(-1, _high, _low) : isBWFractal(-1, _high, _low)

    //  ||---   ZigZag:
    istop = filteredtopf
    isbot = filteredbotf
    topcount = barssince(istop)
    botcount = barssince(isbot)

    zigzag = (istop and topcount[1] > botcount[1] ? _high[2] :
     isbot and topcount[1] < botcount[1] ? _low[2] : na)

    x = valuewhen(zigzag, zigzag, 4) 
    a = valuewhen(zigzag, zigzag, 3) 
    b = valuewhen(zigzag, zigzag, 2) 
    c = valuewhen(zigzag, zigzag, 1) 
    d = valuewhen(zigzag, zigzag, 0)

    xab = (abs(b-a)/abs(x-a))
    xad = (abs(a-d)/abs(x-a))
    abc = (abs(b-c)/abs(a-b))
    bcd = (abs(c-d)/abs(b-c))

    // ABCD Part
    _abc = abc >= 0.382 and abc <= 0.886
    _bcd = bcd >= 1.13 and bcd <= 2.618
    
    _bull_abcd = _abc and _bcd and d < c 
    _bear_abcd = _abc and _bcd and d > c

    _bull   = _bull_abcd and not _bull_abcd[1]
    _bear   = _bear_abcd and not _bear_abcd[1]

    [_bull, _bear, zigzag]

lapos_x = timenow + round(change(time)*12)

[isLong, isShort, zigzag]  = f_abcd()

plot(zigzag, title= 'ZigZag', color=color.black, offset=-2)
plotshape(isLong, style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), size=size.normal, text="ABCD", textcolor=color.white)
plotshape(isShort, style=shape.labeldown, location=location.abovebar, color=color.new(color.maroon, 0), size=size.normal, text="ABCD", textcolor=color.white)


long_entry_price    = valuewhen(isLong, close, 0)
short_entry_price   = valuewhen(isShort, close, 0)

sinceNUP = barssince(isLong)
sinceNDN = barssince(isShort)

buy_trend   = sinceNDN > sinceNUP
sell_trend  = sinceNDN < sinceNUP


//////////////////////////
//* Profit Component *//
//////////////////////////

//////////////////////////// MinTick ///////////////////////////
fx_pips_value = syminfo.type == "forex" ? syminfo.mintick*10 : 1

input_tp_pips = input(100, "Backtest Profit Goal (in USD)",minval=0)*fx_pips_value
input_sl_pips = input(20, "Backtest STOP Goal (in USD)",minval=0)*fx_pips_value

tp = buy_trend? long_entry_price + input_tp_pips : short_entry_price - input_tp_pips
sl = buy_trend? long_entry_price - input_sl_pips : short_entry_price + input_sl_pips

plot_tp = buy_trend and high[1] <= tp ? tp : sell_trend and low[1] <= tp ? tp : na
plot_sl = buy_trend and low[1] >= sl ? sl : sell_trend and high[1] >= sl ? sl : na

plot(plot_tp, title="TP", style=plot.style_circles, linewidth=3, color=color.blue)
plot(plot_sl, title="SL", style=plot.style_circles, linewidth=3, color=color.red)

longClose   = isShort
shortClose  = isLong


strategy.entry("Long", 1, when=isLong)
// strategy.close("Long", when=longClose )
strategy.exit("XL","Long", limit=tp,  when=buy_trend, stop=sl)


strategy.entry("Short", 0,  when=isShort)
// strategy.close("Short", when=shortClose )
strategy.exit("XS","Short", when=sell_trend, limit=tp, stop=sl)

Más.