Screener del indicador Detención de eventos Wyckoff

Viewing 11 posts - 1 through 11 (of 11 total)
  • Author
    Posts
  • #261892 quote
    NicoGB67
    Participant
    Senior

    Hola, me gustaría un screener del indicador Detención de eventos Wyckoff, que Iván subió esta semana, en concreto me gustaría que me alertase cuando aparece la etiqueta “SPRING” o “UT-D”, gracias.

    #261897 quote
    robertogozzi
    Moderator
    Master

    Este es el indicador donde agregué las dos señales que deseas (puedes verlas colocando el indicador en un nuevo panel DEBAJO del gráfico de precios):

    //----------------------------------------------
    //PRC_Wyckoff Event Detection
    //version = 0
    //08.06.26
    //Iván González @ www.prorealcode.com
    //Autor original: AlphaExtract
    //Sharing ProRealTime knowledge
    //----------------------------------------------
    // === Parametros ===
    //----------------------------------------------
    //volLen = 20            // periodo media de volumen
    //priceLookback = 20     // ventana de maximos/minimos y ATR
    //volThreshMult = 2.0    // multiplicador de volumen (mayor = menos eventos)
    //priceThreshMult = 0.3  // umbral de movimiento de precio
    //trendStrength = 3      // barras de racha para confirmar tendencia
    //minBars = 5            // separacion minima (barras) por tipo de evento
    //volumeFilter = 1.5     // filtro de volumen para eventos secundarios
    //phaseMult = 2.0        // veces que un bando supera al otro para fijar fase
    //phaseWindow = 20       // ventana de reseteo de contadores de fase
    //showRange = 1          // 1 = dibuja rango de trading
    //rangeStyle = 2         // 0 = dinamico, 1 = fijo, 2 = por pivotes
    //showMarks = 1          // 1 = dibuja punto + linea hacia atras en cada evento
    //lineLength = 15        // longitud (barras) de la linea hacia atras de la muesca
    //fixedRangeBars = 50    // lookback del rango fijo
    //pivotStrength = 3      // barras a cada lado para validar pivote
    //pivotLookback = 100    // barras a escanear buscando pivotes
    //rangeExtend = 50       // barras de extension del rango hacia la derecha
    //----------------------------------------------
    // === Indicadores base ===
    //----------------------------------------------
    volMA = average[volLen](volume)
    hh = highest[priceLookback](high)
    ll = lowest[priceLookback](low)
    avgTR = averagetruerange[priceLookback]
    rng = high - low
    labelOffset = avgTR * 0.5
    //----------------------------------------------
    // === Rachas direccionales ===
    //----------------------------------------------
    fallN = 1
    for k = 1 to trendStrength do
    if close[k-1] >= close[k] then
    fallN = 0
    endif
    next
    
    
    riseN = 1
    for k = 1 to trendStrength do
    if close[k-1] <= close[k] then
    riseN = 0
    endif
    next
    
    
    riseN1 = 1
    for k = 1 to trendStrength + 1 do
    if close[k-1] <= close[k] then
    riseN1 = 0
    endif
    next
    
    
    riseN2 = 1
    for k = 1 to trendStrength + 2 do
    if close[k-1] <= close[k] then
    riseN2 = 0
    endif
    next
    //----------------------------------------------
    // === Contadores de fase ===
    //----------------------------------------------
    once bearishCount = 0
    once bullishCount = 0
    
    
    if bearishCount > bullishCount * phaseMult then
    currentPhase = 1   // DISTRIBUCION
    elsif bullishCount > bearishCount * phaseMult then
    currentPhase = 2   // ACUMULACION
    else
    currentPhase = 0   // NEUTRAL
    endif
    //----------------------------------------------
    // === Condiciones de DISTRIBUCION (bajistas) ===
    //----------------------------------------------
    psyCond = 0
    if high > hh[1] and volume > volMA * volThreshMult and close < high - rng * priceThreshMult and fallN = 1 then
    psyCond = 1
    endif
    
    
    utdCond = 0
    if currentPhase = 1 and high > hh[1] and close < open and volume > volMA * volumeFilter and high - close > avgTR * priceThreshMult then
    utdCond = 1
    endif
    
    
    lpsyCond = 0
    if high > high[1] and close < open and volume < volMA * volumeFilter and fallN = 1 then
    lpsyCond = 1
    endif
    
    
    sowCond = 0
    if close < open and low < ll[1] and volume > volMA * volThreshMult and fallN = 1 then
    sowCond = 1
    endif
    
    
    bcCond = 0
    if rng > 0 then
    if high > hh[2] and volume > volMA * (volThreshMult * 1.5) and close > open and (close - open) / rng > 0.6 then
    bcCond = 1
    endif
    endif
    
    
    stdCond = 0
    if currentPhase = 1 and high > high[1] and high >= hh[5] * 0.98 and high <= hh[5] * 1.02 and volume < volMA and volume < volume[1] * 0.8 then
    stdCond = 1
    endif
    
    
    // BUEC: primer Upthrust en las ultimas 5 barras seguido de rally debil
    buecCond = 0
    for i = 1 to 5 do
    if utdCond[i] = 1 then
    if close < open and high < high[i] and close > low + rng * 0.3 and volume < volume[i] then
    buecCond = 1
    endif
    break
    endif
    next
    //----------------------------------------------
    // === Condiciones de ACUMULACION (alcistas) ===
    //----------------------------------------------
    psCond = 0
    if low < ll[1] and volume > volMA * volThreshMult and close > low + rng * priceThreshMult and fallN = 1 then
    psCond = 1
    endif
    
    
    scCond = 0
    if low < ll[1] and volume > volMA * (volThreshMult * 1.2) and close > low + rng * (priceThreshMult * 1.5) then
    scCond = 1
    endif
    
    
    araCond = 0
    if currentPhase = 2 and close > open and high > hh[trendStrength] and volume < volMA * volumeFilter and riseN = 1 then
    araCond = 1
    endif
    
    
    sosCond = 0
    if close > open and high > hh[1] and volume > volMA * volThreshMult and riseN = 1 then
    sosCond = 1
    endif
    
    
    lpsCond = 0
    if low > low[1] and close > open and volume < volMA * volumeFilter and riseN = 1 then
    lpsCond = 1
    endif
    
    
    springCond = 0
    if low < ll[3] and close > open and close > low + rng * 0.6 and volume > volMA * volumeFilter then
    springCond = 1
    endif
    
    
    staCond = 0
    if currentPhase = 2 and low < low[1] and low >= ll[5] * 0.98 and low <= ll[5] * 1.02 and volume < volMA and volume < volume[1] * 0.8 then
    staCond = 1
    endif
    
    
    jacCond = 0
    if close > open and close > hh[3] and volume > volMA * volThreshMult and riseN1 = 1 then
    jacCond = 1
    endif
    
    
    tsoCond = 0
    if low < ll[2] and close > open and close > low + rng * 0.7 and volume > volMA * (volThreshMult * 1.2) and riseN2 = 1 then
    tsoCond = 1
    endif
    //----------------------------------------------
    // === Actualizacion de contadores + reseteo periodico ===
    //----------------------------------------------
    if psyCond = 1 or utdCond = 1 or lpsyCond = 1 or sowCond = 1 or bcCond = 1 or stdCond = 1 or buecCond = 1 then
    bearishCount = bearishCount + 1
    endif
    if psCond = 1 or scCond = 1 or araCond = 1 or sosCond = 1 or lpsCond = 1 or springCond = 1 or staCond = 1 or jacCond = 1 or tsoCond = 1 then
    bullishCount = bullishCount + 1
    endif
    
    
    if barindex mod phaseWindow = 0 then
    bearishCount = 0
    bullishCount = 0
    endif
    //----------------------------------------------
    // === Dibujo de etiquetas ===
    //----------------------------------------------
    priceRangeFilter = 0.5
    once lastLabelBar = 0 - 1000
    once lastLabelPrice = 0
    once lastR = 0
    once lastG = 0
    once lastB = 0
    
    
    // Distribucion (etiqueta arriba salvo SOW)
    if psyCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("PSY", barindex, high + labelOffset) coloured(255, 107, 107)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 107
    lastB = 107
    endif
    
    
    UTDsignal = 0
    if utdCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("UT-D", barindex, high + labelOffset) coloured(255, 165, 0)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 165
    lastB = 0
    UTDsignal = -1
    endif
    if lpsyCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("LPSY", barindex, high + labelOffset) coloured(255, 65, 65)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 65
    lastB = 65
    endif
    if sowCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("SOW", barindex, low - labelOffset) coloured(255, 0, 0)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 255
    lastG = 0
    lastB = 0
    endif
    if bcCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("BC", barindex, high + labelOffset) coloured(255, 127, 0)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 127
    lastB = 0
    endif
    if stdCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("ST-D", barindex, high + labelOffset) coloured(255, 160, 122)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 160
    lastB = 122
    endif
    if buecCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("BUEC", barindex, high + labelOffset) coloured(255, 99, 71)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 99
    lastB = 71
    endif
    
    
    // Acumulacion (etiqueta abajo salvo AR-A / SOS / JAC)
    if psCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("PS", barindex, low - labelOffset) coloured(76, 175, 80)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 76
    lastG = 175
    lastB = 80
    endif
    if scCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("SC", barindex, low - labelOffset) coloured(69, 179, 157)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 69
    lastG = 179
    lastB = 157
    endif
    if araCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("AR-A", barindex, high + labelOffset) coloured(46, 204, 113)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 46
    lastG = 204
    lastB = 113
    endif
    if sosCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("[SOS]", barindex, high + labelOffset) coloured(39, 174, 96)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 39
    lastG = 174
    lastB = 96
    endif
    if lpsCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("LPS", barindex, low - labelOffset) coloured(34, 153, 84)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 34
    lastG = 153
    lastB = 84
    endif
    
    
    SpringSignal = 0
    if springCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("SPRING", barindex, low - labelOffset) coloured(0, 250, 154)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 0
    lastG = 250
    lastB = 154
    SpringSignal = 1
    endif
    if staCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("ST-A", barindex, low - labelOffset) coloured(102, 205, 170)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 102
    lastG = 205
    lastB = 170
    endif
    if jacCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("JAC", barindex, high + labelOffset) coloured(50, 205, 50)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 50
    lastG = 205
    lastB = 50
    endif
    if tsoCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("TSO", barindex, low - labelOffset) coloured(0, 128, 0)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 0
    lastG = 128
    lastB = 0
    endif
    
    
    // Muesca opcional
    if showMarks = 1 and lastLabelBar = barindex then
    drawpoint(barindex, lastLabelPrice, 2) coloured(lastR, lastG, lastB)
    drawsegment(barindex - lineLength, lastLabelPrice, barindex, lastLabelPrice) coloured(lastR, lastG, lastB)
    endif
    //----------------------------------------------
    // === Rango de trading + base del % del panel (solo ultima barra) ===
    //----------------------------------------------
    if islastbarupdate then
    if rangeStyle = 0 then
    topR = hh
    botR = ll
    x1 = barindex - priceLookback
    elsif rangeStyle = 1 then
    topR = highest[fixedRangeBars](high)
    botR = lowest[fixedRangeBars](low)
    x1 = barindex - fixedRangeBars
    else
    topR = hh
    botR = ll
    x1 = barindex - priceLookback
    foundH = 0
    foundL = 0
    maxLB = min(pivotLookback, barindex - pivotStrength - 1)
    if maxLB > 5 then
    for i = 5 to maxLB do
    if foundH = 0 then
    ph = 1
    for j = 1 to pivotStrength do
    if high[i] <= high[i+j] or high[i] <= high[i-j] then
    ph = 0
    endif
    next
    if ph = 1 then
    topR = high[i]
    foundH = 1
    endif
    endif
    next
    for i = 5 to maxLB do
    if foundL = 0 then
    pl = 1
    for j = 1 to pivotStrength do
    if low[i] >= low[i+j] or low[i] >= low[i-j] then
    pl = 0
    endif
    next
    if pl = 1 then
    botR = low[i]
    foundL = 1
    endif
    endif
    next
    endif
    endif
    if showRange = 1 then
    drawrectangle(x1, topR, barindex + rangeExtend, botR) coloured(123, 104, 238)
    endif
    endif
    //----------------------------------------------
    // === Panel de estado ===
    //----------------------------------------------
    if islastbarupdate then
    panelX = -200    // px a la izquierda del borde derecho
    topY = -20       // px hacia abajo del borde superior
       
    if currentPhase = 2 then
    drawtext("FASE: ACUMULACION", panelX, topY, SansSerif, bold, 11) coloured(76, 175, 80) anchor(topright, xshift, yshift)
    elsif currentPhase = 1 then
    drawtext("FASE: DISTRIBUCION", panelX, topY, SansSerif, bold, 11) coloured(255, 107, 107) anchor(topright, xshift, yshift)
    else
    drawtext("FASE: NEUTRAL", panelX, topY, SansSerif, bold, 11) coloured(150, 150, 150) anchor(topright, xshift, yshift)
    endif
       
    denom = bullishCount + bearishCount
    if denom < 1 then
    denom = 1
    endif
    sRatio = abs(bullishCount - bearishCount) / denom
    if sRatio > 0.7 then
    drawtext("FUERZA: FUERTE", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    elsif sRatio > 0.3 then
    drawtext("FUERZA: MODERADA", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    else
    drawtext("FUERZA: DEBIL", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    endif
       
    if high >= hh[3] and close < open then
    drawtext("POS: ZONA UPTHRUST", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    elsif low <= ll[3] and close > open then
    drawtext("POS: ZONA SPRING", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    elsif high >= hh[5] then
    drawtext("POS: EN RESISTENCIA", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    elsif low <= ll[5] then
    drawtext("POS: EN SOPORTE", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    else
    drawtext("POS: RANGO", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    endif
       
    if volume > volMA * 1.5 and close > open then
    drawtext("S/D: DEMANDA", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    elsif volume > volMA * 1.5 and close < open then
    drawtext("S/D: OFERTA", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    else
    drawtext("S/D: EQUILIBRIO", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    endif
       
    rangePct = round((topR - botR) / botR * 1000) / 10
    drawtext("RANGO: #rangePct#%", panelX, topY - 88, SansSerif, bold, 11) coloured(123, 104, 238) anchor(topright, xshift, yshift)
    endif
    
    
    return SpringSignal AS "Spring",UTDsignal AS "UT-D"
    

    Este es el Screener, que devuelve 1 cuando detecta la señal SPRING y 10 cuando detecta UT-D:

    mySpring, myUTD = CALL "PRC_Wyckoff Event Detection"[20, 20, 2, 0.3, 3, 5, 1.5, 2, 20, 1, 2, 1, 15, 50, 3, 100, 50](close)
    Cond = 0
    IF mySpring THEN
    Cond = Cond + 1
    ELSIF myUTD THEN
    Cond = Cond + 10
    ENDIF
    SCREENER [Cond](Cond AS "1=SPRING,10=UT-D")
    




    Nicolas and Iván González thanked this post
    #261904 quote
    NicoGB67
    Participant
    Senior

    Hola, me da error, tanto en el indicador como el screener

    #261905 quote
    robertogozzi
    Moderator
    Master

    ¿Puedes publicar una foto del error o escribir el texto?


    #261930 quote
    NicoGB67
    Participant
    Senior

    Hola, me sale un cuadro de error indicando “define la siguiente variable: fixedRangedBars, lineLength, minBars, phaseMult, phaseWindow, pivotLookback, pivotStrengh, priceLooback, priceThereshMult, rangeExtend, rangeStyle, showMa, showRange, trendStrengh, volLen, volThreshMult, volumeFilter

    #261947 quote
    robertogozzi
    Moderator
    Master

    Puedes eliminar los comentarios resaltados en el cuadro de la foto adjunta eliminando las barras dobles iniciales, o puedes importar el archivo ITF que adjunto.


    x-2.jpg x-2.jpg PRC_Wyckoff-Event-Detection-3.itf
    #261980 quote
    NicoGB67
    Participant
    Senior

    Hola, ahora el error me lo da en el screener: La función “PRC_Wyckoff llamada desde “Mis Screener (1) devuelve 0 valores pero su código necesita 2

    #261983 quote
    robertogozzi
    Moderator
    Master

    Olvidé que tenía que cambiar el indicador.

    Adjunto el archivo actualizado.

    ¡Disculpen el descuido!

    PRC_Wyckoff-Event-Detection-4.itf
    #261986 quote
    NicoGB67
    Participant
    Senior

    Hola, ahora me sale un mensaje en el Screener que dice “error interno de servidor”

    #261987 quote
    robertogozzi
    Moderator
    Master

    Publicaré tanto el indicador como el screener.

    Este es el indicador, que debes llamar PRC_Wyckoff Event Detection:

    //----------------------------------------------
    //PRC_Wyckoff Event Detection
    //version = 0
    //08.06.26
    //Iván González @ www.prorealcode.com
    //Autor original: AlphaExtract
    //Sharing ProRealTime knowledge
    //----------------------------------------------
    // === Parametros ===
    //----------------------------------------------
    volLen = 20            // periodo media de volumen
    priceLookback = 20     // ventana de maximos/minimos y ATR
    volThreshMult = 2.0    // multiplicador de volumen (mayor = menos eventos)
    priceThreshMult = 0.3  // umbral de movimiento de precio
    trendStrength = 3      // barras de racha para confirmar tendencia
    minBars = 5            // separacion minima (barras) por tipo de evento
    volumeFilter = 1.5     // filtro de volumen para eventos secundarios
    phaseMult = 2.0        // veces que un bando supera al otro para fijar fase
    phaseWindow = 20       // ventana de reseteo de contadores de fase
    showRange = 1          // 1 = dibuja rango de trading
    rangeStyle = 2         // 0 = dinamico, 1 = fijo, 2 = por pivotes
    showMarks = 1          // 1 = dibuja punto + linea hacia atras en cada evento
    lineLength = 15        // longitud (barras) de la linea hacia atras de la muesca
    fixedRangeBars = 50    // lookback del rango fijo
    pivotStrength = 3      // barras a cada lado para validar pivote
    pivotLookback = 100    // barras a escanear buscando pivotes
    rangeExtend = 50       // barras de extension del rango hacia la derecha
    //----------------------------------------------
    // === Indicadores base ===
    //----------------------------------------------
    volMA = average[volLen](volume)
    hh = highest[priceLookback](high)
    ll = lowest[priceLookback](low)
    avgTR = averagetruerange[priceLookback]
    rng = high - low
    labelOffset = avgTR * 0.5
    //----------------------------------------------
    // === Rachas direccionales ===
    //----------------------------------------------
    fallN = 1
    for k = 1 to trendStrength do
    if close[k-1] >= close[k] then
    fallN = 0
    endif
    next
    
    
    riseN = 1
    for k = 1 to trendStrength do
    if close[k-1] <= close[k] then
    riseN = 0
    endif
    next
    
    
    riseN1 = 1
    for k = 1 to trendStrength + 1 do
    if close[k-1] <= close[k] then
    riseN1 = 0
    endif
    next
    
    
    riseN2 = 1
    for k = 1 to trendStrength + 2 do
    if close[k-1] <= close[k] then
    riseN2 = 0
    endif
    next
    //----------------------------------------------
    // === Contadores de fase ===
    //----------------------------------------------
    once bearishCount = 0
    once bullishCount = 0
    
    
    if bearishCount > bullishCount * phaseMult then
    currentPhase = 1   // DISTRIBUCION
    elsif bullishCount > bearishCount * phaseMult then
    currentPhase = 2   // ACUMULACION
    else
    currentPhase = 0   // NEUTRAL
    endif
    //----------------------------------------------
    // === Condiciones de DISTRIBUCION (bajistas) ===
    //----------------------------------------------
    psyCond = 0
    if high > hh[1] and volume > volMA * volThreshMult and close < high - rng * priceThreshMult and fallN = 1 then
    psyCond = 1
    endif
    
    
    utdCond = 0
    if currentPhase = 1 and high > hh[1] and close < open and volume > volMA * volumeFilter and high - close > avgTR * priceThreshMult then
    utdCond = 1
    endif
    
    
    lpsyCond = 0
    if high > high[1] and close < open and volume < volMA * volumeFilter and fallN = 1 then
    lpsyCond = 1
    endif
    
    
    sowCond = 0
    if close < open and low < ll[1] and volume > volMA * volThreshMult and fallN = 1 then
    sowCond = 1
    endif
    
    
    bcCond = 0
    if rng > 0 then
    if high > hh[2] and volume > volMA * (volThreshMult * 1.5) and close > open and (close - open) / rng > 0.6 then
    bcCond = 1
    endif
    endif
    
    
    stdCond = 0
    if currentPhase = 1 and high > high[1] and high >= hh[5] * 0.98 and high <= hh[5] * 1.02 and volume < volMA and volume < volume[1] * 0.8 then
    stdCond = 1
    endif
    
    
    // BUEC: primer Upthrust en las ultimas 5 barras seguido de rally debil
    buecCond = 0
    for i = 1 to 5 do
    if utdCond[i] = 1 then
    if close < open and high < high[i] and close > low + rng * 0.3 and volume < volume[i] then
    buecCond = 1
    endif
    break
    endif
    next
    //----------------------------------------------
    // === Condiciones de ACUMULACION (alcistas) ===
    //----------------------------------------------
    psCond = 0
    if low < ll[1] and volume > volMA * volThreshMult and close > low + rng * priceThreshMult and fallN = 1 then
    psCond = 1
    endif
    
    
    scCond = 0
    if low < ll[1] and volume > volMA * (volThreshMult * 1.2) and close > low + rng * (priceThreshMult * 1.5) then
    scCond = 1
    endif
    
    
    araCond = 0
    if currentPhase = 2 and close > open and high > hh[trendStrength] and volume < volMA * volumeFilter and riseN = 1 then
    araCond = 1
    endif
    
    
    sosCond = 0
    if close > open and high > hh[1] and volume > volMA * volThreshMult and riseN = 1 then
    sosCond = 1
    endif
    
    
    lpsCond = 0
    if low > low[1] and close > open and volume < volMA * volumeFilter and riseN = 1 then
    lpsCond = 1
    endif
    
    
    springCond = 0
    if low < ll[3] and close > open and close > low + rng * 0.6 and volume > volMA * volumeFilter then
    springCond = 1
    endif
    
    
    staCond = 0
    if currentPhase = 2 and low < low[1] and low >= ll[5] * 0.98 and low <= ll[5] * 1.02 and volume < volMA and volume < volume[1] * 0.8 then
    staCond = 1
    endif
    
    
    jacCond = 0
    if close > open and close > hh[3] and volume > volMA * volThreshMult and riseN1 = 1 then
    jacCond = 1
    endif
    
    
    tsoCond = 0
    if low < ll[2] and close > open and close > low + rng * 0.7 and volume > volMA * (volThreshMult * 1.2) and riseN2 = 1 then
    tsoCond = 1
    endif
    //----------------------------------------------
    // === Actualizacion de contadores + reseteo periodico ===
    //----------------------------------------------
    if psyCond = 1 or utdCond = 1 or lpsyCond = 1 or sowCond = 1 or bcCond = 1 or stdCond = 1 or buecCond = 1 then
    bearishCount = bearishCount + 1
    endif
    if psCond = 1 or scCond = 1 or araCond = 1 or sosCond = 1 or lpsCond = 1 or springCond = 1 or staCond = 1 or jacCond = 1 or tsoCond = 1 then
    bullishCount = bullishCount + 1
    endif
    
    
    if barindex mod phaseWindow = 0 then
    bearishCount = 0
    bullishCount = 0
    endif
    //----------------------------------------------
    // === Dibujo de etiquetas ===
    //----------------------------------------------
    priceRangeFilter = 0.5
    once lastLabelBar = 0 - 1000
    once lastLabelPrice = 0
    once lastR = 0
    once lastG = 0
    once lastB = 0
    
    
    // Distribucion (etiqueta arriba salvo SOW)
    if psyCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("PSY", barindex, high + labelOffset) coloured(255, 107, 107)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 107
    lastB = 107
    endif
    
    
    UTDsignal = 0
    if utdCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("UT-D", barindex, high + labelOffset) coloured(255, 165, 0)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 165
    lastB = 0
    UTDsignal = -1
    endif
    if lpsyCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("LPSY", barindex, high + labelOffset) coloured(255, 65, 65)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 65
    lastB = 65
    endif
    if sowCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("SOW", barindex, low - labelOffset) coloured(255, 0, 0)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 255
    lastG = 0
    lastB = 0
    endif
    if bcCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("BC", barindex, high + labelOffset) coloured(255, 127, 0)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 127
    lastB = 0
    endif
    if stdCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("ST-D", barindex, high + labelOffset) coloured(255, 160, 122)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 160
    lastB = 122
    endif
    if buecCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("BUEC", barindex, high + labelOffset) coloured(255, 99, 71)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 255
    lastG = 99
    lastB = 71
    endif
    
    
    // Acumulacion (etiqueta abajo salvo AR-A / SOS / JAC)
    if psCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("PS", barindex, low - labelOffset) coloured(76, 175, 80)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 76
    lastG = 175
    lastB = 80
    endif
    if scCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("SC", barindex, low - labelOffset) coloured(69, 179, 157)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 69
    lastG = 179
    lastB = 157
    endif
    if araCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("AR-A", barindex, high + labelOffset) coloured(46, 204, 113)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 46
    lastG = 204
    lastB = 113
    endif
    if sosCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("[SOS]", barindex, high + labelOffset) coloured(39, 174, 96)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 39
    lastG = 174
    lastB = 96
    endif
    if lpsCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("LPS", barindex, low - labelOffset) coloured(34, 153, 84)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 34
    lastG = 153
    lastB = 84
    endif
    
    
    SpringSignal = 0
    if springCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("SPRING", barindex, low - labelOffset) coloured(0, 250, 154)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 0
    lastG = 250
    lastB = 154
    SpringSignal = 1
    endif
    if staCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("ST-A", barindex, low - labelOffset) coloured(102, 205, 170)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 102
    lastG = 205
    lastB = 170
    endif
    if jacCond = 1 and (barindex - lastLabelBar >= minBars or abs(high - lastLabelPrice) / high >= priceRangeFilter) then
    drawtext("JAC", barindex, high + labelOffset) coloured(50, 205, 50)
    lastLabelBar = barindex
    lastLabelPrice = high
    lastR = 50
    lastG = 205
    lastB = 50
    endif
    if tsoCond = 1 and (barindex - lastLabelBar >= minBars or abs(low - lastLabelPrice) / low >= priceRangeFilter) then
    drawtext("TSO", barindex, low - labelOffset) coloured(0, 128, 0)
    lastLabelBar = barindex
    lastLabelPrice = low
    lastR = 0
    lastG = 128
    lastB = 0
    endif
    
    
    // Muesca opcional
    if showMarks = 1 and lastLabelBar = barindex then
    drawpoint(barindex, lastLabelPrice, 2) coloured(lastR, lastG, lastB)
    drawsegment(barindex - lineLength, lastLabelPrice, barindex, lastLabelPrice) coloured(lastR, lastG, lastB)
    endif
    //----------------------------------------------
    // === Rango de trading + base del % del panel (solo ultima barra) ===
    //----------------------------------------------
    if islastbarupdate then
    if rangeStyle = 0 then
    topR = hh
    botR = ll
    x1 = barindex - priceLookback
    elsif rangeStyle = 1 then
    topR = highest[fixedRangeBars](high)
    botR = lowest[fixedRangeBars](low)
    x1 = barindex - fixedRangeBars
    else
    topR = hh
    botR = ll
    x1 = barindex - priceLookback
    foundH = 0
    foundL = 0
    maxLB = min(pivotLookback, barindex - pivotStrength - 1)
    if maxLB > 5 then
    for i = 5 to maxLB do
    if foundH = 0 then
    ph = 1
    for j = 1 to pivotStrength do
    if high[i] <= high[i+j] or high[i] <= high[i-j] then
    ph = 0
    endif
    next
    if ph = 1 then
    topR = high[i]
    foundH = 1
    endif
    endif
    next
    for i = 5 to maxLB do
    if foundL = 0 then
    pl = 1
    for j = 1 to pivotStrength do
    if low[i] >= low[i+j] or low[i] >= low[i-j] then
    pl = 0
    endif
    next
    if pl = 1 then
    botR = low[i]
    foundL = 1
    endif
    endif
    next
    endif
    endif
    if showRange = 1 then
    drawrectangle(x1, topR, barindex + rangeExtend, botR) coloured(123, 104, 238)
    endif
    endif
    //----------------------------------------------
    // === Panel de estado ===
    //----------------------------------------------
    if islastbarupdate then
    panelX = -200    // px a la izquierda del borde derecho
    topY = -20       // px hacia abajo del borde superior
       
    if currentPhase = 2 then
    drawtext("FASE: ACUMULACION", panelX, topY, SansSerif, bold, 11) coloured(76, 175, 80) anchor(topright, xshift, yshift)
    elsif currentPhase = 1 then
    drawtext("FASE: DISTRIBUCION", panelX, topY, SansSerif, bold, 11) coloured(255, 107, 107) anchor(topright, xshift, yshift)
    else
    drawtext("FASE: NEUTRAL", panelX, topY, SansSerif, bold, 11) coloured(150, 150, 150) anchor(topright, xshift, yshift)
    endif
       
    denom = bullishCount + bearishCount
    if denom < 1 then
    denom = 1
    endif
    sRatio = abs(bullishCount - bearishCount) / denom
    if sRatio > 0.7 then
    drawtext("FUERZA: FUERTE", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    elsif sRatio > 0.3 then
    drawtext("FUERZA: MODERADA", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    else
    drawtext("FUERZA: DEBIL", panelX, topY - 22, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    endif
       
    if high >= hh[3] and close < open then
    drawtext("POS: ZONA UPTHRUST", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    elsif low <= ll[3] and close > open then
    drawtext("POS: ZONA SPRING", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    elsif high >= hh[5] then
    drawtext("POS: EN RESISTENCIA", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    elsif low <= ll[5] then
    drawtext("POS: EN SOPORTE", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    else
    drawtext("POS: RANGO", panelX, topY - 44, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    endif
       
    if volume > volMA * 1.5 and close > open then
    drawtext("S/D: DEMANDA", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    elsif volume > volMA * 1.5 and close < open then
    drawtext("S/D: OFERTA", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    else
    drawtext("S/D: EQUILIBRIO", panelX, topY - 66, SansSerif, bold, 11) coloured(200, 200, 200) anchor(topright, xshift, yshift)
    endif
       
    rangePct = round((topR - botR) / botR * 1000) / 10
    drawtext("RANGO: #rangePct#%", panelX, topY - 88, SansSerif, bold, 11) coloured(123, 104, 238) anchor(topright, xshift, yshift)
    endif
    
    
    return SpringSignal AS "Spring",UTDsignal AS "UT-D"
    
    

    Este es el filtro, al que puedes llamar como quieras:

    mySpring, myUTD = CALL "PRC_Wyckoff Event Detection"[20, 20, 2, 0.3, 3, 5, 1.5, 2, 20, 1, 2, 1, 15, 50, 3, 100, 50](close)
    Cond = 0
    IF mySpring THEN
    Cond = Cond + 1
    ELSIF myUTD THEN
    Cond = Cond + 10
    ENDIF
    SCREENER [Cond](Cond AS "1=SPRING,10=UT-D")
    

    Fai il copia e incolla del codice e funzionerà certamente.




    NicoGB67 thanked this post
    #261993 quote
    NicoGB67
    Participant
    Senior

    Hola, algo diferente a otros screener que he tenido pero lo importante que funciona, gracias.

Viewing 11 posts - 1 through 11 (of 11 total)
  • You must be logged in to reply to this topic.

Screener del indicador Detención de eventos Wyckoff


ProScreener: Buscadores de Mercado y Rastreo

New Reply
Author
author-avatar
NicoGB67 @nicogb67 Participant
Summary

This topic contains 10 replies,
has 2 voices, and was last updated by NicoGB67
3 days, 14 hours ago.

Topic Details
Forum: ProScreener: Buscadores de Mercado y Rastreo
Language: Spanish
Started: 06/11/2026
Status: Active
Attachments: 4 files
Logo Logo
Loading...