Estrategia de trading de ruptura de tendencia de precisión


Fecha de creación: 2023-11-02 16:26:22 Última modificación: 2023-11-02 16:26:22
Copiar: 0 Número de Visitas: 692
1
Seguir
1617
Seguidores

Estrategia de trading de ruptura de tendencia de precisión

Descripción general

La estrategia de ruptura de tendencia precisa se basa en el indicador de tendencia y la forma específica de la línea K para lograr una captura precisa de la tendencia de ruptura. La estrategia utiliza la línea de mediana para determinar la dirección de la tendencia, el indicador RSI para determinar la sobrecompra y la sobreventa, y al mismo tiempo se combina con la forma de la línea K avanzada para seleccionar el punto de ruptura, para lograr la ubicación precisa de la tendencia y realizar operaciones de ruptura en el momento adecuado para obtener ganancias adicionales.

Principio de estrategia

  1. Aplicar el EMA de 8 días y el EMA de 80 días para determinar la dirección de la tendencia. El EMA de 8 días se define como un pronóstico positivo sobre el EMA de 80 días y, por el contrario, como un pronóstico negativo.

  2. Define la combinación de tres líneas K, es decir, la primera línea K baja por debajo de la segunda, y la tercera línea K baja por debajo de la segunda. La forma aparece como una señal de compra cuando se encuentra en una tendencia alcista.

  3. La tercera línea K se convierte en la línea K interna, es decir, cuando el precio de cierre está dentro de la línea K anterior, es el mejor punto de señal. En este momento, la forma 123 puede colocarse directamente en la comisión de negociación.

  4. El precio de la comisión es el tercer K-Line High ((comprar) o el tercer K-Line Low ((vender)). El Stop Loss es el segundo K-Line Low ((comprar) o el segundo K-Line High ((vender)). El Stop Loss es el doble de la diferencia de riesgo.

  5. Cuando las condiciones de la tendencia, la forma y el indicador se cumplen, se coloca una comisión de ruptura para realizar operaciones de alta probabilidad. Se establece un stop loss para bloquear las ganancias y lograr una operación de ruptura sólida.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. Utiliza el doble EMA para determinar la dirección de la tendencia general y evitar el comercio en contra.

  2. La filtración de formas K lineal tiene un significado de ruptura y mejora la probabilidad de obtener ganancias.

  3. Solo se emite una señal cuando los indicadores de tendencia, forma y diferencia de precios coinciden, para garantizar la calidad de la señal.

  4. La forma de la línea K interna mejora la fiabilidad de la señal y bloquea aún más el momento de la transacción.

  5. El punto de parada de pérdidas preestablecido controla el riesgo de las transacciones individuales.

  6. Verificación de datos de retroalimentación, con una tasa de victoria de más del 65%, con una ventaja estadística de ganancias a largo plazo.

En resumen, la estrategia aprovecha al máximo el juicio integral de tendencias, formas e indicadores para orientarse con precisión en el momento de la ruptura comercial, con una ventaja estable de riesgo y ganancias.

Análisis de riesgos

Los principales riesgos de esta estrategia provienen de:

  1. Se puede introducir más indicadores de tendencia para la confirmación multidimensional.

  2. No hay una única forma de detener los pérdidas que se adapte perfectamente a cada situación. Se puede configurar un punto de detención de pérdidas flotante.

  3. El reconocimiento de la forma de K depende de la configuración de los parámetros y requiere una optimización repetida para encontrar la combinación óptima.

  4. No se puede predecir el impacto de los eventos de gran impacto de los Black Swans en las operaciones. Se recomienda el uso de control de posición y la creación de posiciones en lotes.

  5. Los datos de retroalimentación no pueden representar el rendimiento de las operaciones reales, existe el riesgo de sobreajuste. Debe verificarse estrictamente la solidez de los parámetros.

  6. Los costos de transacción tienen una gran influencia en las estrategias de comercio de alta frecuencia. Se debe asegurar que la tasa de ganancias y pérdidas sea suficiente para soportar los costos.

En general, la estrategia puede reducir el riesgo y mejorar la estabilidad del rendimiento mediante la optimización de la configuración de los parámetros, la introducción de más dimensiones de juicio y el control del tamaño de la posición.

Dirección de optimización

La estrategia aún tiene varias dimensiones que se pueden optimizar:

  1. Prueba más parámetros de ciclo de la línea K para determinar una combinación de parámetros más estable.

  2. Aumentar los indicadores de volumen de transacciones para la confirmación multidimensional y evitar falsas brechas.

  3. Aumentar la robustez de los parámetros de evaluación de indicadores como la tasa de ajuste, la tasa de ganancias y pérdidas.

  4. Introducir un mecanismo de seguimiento de la suspensión para lograr una rentabilidad dinámica y controlada.

  5. Combinado con el índice de pánico VIX, evita períodos de incertidumbre en el mercado.

  6. Prueba de diferentes parámetros de ciclo de tenencia para determinar la mejor efectividad de la posición.

  7. Optimización de los mecanismos de parada de pérdidas para evitar que la parada estática predeterminada sea demasiado rígida

A través de estos medios, se puede mejorar aún más la estabilidad, la flexibilidad y la rentabilidad de la estrategia.

Resumir

La estrategia de negociación de ruptura de tendencia precisa utiliza con éxito la combinación orgánica de tendencias, formas y paradas de pérdidas para lograr una alta probabilidad de captura de ruptura de tendencia. Tiene características de claridad de la señal de negociación, reconocimiento de múltiples indicadores y control de riesgos, es una estrategia muy eficiente para situaciones de tendencia.

Código Fuente de la Estrategia
/*backtest
start: 2022-11-01 00:00:00
end: 2023-10-14 05:20: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/
// © julianossilva

//@version=5
strategy(title="J2S Backtest: 123-Stormer Strategy",
         shorttitle="J2S Backtest: 123-Stormer Strategy",
         overlay=true, initial_capital=1000, default_qty_value=10,
         default_qty_type = strategy.percent_of_equity, pyramiding=0)

// Initial Backtest Date Range
useStartDate = timestamp("01 Jan 2020 21:00:00")
useEndDate   = timestamp("01 Jan 2023 21:00:00")

// User Inputs
SIGNAL_CONFIG          = "BACKTEST: STORMER STRATEGY (123)"
longEntryInput         = input.bool(defval=true,         title="Long Entry",                     group=SIGNAL_CONFIG)
shortEntryInput        = input.bool(defval=true,         title="Short entry",                    group=SIGNAL_CONFIG)
thresholdForEntryInput = input.int(defval=3,             title="Threshold on clandes for entry", group=SIGNAL_CONFIG)
insideBarStrategyTitle = "Only third candle inside bar is valid"
insideBarStrategyTip   = "According to Stomer, it would be the best signal for the strategy"
insideBarStrategyInput = input.bool(defval=true,         title=insideBarStrategyTitle,           group=SIGNAL_CONFIG, tooltip=insideBarStrategyTip)
EMA_CONFIG             = "BACKTEST: EXPONENTIAL MOVING AVERAGES"
sourceInput            = input.source(defval=close,      title="Source",           inline="01",  group=EMA_CONFIG)
emaTimeframeInput      = input.timeframe("1W",           title="Timeframe",        inline="01",  group=EMA_CONFIG)
emaOffsetInput         = input.int(defval=8,             title="Offset",           inline="01",  group=EMA_CONFIG)
fastEMALengthInput     = input.int(defval=8,             title="Fast EMA Length",  inline="02",  group=EMA_CONFIG)
useFastEMAInput        = input.bool(defval=true,         title="Use Fast EMA",     inline="02",  group=EMA_CONFIG)
slowEMALengthInput     = input.int(defval=80,            title="Slow EMA Length",  inline="03",  group=EMA_CONFIG)
useSlowEMAInput        = input.bool(defval=true,         title="Use Slow EMA",     inline="03",  group=EMA_CONFIG)
PERIOD_CONFIG          = "BACKTEST: TIME PERIOD"
useDateFilterInput     = input.bool(defval=true,         title="Filter Date Range of Backtest",  group=PERIOD_CONFIG)
backtestStartDateInput = input(defval=useStartDate, title="Start Date",                     group=PERIOD_CONFIG)
backtestEndDateInput   = input(defval=useEndDate,   title="End Date",                       group=PERIOD_CONFIG)

// Colors
bbBackgroundColor  = color.rgb(33, 150, 243, 90)
candleColorDown    = color.rgb(239, 83, 80, 80)
candleColorUp      = color.rgb(38, 166, 154, 70)
insideBarColorDown = color.rgb(239, 83, 80, 40)
insideBarColorUp   = color.rgb(38, 166, 154, 20)
downTrendColor     = color.rgb(239, 83, 80, 80)
sidewaysTrendColor = color.rgb(252, 232, 131, 80)
upTrendColor       = color.rgb(38, 166, 154, 80)
buySignalColor     = color.lime
sellSignalColor    = color.orange

// Candles
isCandleUp()   => close > open
isCandleDown() => close <= open
barcolor(isCandleUp() ? candleColorUp : isCandleDown() ? candleColorDown : na)

// Exponential Moving Averages
fastEMA         = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput),    barmerge.gaps_on,  barmerge.lookahead_on)
currentFastEMA  = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput),    barmerge.gaps_off, barmerge.lookahead_on)
previousFastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], fastEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)
slowEMA         = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput),    barmerge.gaps_on,  barmerge.lookahead_on)
currentSlowEMA  = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput),    barmerge.gaps_off, barmerge.lookahead_on)
previousSlowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], slowEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)

// Trend Rules for Exponential Moving Averages
isSlowEMAUp()   => currentSlowEMA > previousSlowEMA
isSlowEMADown() => currentSlowEMA < previousSlowEMA
isFastEMAUp()   => currentFastEMA > previousFastEMA
isFastEMADown() => currentFastEMA < previousFastEMA

// Exponential Moving Average Colors
fastEMAColor = isFastEMAUp() ? upTrendColor : isFastEMADown() ? downTrendColor : sidewaysTrendColor
slowEMAColor = isSlowEMAUp() ? upTrendColor : isSlowEMADown() ? downTrendColor : sidewaysTrendColor

// Display Exponential Moving Averages
plot(useFastEMAInput ? fastEMA : na, offset=emaOffsetInput, color=fastEMAColor, title="Fast EMA", style=plot.style_line, linewidth=4)
plot(useSlowEMAInput ? slowEMA : na, offset=emaOffsetInput, color=slowEMAColor, title="Slow EMA", style=plot.style_line, linewidth=7)

// Price Trend
pricesAboveFastEMA() => low[2] > currentFastEMA and low[1] > currentFastEMA and low > currentFastEMA
pricesAboveSlowEMA() => low[2] > currentSlowEMA and low[1] > currentSlowEMA and low > currentSlowEMA
pricesBelowFastEMA() => high[2] < currentFastEMA and high[1] < currentFastEMA and high < currentFastEMA
pricesBelowSlowEMA() => high[2] < currentSlowEMA and high[1] < currentSlowEMA and high < currentSlowEMA

// Market in Bullish Trend
isBullishTrend() =>
    if useFastEMAInput and useSlowEMAInput
        pricesAboveFastEMA() and pricesAboveSlowEMA()
    else if useFastEMAInput
        pricesAboveFastEMA()
    else if useSlowEMAInput
        pricesAboveSlowEMA()
    else
        na

// Market in Bearish Trend
isBearishTrend() =>
    if useFastEMAInput and useSlowEMAInput
        pricesBelowFastEMA() and pricesBelowSlowEMA()
    else if useFastEMAInput
        pricesBelowFastEMA()
    else if useSlowEMAInput
        pricesBelowSlowEMA()
    else
        na

// Stormer Strategy (123)
isFirstCandleUp()   => high[2] > high[1] and low[2] > low[1]
isFirstCandleDown() => high[2] < high[1] and low[2] < low[1]
isThirdCandleUp()   => low > low[1]
isThirdCandleDown() => high < high[1]
isThirdCandleInsideBar() => high < high[1] and low > low[1]

// Buy Signal
isStormer123Buy() =>
    if insideBarStrategyInput
        longEntryInput and isFirstCandleUp() and isThirdCandleInsideBar() and isBullishTrend()
    else
        longEntryInput and isFirstCandleUp() and isThirdCandleUp() and isBullishTrend()

// Sell Signal
isStormer123Sell() =>
    if insideBarStrategyInput
        shortEntryInput and isFirstCandleDown() and isThirdCandleInsideBar() and isBearishTrend()
    else
        shortEntryInput and isFirstCandleDown() and isThirdCandleDown() and isBearishTrend()

// Backtest Time Period
inTradeWindow             = true
isInTradeWindow()         => inTradeWindow
isBacktestDateRangeOver() => not inTradeWindow and inTradeWindow[1]

// Backtest Price Parameters
highestPrice = ta.highest(high, 3)
lowestPrice  = ta.lowest(low,3)
priceRange   = highestPrice - lowestPrice

// Stormer Strategy (123): LONG
var myLongOrders = array.new_int(0)
longtEntryID     = "Long Entry:\n" + str.tostring(bar_index)
longExitID       = "Long Exit:\n" + str.tostring(bar_index)
stopLossInLong   = lowestPrice + 0.01
takeProfitInLong = priceRange + high

longEntryHasBeenMet = isInTradeWindow() and isBullishTrend() and isStormer123Buy()

// Scheduling LONG entry
if longEntryHasBeenMet
    array.push(myLongOrders, bar_index)
    strategy.order(longtEntryID, strategy.long, stop=high)
    strategy.exit(longExitID, longtEntryID, stop=stopLossInLong, limit=takeProfitInLong)

// In pine script, any order scheduled but not yet filled can be canceled.
// Once a order is filled, the trade is only finished with use of close or exit functions.
// As scheduled orders are not stored in the strategy.opentrades array, manual control is required.
for myOrderIndex = 0 to (array.size(myLongOrders) == 0 ? na : array.size(myLongOrders) - 1)
    myLongOrder = array.get(myLongOrders, myOrderIndex)
    if bar_index - myLongOrder == thresholdForEntryInput
        longEntryID = "Long Entry:\n" + str.tostring(myLongOrder)
        strategy.cancel(longEntryID)

// Stormer Strategy (123): SHORT
var myShortOrders = array.new_int(0)
shortEntryID      = "Short Entry:\n" + str.tostring(bar_index)
shortExitID       = "Short Exit:\n" + str.tostring(bar_index)
stopLossInShort   = highestPrice + 0.01
takeProfitInShort = low - priceRange

shortEntryHasBeenMet = isInTradeWindow() and isBearishTrend() and isStormer123Sell()

// Scheduling SHORT entry
if shortEntryHasBeenMet
    array.push(myShortOrders, bar_index)
    strategy.order(shortEntryID, strategy.short, stop=low)
    strategy.exit(shortExitID, shortEntryID, stop=stopLossInShort, limit=takeProfitInShort)

// In pine script, any order scheduled but not yet filled can be canceled.
// Once a order is filled, the trade is only finished with use of close or exit functions.
// As scheduled orders are not stored in the strategy.opentrades array, manual control is required.
for myOrderIndex = 0 to (array.size(myShortOrders) == 0 ? na : array.size(myShortOrders) - 1)
    myShortOrder = array.get(myShortOrders, myOrderIndex)
    if bar_index - myShortOrder == thresholdForEntryInput
        shortEntryID := "Short Entry:\n" + str.tostring(myShortOrder)
        strategy.cancel(shortEntryID)

// Close all positions at the end of the backtest period
if isBacktestDateRangeOver()
    strategy.cancel_all()
    strategy.close_all(comment="Date Range Exit")

// Display Signals
plotshape(series=longEntryHasBeenMet,  title="123 Buy",  style=shape.triangleup,   location=location.belowbar, color=buySignalColor,  text="123", textcolor=buySignalColor)
plotshape(series=shortEntryHasBeenMet, title="123 Sell", style=shape.triangledown, location=location.abovebar, color=sellSignalColor, text="123", textcolor=sellSignalColor)