Doble inclusión y estrategia de tendencia


Fecha de creación: 2024-01-30 15:11:48 Última modificación: 2024-01-30 15:11:48
Copiar: 1 Número de Visitas: 705
1
Seguir
1617
Seguidores

Doble inclusión y estrategia de tendencia

Descripción general

La estrategia de doble contenido y tendencia es una estrategia de negociación cuantitativa que utiliza el formato de doble contenido y el promedio móvil para determinar la tendencia. La estrategia combina el formato de doble contenido para proporcionar una señal de negociación de alta probabilidad, mientras que utiliza el promedio móvil para determinar la tendencia del mercado y hacer más deuda en la dirección de la tendencia.

Principio de estrategia

  1. Calcula el promedio móvil de Hull como indicador de tendencia.
  2. Cuando aparece una segunda forma de inclusión, se considera que es una señal de negociación de mayor probabilidad. La forma de inclusión es la forma en que el precio más alto de las dos primeras líneas K y el precio más bajo están incluidos en la tercera línea K.
  3. Si el precio de cierre está por encima de la media móvil y forma un contenido múltiple, se establece una orden de parada de compra cerca del punto más alto de la forma inclusiva; si el precio de cierre está por debajo de la media móvil y forma un contenido vacío, se establece una orden de parada de venta cerca del punto más bajo de la forma inclusiva.
  4. Una vez que se activa el stop loss, configure el stop loss y el stop loss según la amplitud y la proporción de stop loss predeterminadas.

Análisis de las ventajas

  1. Las formas de inclusión ofrecen una señal de reversión con mayor probabilidad. La aparición de formas de inclusión doble puede indicar una reversión de precios en el corto plazo.
  2. Se utiliza en combinación con las medias móviles para operar en la dirección de la tendencia y aumentar la probabilidad de obtener ganancias.
  3. La adopción de un solo almacén de parada cerca de un punto de ruptura durante la tendencia ofrece una mejor oportunidad de entrada.

Análisis de riesgos

  1. En situaciones de crisis, las señales de negociación que ofrecen las formas implícitas pueden producir pérdidas frecuentes.
  2. Los promedios móviles como indicadores para juzgar la tendencia también pueden emitir señales erróneas, lo que lleva a pérdidas en las operaciones de desventaja.
  3. La configuración del punto de parada es demasiado pequeña y puede ser activada por un pequeño deslizamiento en el precio.

Dirección de optimización

  1. Los promedios móviles de diferentes parámetros pueden ser probados como indicadores para juzgar tendencias.
  2. Se puede combinar con otros indicadores para filtrar las fluctuaciones y evitar el comercio a ciegas sin una clara tendencia.
  3. Se puede obtener una combinación de parámetros más óptima a través del análisis de big data, como el ciclo de la media móvil, el multiplicador de stop loss, el porcentaje de stop loss, etc.
  4. Se pueden agregar filtros de tiempo de negociación y variedad para adaptarse a diferentes períodos de tiempo y características de diferentes variedades.

Resumir

La estrategia de doble contenido y tendencia utiliza la forma de doble contenido para proporcionar una señal de negociación de mayor probabilidad, al tiempo que ayuda a los promedios móviles a determinar la dirección de la tendencia general, hacer más deuda libre en la dirección de la tendencia, es una estrategia de tipo ruptura más estable. A través de la optimización de los parámetros y la optimización de las reglas, la estrategia puede adaptarse mejor al mercado y obtener una mayor probabilidad de ganancias.

Código Fuente de la Estrategia
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
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/
// © Kaspricci

//@version=5
strategy(
     title = "Double Inside Bar & Trend Strategy - Kaspricci", 
     shorttitle = "Double Inside Bar & Trend", 
     overlay=true, 
     initial_capital = 100000, 
     currency = currency.USD, 
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100, 
     calc_on_every_tick = true, 
     close_entries_rule = "ANY")

// ================================================ Entry Inputs ======================================================================
headlineEntry   = "Entry Seettings"

maSource        = input.source(defval = close,             group = headlineEntry, title = "MA Source")
maType          = input.string(defval = "HMA",             group = headlineEntry, title = "MA Type", options = ["EMA", "HMA", "SMA", "SWMA", "VWMA", "WMA"])
maLength        = input.int(   defval = 45,    minval = 1, group = headlineEntry, title = "HMA Length")

float ma = switch maType 
    "EMA"  => ta.ema(maSource,  maLength)
    "HMA"  => ta.hma(maSource,  maLength)
    "SMA"  => ta.sma(maSource,  maLength)
    "SWMA" => ta.swma(maSource)
    "VWMA" => ta.vwma(maSource, maLength)
    "WMA"  => ta.wma(maSource,  maLength)

plot(ma, "Trend MA", color.purple)

// ================================================ Trade Inputs ======================================================================
headlineTrade   = "Trade Seettings"

stopLossType    = input.string(defval = "ATR",                         group = headlineTrade,                 title = "Stop Loss Type",            options = ["ATR", "FIX"])
atrLength       = input.int(   defval = 50,   minval = 1,              group = headlineTrade, inline = "ATR", title = "   ATR: Length                 ")
atrFactor       = input.float( defval =  2.5, minval = 0, step = 0.05, group = headlineTrade, inline = "ATR", title = "Factor       ",             tooltip = "multiplier for ATR value")
takeProfitRatio = input.float( defval =  2.0, minval = 0, step = 0.05, group = headlineTrade,                 title = "            TP Ration",     tooltip = "Multiplier for Take Profit calculation")
fixStopLoss     = input.float( defval = 10.0, minval = 0, step = 0.5,  group = headlineTrade, inline = "FIX", title = "   FIX: Stop Loss             ") * 10 // need this in ticks
fixTakeProfit   = input.float( defval = 20.0, minval = 0, step = 0.5,  group = headlineTrade, inline = "FIX", title = "Take Profit",               tooltip = "in pips") * 10 // need this in ticks
useRiskMagmt    = input.bool(  defval = true,                          group = headlineTrade, inline = "RM",  title = "")
riskPercent     = input.float( defval = 1.0,  minval = 0., step = 0.5, group = headlineTrade, inline = "RM",  title = "Risk in %                ", tooltip = "This will overwrite quantity from startegy settings and calculate the trade size based on stop loss and risk percent") / 100

// ================================================ Filter Inputs =====================================================================
headlineFilter  = "Filter Setings"

// date filter
filterDates     = input.bool(defval = false,                                 group = headlineFilter, title = "Filter trades by dates")
startDateTime   = input(defval = timestamp("2022-01-01T00:00:00+0000"), group = headlineFilter, title = "       Start Date & Time")
endDateTime     = input(defval = timestamp("2099-12-31T23:59:00+0000"), group = headlineFilter, title = "       End Date & Time  ")

dateFilter      = not filterDates or (time >= startDateTime and time <= endDateTime)

// session filter
filterSession   = input.bool(title = "Filter trades by session", defval = false, group = headlineFilter)
session         = input(title = "       Session", defval = "0045-2245", group = headlineFilter)

sessionFilter   = not filterSession or time(timeframe.period, session, timezone = "CET")

// ================================================ Trade Entries and Exits =====================================================================

// calculate stop loss
stopLoss        = switch stopLossType
    "ATR" => nz(math.round(ta.atr(atrLength) * atrFactor / syminfo.mintick, 0), 0)
    "FIX" => fixStopLoss

// calculate take profit
takeProfit      = switch stopLossType
    "ATR" => math.round(stopLoss * takeProfitRatio, 0)
    "FIX" => fixTakeProfit


doubleInsideBar = high[2] > high[1] and high[2] > high[0] and low[2] < low[1] and low[2] < low[0]

// highlight mother candel and inside bar candles
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na)
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na, offset = -1)
bgcolor(doubleInsideBar ? color.rgb(33, 149, 243, 80) : na, offset = -2)

var float buyStopPrice  = na
var float sellStopPrice = na

if (strategy.opentrades == 0 and doubleInsideBar and barstate.isconfirmed)
    buyStopPrice  := high[0] // high of recent candle (second inside bar)
    sellStopPrice := low[0] // low of recent candle (second inside bar)

    tradeID = str.tostring(strategy.closedtrades + strategy.opentrades + 1)

    quantity = useRiskMagmt ? math.round(strategy.equity * riskPercent / stopLoss, 2) / syminfo.mintick : na

    commentTemplate = "{0} QTY: {1,number,#.##} SL: {2} TP: {3}"

    if (close > ma)
        longComment = str.format(commentTemplate, tradeID + "L", quantity, stopLoss / 10, takeProfit / 10)
        strategy.entry(tradeID + "L", strategy.long, qty = quantity, stop = buyStopPrice, comment = longComment)
        strategy.exit(tradeID + "SL", tradeID + "L", profit = takeProfit, loss = stopLoss, comment_loss = "SL", comment_profit = "TP")

    if (close < ma)
        shortComment = str.format(commentTemplate, tradeID + "S", quantity, stopLoss / 10, takeProfit / 10)
        strategy.entry(tradeID + "S", strategy.short, qty = quantity, stop = sellStopPrice, comment = shortComment)
        strategy.exit(tradeID + "SL", tradeID + "S", profit = takeProfit, loss = stopLoss, comment_loss = "SL", comment_profit = "TP")

// as soon as the first pending order has been entered the remaing pending order shall be cancelled 
if strategy.opentrades > 0
    currentTradeID = str.tostring(strategy.closedtrades + strategy.opentrades)
    strategy.cancel(currentTradeID + "S")
    strategy.cancel(currentTradeID + "L")