Estrategia de captura de tendencia de inversión de volumen

SMA ATR VOLUME ETH RTH TP SL
Fecha de creación: 2025-05-13 10:39:29 Última modificación: 2025-05-13 10:39:29
Copiar: 1 Número de Visitas: 346
2
Seguir
319
Seguidores

Estrategia de captura de tendencia de inversión de volumen Estrategia de captura de tendencia de inversión de volumen

Descripción general de la estrategia

La estrategia de captura de tendencias de volúmenes de transacciones es una estrategia de comercio cuantitativa basada en volúmenes de transacciones y comportamientos de precios anormales, cuyo objetivo es identificar los momentos clave en los que el mercado puede cambiar de dirección. El núcleo de la estrategia es buscar K-líneas con volúmenes de transacciones significativamente superiores a la media y tomar decisiones de negociación contrarias según la dirección de la tendencia anterior cuando se confirma una caída en el volumen de transacciones.

Principio de estrategia

El principio central de la estrategia se basa en el fenómeno de la inversión de tendencia después de un volumen de transacciones anormal en el mercado. La lógica de operación específica es la siguiente:

  1. Identificación de las transacciones inusualesEl sistema detecta si la línea K anterior tiene un volumen de transacciones significativamente superior al promedio. En el período de negociación normal (RTH), el volumen de transacciones debe ser más de 3 veces el promedio de transacciones recientes (AJUSTIBLE); en el período posterior al cierre o especial (ETH), se necesita más de 5 veces. El cálculo del volumen de transacciones promedio excluye automáticamente el período marginal de RTH, 4-6 p.m. después del cierre y el período anterior al cierre del domingo.

  2. Confirmado el retroceso de la transacción: El volumen de transacciones de la línea K actual debe ser menor que el volumen de transacciones de la línea K anterior, lo que indica que la transacción de gran volumen ha terminado.

  3. Determinación de las tendencias: Determina la dirección de la tendencia comparando el precio de cierre antes de la línea K de volumen de negocios anormal con la relación entre el SMA (Simple Moving Average).

  4. La señal de entrada de contratiempo

    • Haga más señales: cuando el volumen de transacciones anormales antes de la línea K es una tendencia a la baja ((el precio de cierre está por debajo de la SMA)) y el volumen de transacciones de la línea K actual es menor.
    • Señales de desvío: cuando el volumen de transacciones anormales en la línea K es una tendencia a la oscuridad ((el precio de cierre está por encima de la SMA)) y el volumen de transacciones en la línea K actual es menor.
  5. Ejecución de entrada

    • Hacer más: fijar el precio límite de compra en el precio mínimo de la línea K de volumen de transacción anormal.
    • Hacer vacío: fijar el precio límite de venta con el precio máximo de la línea K de volumen de transacción anormal.
  6. Gestión de riesgosSegún las características de las diferentes variedades, el sistema ofrece dos opciones de configuración de stop loss / stop stop:

    • Para una variedad específica (como NQ): use una configuración fija de puntos para detener la pérdida y detener el empuje.
    • Para otras variedades: se puede optar por detener/parar dinámicamente basado en el ATR, o usar un número de puntos fijo.
  7. El filtro del tiempo: La estrategia puede filtrar selectivamente las señales de negociación de los primeros y últimos 15 minutos de RTH, y siempre filtrar las señales de la hora de cierre después de la apertura (entre las 4 y las 6 de la tarde) y antes de la apertura del domingo.

Ventajas estratégicas

  1. Capturar el punto de inflexiónLa estrategia se centra en capturar los puntos de inflexión del mercado que se presentan con volúmenes de operaciones anormales, que generalmente representan cambios significativos en el estado de ánimo del mercado y ofrecen oportunidades de negociación con una mayor probabilidad de éxito.

  2. Puntos de entrada precisos: mejora la precisión de la entrada, asegurando la negociación a un nivel de precios técnicamente importante, mediante el uso de un solo precio límite en los puntos altos/bajos de la línea K de volumen de transacción anormal.

  3. La cantidad de adaptación que se puede identificarEstrategia: ajuste dinámico de los criterios de determinación del volumen de transacciones anormales en función de los diferentes momentos de negociación (horas de negociación regulares vs. horas posteriores al cierre / especiales), más en consonancia con la realidad del mercado.

  4. Gestión de riesgos flexible: Ofrece opciones de stop/stop de pérdidas basadas en puntos fijos y ATR, que se pueden personalizar según las características y la volatilidad de las diferentes variedades.

  5. El filtro de tiempo inteligente: Identificar y filtrar automáticamente los períodos de baja liquidez e inestabilidad para evitar falsas señales que pueden aparecer cerca de la apertura y el cierre del mercado.

  6. La respuesta visual es clara.La estrategia proporciona indicaciones visuales intuitivas en el gráfico, incluidas las líneas K de alto brillo anormal, las líneas SMA de tendencia y los parámetros de equilibrio de stop loss, para facilitar la supervisión y el análisis de los operadores.

  7. Ejecución automáticaUna vez que se cumplen las condiciones, el sistema ejecuta automáticamente la orden de precio límite y la configuración de parada de pérdidas, reduciendo la intervención humana y manteniendo la disciplina de la operación.

Riesgo estratégico

  1. Riesgo de una falsa brechaEl volumen anormal de transacciones puede provocar que los precios superen los niveles importantes a corto plazo, pero luego pueden retroceder rápidamente, lo que genera una señal errónea. Para mitigar este riesgo, se puede considerar agregar indicadores de confirmación, como la confirmación de sobrecompra/sobreventa del RSI o el requisito de duración de la ruptura.

  2. El impacto de los eventos impulsados por noticias: Los datos económicos importantes o los anuncios de las empresas pueden causar un volumen de transacciones inusual, pero estas reacciones suelen durar más tiempo que revertirse inmediatamente. Se recomienda suspender la estrategia o aumentar las condiciones de filtrado antes y después de la publicación de datos económicos importantes.

  3. Riesgo de cambios en el entorno del mercadoEn un mercado de fuerte tendencia, las operaciones contracorrientes pueden enfrentarse a un movimiento de precios continuamente desfavorable. Se puede considerar la adición de filtros de tendencia a largo plazo para evitar operaciones contracorrientes en un entorno de fuerte tendencia.

  4. Riesgo de que no se cumpla el precio límite: Si el precio no alcanza el nivel de precio límite establecido en la siguiente línea K, la señal de negociación puede no ser válida. Se puede considerar el establecimiento de un período máximo de validez o, en determinadas condiciones, se puede ejecutar solo en el precio de mercado.

  5. Riesgo de baja liquidez: A pesar de que la estrategia ha incluido una función de filtración de tiempo, algunas variedades pueden tener problemas de falta de liquidez en ciertos momentos. Se recomienda ajustar los límites de tiempo de negociación para las características de las variedades de negociación.

  6. Riesgos de la optimización de parámetros: Los parámetros de la estrategia de optimización excesiva pueden conducir a un mal rendimiento en el futuro por sobreajuste de los datos históricos. Se debe asegurar que los parámetros estén dentro de un rango razonable y verificar la solidez de la estrategia mediante pruebas fuera de la muestra.

Dirección de optimización de la estrategia

  1. Confirmación de varios períodos de tiempoPor ejemplo, se puede comprobar la dirección de la tendencia de la línea del sol y entrar en juego solo si coincide con la tendencia de la línea del sol.

  2. Evaluación de la calidad del volumen de transaccionesAdemás de la magnitud de la potencia de volumen puro, se puede considerar la evaluación de la calidad del volumen de transacciones, como la desviación del precio medio ponderado por volumen de transacciones (VWAP), para comprender mejor el comportamiento del mercado detrás de un gran volumen de transacciones.

  3. Estrategias para detener el daño dinámico: Implementa un stop-loss dinámico basado en la volatilidad, que ajusta automáticamente la posición de stop-loss a medida que el comercio avanza en la dirección favorable, bloqueando parte de las ganancias. Por ejemplo, puede utilizar un stop-loss de seguimiento o mover el stop-loss al precio de costo después de romper los niveles clave.

  4. Filtrado de correlación entre variedadesPara las variedades relacionadas (por ejemplo, los índices de acciones, los futuros y los activos, el oro y la plata, etc.), agregar indicadores de confirmación de las variedades relacionadas puede mejorar la calidad de la señal. La señal puede ser más confiable cuando hay un volumen de transacciones y un comportamiento de precios anormales en varias variedades relacionadas al mismo tiempo.

  5. Mejoras en el aprendizaje automático: Análisis de las características de los patrones de volumen anormales más exitosos en los datos históricos a través de algoritmos de aprendizaje automático, ajuste dinámico de las condiciones de entrada y los parámetros. Por ejemplo, puede utilizarse un árbol de decisión o un bosque aleatorio para predecir la mejor acción bajo una característica de volumen anormal dada.

  6. Ajuste de la tasa de fluctuaciónAjuste los criterios para determinar el volumen de transacciones anormales y los niveles de stop loss / stop loss en función del estado actual de la volatilidad del mercado. En un entorno de alta volatilidad, aumentar el volumen anormal puede determinar el umbral y reducir la distancia de stop loss; en un entorno de baja volatilidad, al contrario.

  7. Añadir un filtro básicoEn el día de la publicación de los datos económicos importantes o de los resultados trimestrales, ajuste estacionalmente los parámetros de la estrategia o suspenda la negociación para evitar falsas señales causadas por la interferencia de las noticias.

Resumir

La estrategia de captura de tendencias de volúmenes de transacciones es un sistema de negociación cuantitativo que se centra en el volumen de transacciones y el comportamiento de los precios para capturar posibles reveses mediante la identificación de cambios en el estado de ánimo del mercado después de volúmenes de transacciones anormales. La estrategia define técnicamente las condiciones de entrada y salida y las reglas de gestión de riesgos, e incluye un mecanismo de filtrado de tiempo inteligente para evitar períodos de baja calidad en el mercado.

La ventaja central de la estrategia reside en que capta con precisión la “formación de los indicadores” del mercado, que a menudo crea oportunidades de reversión a corto plazo cuando los participantes del mercado entran en masa y luego se retiran. La estrategia ofrece una forma de negociación disciplinada mediante la determinación precisa de la posición de los precios límite en los niveles de precios clave, junto con una gestión razonable de los estancamientos de pérdidas.

Sin embargo, los usuarios deben estar atentos a los riesgos potenciales de la estrategia en mercados de fuerte tendencia, así como a la sensibilidad a los eventos de noticias. La estrategia puede optimizar aún más la estabilidad y la adaptabilidad de su desempeño mediante el aumento de la confirmación de múltiples períodos de tiempo, el ajuste dinámico de los parámetros y la mejora de los mecanismos de gestión de riesgos.

En general, la estrategia de captura de tendencias de inversión de volumen de transacciones ofrece a los comerciantes un sistema de negociación basado en el comportamiento del mercado y los principios psicológicos, especialmente adecuado para mercados volátiles y situaciones de oscilación en el intervalo. Con una configuración razonable y una optimización continua, la estrategia tiene el potencial de ser una herramienta eficaz en la cartera de operaciones.

Código Fuente de la Estrategia
/*backtest
start: 2024-05-13 00:00:00
end: 2025-05-11 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Strategy Title Reflects Latest Logic
strategy(title="Middle Finger Trading Strategy",
         shorttitle="Middle_Finger",
         overlay=true,
         pyramiding=0, // Only one entry at a time
         default_qty_type=strategy.percent_of_equity,
         default_qty_value=1, // Trade 1% of equity
         commission_value=0.04, // Example commission (adjust as needed)
         commission_type=strategy.commission.percent,
         initial_capital = 10000, // Example starting capital
         process_orders_on_close=false // Important for limit orders to potentially fill intra-bar
         )

// --- Inputs ---

// Volume Settings Group
grp_vol = "Volume Settings"
float rthHugeVolMultiplier = input.float(3.0, title="1. RTH Huge Vol. Multiplier (> Avg)", minval=1.1, step=0.1, group=grp_vol, tooltip="Multiplier for core RTH (9:45-15:44 ET)")
float ethHugeVolMultiplier = input.float(5.0, title="2. ETH/Excluded Huge Vol. Multiplier (> Avg)", minval=1.1, step=0.1, group=grp_vol, tooltip="Multiplier for ETH and first/last 15min RTH (default 5x)")
int   volLookback         = input.int(20, title="3. Volume SMA Lookback", minval=1, group=grp_vol, tooltip="Lookback for calculating the filtered average volume (Used ONLY for identifying the HUGE spike)")
// Removed normalVolMultiplier as it's no longer used for entry confirmation

// Trend Settings Group
grp_trend = "Trend Settings"
int   trendLookback       = input.int(20, title="1. Trend SMA Lookback", minval=2, group=grp_trend, tooltip="Lookback period for the Simple Moving Average used to determine the trend before the spike")

// Risk Management Group
grp_risk = "Risk Management (SL/TP)"
string nqTargetTickerId   = input.string("CME:NQ1!", title="1. Target Ticker ID for Fixed NQ Points", group=grp_risk, tooltip="Specify the exact Ticker ID (e.g., CME:NQ1!, TVC:NDX) for fixed SL/TP. Found in Symbol Info.")
float nqFixedStopPoints   = input.float(20.0, title="2. Fixed SL Points (for Target Ticker)", group=grp_risk, minval=0.1, step=0.1)
float nqFixedTpPoints     = input.float(50.0, title="3. Fixed TP Points (for Target Ticker)", group=grp_risk, minval=0.1, step=0.1)

// General SL/TP Settings (used if NOT the target ticker)
bool  useAtrStops         = input.bool(true, title="4. Use ATR for SL/TP (Other Tickers)?", group=grp_risk)
int   atrLookback         = input.int(14, title="5. ATR Lookback", group=grp_risk, inline="atr_other")
float atrStopMultiplier   = input.float(2.0, title="6. ATR SL Multiplier", group=grp_risk, inline="atr_other", minval=0.1, step=0.1)
float atrTpMultiplier     = input.float(4.0, title="7. ATR TP Multiplier", group=grp_risk, inline="atr_other", minval=0.1, step=0.1)
float fixedStopPoints     = input.float(100.0, title="6. Fixed SL Points (Other Tickers)", group=grp_risk, inline="fixed_other", minval=1)
float fixedTpPoints       = input.float(200.0, title="7. Fixed TP Points (Other Tickers)", group=grp_risk, inline="fixed_other", minval=1)

// Time Filter Settings Group
grp_time = "Time Filter (ET)"
bool  enableEntryFilterRthEdges = input.bool(true, title="1. Filter Entries First/Last 15 Min RTH (ET)?", group=grp_time, tooltip="If checked, ignores entries from 9:30-9:44 ET and 15:45-15:59 ET. Avg Vol calc *always* filters these times, 4-6PM ET, and Sun pre-6PM ET.")
string targetTimezone     = "America/New_York" // Specify Eastern Time zone

// --- Time Calculation Function ---
isTimeInSession(t, tz, sessionString) =>
    not na(time(timeframe.period, sessionString, tz))

// --- Time Context Functions ---
getTimeContext(t, tz) =>
    h = hour(t, tz)
    m = minute(t, tz)
    d = dayofweek(t, tz)

    // Core RTH: 9:45 AM to 15:44 PM ET (Mon-Fri)
    bool isCoreRTH = d >= dayofweek.monday and d <= dayofweek.friday and
       ((h == 9 and m >= 45) or (h >= 10 and h <= 14) or (h == 15 and m <= 44))

    // Excluded RTH Edges: 9:30-9:44 ET and 15:45-15:59 ET (Mon-Fri)
    bool isExcludedRTH = d >= dayofweek.monday and d <= dayofweek.friday and
       ((h == 9 and m >= 30 and m <= 44) or (h == 15 and m >= 45))

    // After Hours Closed: 4:00 PM to 5:59 PM ET (Mon-Fri)
    bool isAfterHoursClosed = d >= dayofweek.monday and d <= dayofweek.friday and
       (h >= 16 and h < 18)

    // Sunday Pre-Market: Sunday before 6:00 PM ET
    bool isSundayPreMarket = d == dayofweek.sunday and h < 18

    // Combine ALL periods where activity should be ignored or volume excluded from avg
    bool isExcludedPeriod = isExcludedRTH or isAfterHoursClosed or isSundayPreMarket

    [isCoreRTH, isExcludedRTH, isAfterHoursClosed, isSundayPreMarket, isExcludedPeriod]

// --- Get Time Context for Current and Previous Bar ---
[isCurrentBarCoreRTH, isCurrentBarExcludedRTH, isCurrentBarAfterHoursClosed, isCurrentBarSundayPreMarket, isCurrentBarExcludedPeriod] = getTimeContext(time, targetTimezone)
[isPreviousBarCoreRTH, isPreviousBarExcludedRTH, isPreviousBarAfterHoursClosed, isPreviousBarSundayPreMarket, isPreviousBarExcludedPeriod] = getTimeContext(time[1], targetTimezone)

// --- Calculations ---

// Volume Averaging: Exclude RTH edges, 4-6 PM ET, and Sunday Pre-6 PM ET ALWAYS
// This average is *only* used to define the huge volume spike threshold
bool excludeCurrentVolFromAvg = isCurrentBarExcludedPeriod
float volumeForAvgCalc = excludeCurrentVolFromAvg ? na : volume
float avgVolume = ta.sma(volumeForAvgCalc, volLookback)

// Dynamic Huge Volume Multiplier: Based on *previous* bar's time (Core RTH or not)
float activeHugeVolMultiplier = isPreviousBarCoreRTH ? rthHugeVolMultiplier : ethHugeVolMultiplier
// Use avgVolume[1] as current avgVolume excludes current bar, and we compare previous volume to avg *before* it
float hugeVolThreshold   = nz(avgVolume[1]) * activeHugeVolMultiplier

// --- MODIFIED Volume Conditions ---
// 1. Check if the *previous* bar had huge volume compared to its preceding average
bool isHugeVolumePrevBar = volume[1] > hugeVolThreshold and hugeVolThreshold > 0
// 2. Check if the *current* bar's volume is simply lower than the previous (huge) bar's volume
bool isVolumeLowerThanSpike = volume < volume[1]

// Trend Condition
float priceSma = ta.sma(close, trendLookback)
// Ensure trend condition uses close[2] vs sma[2] (trend state *before* the spike bar)
bool isBullishTrendBeforeSpike = close[2] > nz(priceSma[2])
bool isBearishTrendBeforeSpike = close[2] < nz(priceSma[2])

// --- Entry Time Filtering ---
// Always filter After Hours Closed and Sunday Pre-Market.
// Optionally filter RTH Edges based on input.
bool shouldFilterRthEdges = enableEntryFilterRthEdges and isCurrentBarExcludedRTH
bool isIgnoreEntryTime = shouldFilterRthEdges or isCurrentBarAfterHoursClosed or isCurrentBarSundayPreMarket

// --- MODIFIED Base Conditions ---
// Uses the simplified `isVolumeLowerThanSpike` check
bool baseLongCondition = isBearishTrendBeforeSpike and isHugeVolumePrevBar and isVolumeLowerThanSpike
bool baseShortCondition = isBullishTrendBeforeSpike and isHugeVolumePrevBar and isVolumeLowerThanSpike

// Final Conditions (Apply Time Filter)
bool finalLongCondition = baseLongCondition and not isIgnoreEntryTime
bool finalShortCondition = baseShortCondition and not isIgnoreEntryTime

// --- Stop Loss & Take Profit Calculation (Conditional Logic) ---
// This part remains the same
float atrValue = ta.atr(atrLookback)
float tickValue = syminfo.mintick
int stopLossTicks = 100 // Default fallback SL ticks
int takeProfitTicks = 200 // Default fallback TP ticks

// Check if the current symbol matches the target ticker ID
bool isTargetTicker = str.upper(syminfo.tickerid) == str.upper(nqTargetTickerId) // Case-insensitive comparison

if (isTargetTicker and tickValue > 0)
    // --- Target Ticker Logic (e.g., NQ Fixed Points) ---
    float ticksPerPoint = 1.0 / tickValue
    stopLossTicks := math.max(1, math.round(nqFixedStopPoints * ticksPerPoint))
    takeProfitTicks := math.max(1, math.round(nqFixedTpPoints * ticksPerPoint))
else if tickValue > 0 // Use only if tickValue is valid
    // --- Standard Logic (Other Tickers: ATR or Fixed) ---
    float stopLossDistance = useAtrStops ? atrValue * atrStopMultiplier : fixedStopPoints * tickValue
    float takeProfitDistance = useAtrStops ? atrValue * atrTpMultiplier : fixedTpPoints * tickValue

    // Calculate ticks, ensuring it's at least 1 tick
    stopLossTicks := na(stopLossDistance) ? 100 : math.max(1, math.round(stopLossDistance / tickValue))
    takeProfitTicks := na(takeProfitDistance) ? 200 : math.max(1, math.round(takeProfitDistance / tickValue))

// Final check to ensure SL/TP are not na
stopLossTicks := nz(stopLossTicks, 100)
takeProfitTicks := nz(takeProfitTicks, 200)


// --- Strategy Execution ---
// Uses Limit Orders based on previous bar's low/high - Remains the same
float limitEntryPriceLong = low[1]  // Target entry at the low of the huge volume bar
float limitEntryPriceShort = high[1] // Target entry at the high of the huge volume bar

if (finalLongCondition and strategy.position_size == 0)
    strategy.cancel("S") // Cancel any pending short limit order first
    strategy.entry("L", strategy.long, limit = limitEntryPriceLong)
    strategy.exit("L SL/TP", from_entry="L", loss=stopLossTicks, profit=takeProfitTicks)

if (finalShortCondition and strategy.position_size == 0)
    strategy.cancel("L") // Cancel any pending long limit order first
    strategy.entry("S", strategy.short, limit = limitEntryPriceShort)
    strategy.exit("S SL/TP", from_entry="S", loss=stopLossTicks, profit=takeProfitTicks)


// --- Plotting & Visuals ---
plot(avgVolume, title="Filtered Avg Volume", color=color.new(color.blue, 60), style=plot.style_line)
// Removed the plot for the normal volume threshold as it's no longer used

// Highlight huge volume bar (previous bar that triggered the signal)
bgcolor(isHugeVolumePrevBar[1] ? color.new(color.yellow, 85) : na, title="Huge Volume Bar [-1]")

// Highlight bars excluded from volume average calculation
bgcolor(excludeCurrentVolFromAvg ? color.new(color.teal, 90) : na, title="Vol Excluded from Avg Calc")

// Highlight bars where entries are ignored due to time filters
bgcolor(isIgnoreEntryTime and (baseLongCondition or baseShortCondition) ? color.new(color.gray, 75) : na, title="Entry Time Filtered Bar")

// --- MODIFIED Highlight base conditions met ---
// Reflects the updated base conditions using isVolumeLowerThanSpike
bgcolor(baseLongCondition and not isIgnoreEntryTime ? color.new(color.green, 90) : na, title="Base Long Condition Met")
bgcolor(baseShortCondition and not isIgnoreEntryTime ? color.new(color.red, 90) : na, title="Base Short Condition Met")

plot(priceSma, title="Trend SMA", color=color.gray)

// Plot SL/TP levels for visualization - Remains the same
var float entryPrice = na
var float slLevel = na
var float tpLevel = na

if (strategy.opentrades > 0 and strategy.opentrades[1] == 0) // Just entered a trade
    entryPrice := strategy.opentrades.entry_price(0)
    if (strategy.position_size > 0) // Long
        slLevel := entryPrice - stopLossTicks * tickValue
        tpLevel := entryPrice + takeProfitTicks * tickValue
    else // Short
        slLevel := entryPrice + stopLossTicks * tickValue
        tpLevel := entryPrice - takeProfitTicks * tickValue
else if (strategy.opentrades == 0 and strategy.opentrades[1] > 0) // Position closed
    entryPrice := na
    slLevel := na
    tpLevel := na
else if (strategy.opentrades > 0) // Position still open
    entryPrice := strategy.opentrades.entry_price(0)
    if (strategy.position_size > 0) // Long
        slLevel := entryPrice - stopLossTicks * tickValue
        tpLevel := entryPrice + takeProfitTicks * tickValue
    else // Short
        slLevel := entryPrice + stopLossTicks * tickValue
        tpLevel := entryPrice - takeProfitTicks * tickValue

plot(strategy.opentrades > 0 ? slLevel : na, title="Stop Loss Level", color=color.red, style=plot.style_linebr)
plot(strategy.opentrades > 0 ? tpLevel : na, title="Take Profit Level", color=color.green, style=plot.style_linebr)

// Optional Debugging Plots
// plotchar(isHugeVolumePrevBar, "HugeVol[1]", "H", location.bottom, color.yellow, size=size.tiny)
// plotchar(isVolumeLowerThanSpike, "VolLow", "v", location.bottom, color.purple, size=size.tiny) // Changed char
// plotchar(finalLongCondition, "FinalLong", "L", location.top, color.green, size=size.tiny)
// plotchar(finalShortCondition, "FinalShort", "S", location.top, color.red, size=size.tiny)
// plot(finalLongCondition ? limitEntryPriceLong : na, "Long Limit Target", color.lime, style=plot.style_circles, linewidth=2)
// plot(finalShortCondition ? limitEntryPriceShort : na, "Short Limit Target", color.fuchsia, style=plot.style_circles, linewidth=2)