Estrategia comercial de reconocimiento de patrones con cuello colgado


Fecha de creación: 2023-09-18 14:14:51 Última modificación: 2023-09-18 14:14:51
Copiar: 0 Número de Visitas: 692
1
Seguir
1617
Seguidores

Descripción general

La estrategia permite realizar operaciones de forma de precio mediante la identificación de formas de línea K. Busca las formas de línea de la correa que han aparecido recientemente, y hace más o menos dependiendo de la señal de forma. El comerciante puede establecer el multiplicador de la parada de pérdida.

Principio de estrategia

Identificar si la línea K actual cumple con los requisitos de la forma de la línea de la suspensión: la entidad está en la mitad inferior, el precio de cierre y el precio de apertura están cerca de los mínimos. Al contrario, hacer múltiples señales, la entidad está en la mitad superior, el cierre está cerca de los máximos.

Después de la entrada, comienza el seguimiento de la tendencia, moviendo la línea de parada gradualmente hacia la dirección de la ganancia, y la línea de parada permanece inalterada hasta que se activa la parada o la parada.

Análisis de las ventajas

  • Utiliza las señales de identificación de la forma de los precios para evitar el comercio frecuente
  • El multiplicador de stop-loss puede ser personalizado para combinar riesgos y beneficios.
  • El seguimiento de la tendencia para bloquear más ganancias
  • Pero se puede hacer una falsa brecha para evitar ser atrapado.

Análisis de riesgos

  • La precisión de reconocimiento de formas no alcanza el 100%
  • El límite de pérdidas es demasiado pequeño y puede verse afectado por la oscilación de los precios.
  • El seguimiento de la tendencia requiere el movimiento oportuno de la línea de parada.

Se puede reducir el riesgo mediante métodos como la optimización de parámetros o indicadores auxiliares.

Dirección de optimización

  • Prueba de diferentes configuraciones de parada y parada de pérdida
  • Combinación de otros indicadores para filtrar falsas señales
  • Optimización de la lógica condicional de reconocimiento de formas
  • Parámetros de prueba de robustez en diferentes variedades

Resumir

La estrategia utiliza la identificación de formas para descubrir oportunidades de negociación y medir el rendimiento. La configuración de stop loss y stop loss es razonable y el riesgo de cada transacción puede ser controlado. Se puede perfeccionar aún más mediante la optimización de parámetros, por ejemplo, para convertirse en un sistema de negociación simple y práctico.

Código Fuente de la Estrategia
/*backtest
start: 2023-09-10 00:00:00
end: 2023-09-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// 
// Pinbar strategy script by samgozman (https://github.com/samgozman)
// 
// Detailed instruction how to use this script: https://github.com/samgozman/pinbar-strategy-tradingview
//
// If you liked the script and want to support me: https://paypal.me/sgozman
// 
// ++++++++++ Warning: The script is provided for educational purposes only. ++++++++++ //

strategy('Pinbar strategy', default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000)

profitMultiplier = input.float(2.0, "Profit multiplier", minval=0.1, step=0.1, group="Profit options", tooltip="X times signal candle size from high")
lossMultiplier =  input.float(1.0, "Loss multiplier", minval=0.1, step=0.1, group="Profit options", tooltip="X times signal candle size from low")

isTrailingStop = input.bool(true, "Use trailing stops?", group="Trading options", tooltip="Highly recommended!")
isCloseOnOppositSignal = input.bool(false, "Close trade if opposit signal occures?", group="Trading options", tooltip="Close long on short signal")
isLongEligible = input.bool(true, "Enter long trades?", group="Trading options")
isShortEligible = input.bool(true, "Enter short trades?", group="Trading options")

useDateFilter = input.bool(true, title="Begin Backtest at Start Date", group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2021"), title="Start Date", group="Backtest Time Period")

// Predefined time trading zone for back testing
inTradeWindow = true

// HELPER FUNCTIONS //

// calculate candle size for N bars back. Use 0 for current
calcCandle(int periods) =>
    math.abs(high[periods] - low[periods])

// if body is below 50% and close/open below 30%
isBearishPinbar(float candle) =>
    lower30 = low + candle * 0.30
    bottomHalf1 = close < hl2
    bottomHalf2 = open < hl2
    lowerRegion1 = close < lower30
    lowerRegion2 = open < lower30
    
    con1 = bottomHalf1 and bottomHalf2
    con2 = lowerRegion1 and lowerRegion2
    con3 = high > high[1]
    
    con1 and con2 and con3

// if body is above 50% and close/open above 30%  
isBullishPinbar(float candle) =>
    upper30 = high - candle * 0.30
    topHalf1 = close > hl2
    topHalf2 = open > hl2
    upperRegion1 = close > upper30
    upperRegion2 = open > upper30
    
    con1 = topHalf1 and topHalf2
    con2 = upperRegion1 and upperRegion2
    con3 = low < low[1]
    
    con1 and con2 and con3
    
barsSinceLastEntry() =>
    strategy.opentrades > 0 ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) : na

// Calculate trading signals
currentCandle = calcCandle(0)
longSignal = isBullishPinbar(currentCandle) and inTradeWindow
shortSignal = isBearishPinbar(currentCandle) and inTradeWindow

// ENTER THE TRADE //
if longSignal and isLongEligible
    strategy.entry("buy", strategy.long, when = strategy.position_size == 0)

if shortSignal and isShortEligible 
    strategy.entry("sell", strategy.short, when = strategy.position_size == 0)

// CALCULATE STOPS //
barsSinceEntry = barsSinceLastEntry()
candleFromEntry = calcCandle(barsSinceEntry)
// long
long_take_limit = strategy.position_avg_price + (candleFromEntry*profitMultiplier)
long_target_percent_profit = long_take_limit / strategy.position_avg_price - 1
long_target_percent_loss = (long_target_percent_profit / profitMultiplier) * lossMultiplier
long_stop_limit = low[barsSinceEntry] * (1 - long_target_percent_loss)
//short
short_take_limit = strategy.position_avg_price - (candleFromEntry*profitMultiplier)
short_target_percent_profit = strategy.position_avg_price / short_take_limit - 1
short_target_percent_loss = (short_target_percent_profit / profitMultiplier) * lossMultiplier
short_stop_limit = high[barsSinceEntry] * (1 + short_target_percent_loss)

// EXIT THE TRADE //
if strategy.position_size > 0 or strategy.position_size < 0
    if isTrailingStop
        strategy.exit(id="exit", from_entry="buy", trail_price = long_take_limit, stop=long_stop_limit)
        strategy.exit(id="exit", from_entry="sell", trail_price = short_take_limit, stop=short_stop_limit)
    else
        strategy.exit(id="exit", from_entry="buy", limit = long_take_limit, stop=long_stop_limit)
        strategy.exit(id="exit", from_entry="sell", limit = short_take_limit, stop=short_stop_limit)
    if isCloseOnOppositSignal
        strategy.close("buy", when = shortSignal)
        strategy.close("sell", when = longSignal)

// PLOT SIGNALS //
plotshape(longSignal, style=shape.arrowup, color=color.new(color.green, 0), size=size.large, location=location.belowbar)
plotshape(shortSignal, style=shape.arrowdown, color=color.new(color.red, 0), size=size.large, location=location.abovebar)