Screener combinado de zonas de alerta Supply Demand

Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • #259988 quote
    NicoGB67
    Participant
    Average

    Buenos días, me gustaría obtener el screener conjunto de estos dos indicadores en gráficos de 1 hora, lo que quiero es que me avise cuando cualquiera de los dos indicadores formen en ese momento la zona de alerta y NO cuando el precio vuelva a tocar la zona:


    //--------------------------------------------
    // PRC_Supply-Demand-CVD-Flow (by ChartPrime)
    // version = 0
    // 07.04.2026
    // Ivan Gonzalez @ www.prorealcode.com
    // Sharing ProRealTime knowledge
    //--------------------------------------------
    defparam drawonlastbaronly = true
    //--------------------------------------------
    // === PARAMETERS ===
    atrLen = 14    // ATR length
    momMult = 1.0   // Breakout body >= ATR * mult
    maxZones = 10   // Max active zones per type
    showSignals = 1  // Signal triangles (1=yes, 0=no)
    
    //--------------------------------------------
    // === ATR ===
    myATR = averagetruerange[atrLen](close)
    
    //--------------------------------------------
    // === ZONE DETECTION ===
    // Base candle = bar[2], breakout candle = bar[1]
    IF barindex > 2 THEN
      brkBody = abs(close[1] - open[1])
      isDemand = (close[2] < open[2]) AND (close[1] > open[1]) AND brkBody >= momMult * myATR[1]
      isSupply = (close[2] > open[2]) AND (close[1] < open[1]) AND brkBody >= momMult * myATR[1]
    ELSE
      isDemand = 0
      isSupply = 0
    ENDIF
    
    //--------------------------------------------
    // === COUNTERS ===
    once dCount = 0
    once sCount = 0
    once sigCount = 0
    
    //--------------------------------------------
    // === CREATE DEMAND ZONE ===
    IF isDemand THEN
      zTop = high[2]
      zBot = low[2]
      zLeft = barindex - 2
      
      overlap = 0
      FOR i = 0 TO dCount - 1 DO
       IF $dValid[i] = 1 THEN
         IF zBot <= $dTop[i] AND zTop >= $dBot[i] THEN
          overlap = 1
          BREAK
         ENDIF
       ENDIF
      NEXT
      
      IF overlap = 0 THEN
       $dTop[dCount] = zTop
       $dBot[dCount] = zBot
       $dLeft[dCount] = zLeft
       $dValid[dCount] = 1
       dCount = dCount + 1
        
       // Trim oldest if exceeds max
       activeD = 0
       FOR i = 0 TO dCount - 1 DO
         IF $dValid[i] = 1 THEN
          activeD = activeD + 1
         ENDIF
       NEXT
       IF activeD > maxZones THEN
         FOR i = 0 TO dCount - 1 DO
          IF $dValid[i] = 1 THEN
            $dValid[i] = 0
            BREAK
          ENDIF
         NEXT
       ENDIF
        
       // Store signal
       IF showSignals = 1 THEN
         $sigBar[sigCount] = barindex
         $sigPrice[sigCount] = low - myATR * 0.3
         $sigType[sigCount] = 1
         sigCount = sigCount + 1
       ENDIF
      ENDIF
    ENDIF
    
    //--------------------------------------------
    // === CREATE SUPPLY ZONE ===
    IF isSupply THEN
      zTop = high[2]
      zBot = low[2]
      zLeft = barindex - 2
      
      overlap = 0
      FOR i = 0 TO sCount - 1 DO
       IF $sValid[i] = 1 THEN
         IF zBot <= $sTop[i] AND zTop >= $sBot[i] THEN
          overlap = 1
          BREAK
         ENDIF
       ENDIF
      NEXT
      
      IF overlap = 0 THEN
       $sTop[sCount] = zTop
       $sBot[sCount] = zBot
       $sLeft[sCount] = zLeft
       $sValid[sCount] = 1
       sCount = sCount + 1
        
       activeS = 0
       FOR i = 0 TO sCount - 1 DO
         IF $sValid[i] = 1 THEN
          activeS = activeS + 1
         ENDIF
       NEXT
       IF activeS > maxZones THEN
         FOR i = 0 TO sCount - 1 DO
          IF $sValid[i] = 1 THEN
            $sValid[i] = 0
            BREAK
          ENDIF
         NEXT
       ENDIF
        
       IF showSignals = 1 THEN
         $sigBar[sigCount] = barindex
         $sigPrice[sigCount] = high + myATR * 0.3
         $sigType[sigCount] = -1
         sigCount = sigCount + 1
       ENDIF
      ENDIF
    ENDIF
    
    //--------------------------------------------
    // === MITIGATION ===
    FOR i = 0 TO dCount - 1 DO
      IF $dValid[i] = 1 AND close <= $dBot[i] THEN
       $dValid[i] = 0
      ENDIF
    NEXT
    
    FOR i = 0 TO sCount - 1 DO
      IF $sValid[i] = 1 AND close >= $sTop[i] THEN
       $sValid[i] = 0
      ENDIF
    NEXT
    
    //--------------------------------------------
    // === DRAWING ===
    IF islastbarupdate THEN
      // Demand zones + CVD
      FOR i = 0 TO dCount - 1 DO
       IF $dValid[i] = 1 THEN
         zLen = barindex - $dLeft[i]
         cumDelta = 0
         FOR k = zLen DOWNTO 0 DO
          IF close[k] > open[k] THEN
            cumDelta = cumDelta + volume[k]
          ELSIF close[k] < open[k] THEN
            cumDelta = cumDelta - volume[k]
          ENDIF
         NEXT
         drawrectangle($dLeft[i], $dBot[i], barindex, $dTop[i]) coloured(34,197,94) fillcolor(34,197,143,38)
         drawtext("Demand | CVD: #cumDelta#", $dLeft[i]+2, $dBot[i]) coloured(34,197,94)
       ENDIF
      NEXT
      
      // Supply zones + CVD
      FOR i = 0 TO sCount - 1 DO
       IF $sValid[i] = 1 THEN
         zLen = barindex - $sLeft[i]
         cumDelta = 0
         FOR k = zLen DOWNTO 0 DO
          IF close[k] > open[k] THEN
            cumDelta = cumDelta + volume[k]
          ELSIF close[k] < open[k] THEN
            cumDelta = cumDelta - volume[k]
          ENDIF
         NEXT
         drawrectangle($sLeft[i], $sBot[i], barindex, $sTop[i]) coloured(239,68,68) fillcolor(239,68,68,38)
         drawtext("Supply | CVD: #cumDelta#", $sLeft[i]+2, $sTop[i]) coloured(239,68,68)
       ENDIF
      NEXT
      
      // Signal triangles
      IF showSignals = 1 THEN
       FOR i = 0 TO sigCount - 1 DO
         IF $sigType[i] = 1 THEN
          drawtext("△", $sigBar[i], $sigPrice[i]) coloured(34,197,94)
         ELSIF $sigType[i] = -1 THEN
          drawtext("▽", $sigBar[i], $sigPrice[i]) coloured(239,68,68)
         ENDIF
       NEXT
      ENDIF
    ENDIF
    
    RETURN
    



    y el Wick pressure zones:


    //---------------------------------------------------
    //PRC_Wick Pressure Zones by BigBeluga
    //version = 0
    //09.09.2025
    //Iván González @ www.prorealcode.com
    //Sharing ProRealTime knowledge
    //---------------------------------------------------
    DEFPARAM DrawOnLastBarOnly = true
    //---------------------------------------------------
    // inputs
    //---------------------------------------------------
    lookback = 200
    threshold = 80
    extendBars = 20
    maxLevels = 10
    rsiLen = 14
    upR = 255
    upG = 0
    upB = 0
    dnR = 0
    dnG = 255
    dnB = 0
    //---------------------------------------------------
    // Variables auxiliares
    //---------------------------------------------------
    bodyTop = MAX(open, close)
    bodyBot = MIN(open, close)
    // Mechas relativas (evitar división por 0)
    denUp = MAX(bodyTop, 0.0000001)
    denLo = MAX(low,   0.0000001)
    upperWick = (high - bodyTop) / denUp
    lowerWick = (bodyBot - low) / denLo
    
    maxUpper = HIGHEST[lookback](upperWick)
    maxLower = HIGHEST[lookback](lowerWick)
    
    sizeUpWick = 0
    sizeLoWick = 0
    IF maxUpper > 0 THEN
      sizeUpWick = FLOOR( (upperWick / maxUpper) * 100 )
    ENDIF
    IF maxLower > 0 THEN
      sizeLoWick = FLOOR( (lowerWick / maxLower) * 100 )
    ENDIF
    //---------------------------------------------------
    myrsi = RSI[rsiLen](close)
    vol = volume
    //---------------------------------------------------
    // Separación mínima entre zonas
    ONCE startidx = -100000
    //---------------------------------------------------
    // Boxes
    //---------------------------------------------------
    ONCE n = 0
    
    newUpper = sizeUpWick >= threshold AND NOT (sizeLoWick >= threshold) AND myrsi > 50 AND (BarIndex - startidx > extendBars)
    newLower = sizeLoWick >= threshold AND NOT (sizeUpWick >= threshold) AND myrsi < 50 AND (BarIndex - startidx > extendBars)
    
    // Crear zona superior
    IF newUpper THEN
      startidx = BarIndex
      n = n + 1
      $side[n] = 1
      $left[n] = BarIndex - 1
      $top[n] = high
      $bot[n] = bodyTop
      $right[n] = barindex + 1
      $broken[n] = 0
      $volume[n] = volume
      // Límite de zonas: mantener sólo las más recientes
      IF n > maxLevels THEN
       // Shift a la izquierda
       FOR k = 1 TO n - 1 DO
         $side[k] = $side[k+1]
         $left[k] = $left[k+1]
         $top[k] = $top[k+1]
         $bot[k] = $bot[k+1]
         $right[k] = $right[k+1]
         $broken[k] = $broken[k+1]
         $volume[k] = $volume[k+1]
       NEXT
       n = maxLevels
      ENDIF
    ENDIF
    
    // Crear zona inferior
    IF newLower THEN
      startidx = BarIndex
      n = n + 1
      $side[n] = -1
      $left[n] = BarIndex - 1
      $top[n] = bodyBot
      $bot[n] = low
      $right[n] = barindex + 1
      $broken[n] = 0
      $volume[n] = volume
      
      IF n > maxLevels THEN
       FOR k = 1 TO n - 1 DO
         $side[k] = $side[k+1]
         $left[k] = $left[k+1]
         $top[k] = $top[k+1]
         $bot[k] = $bot[k+1]
         $right[k] = $right[k+1]
         $broken[k] = $broken[k+1]
         $volume[k] = $volume[k+1]
       NEXT
       n = maxLevels
      ENDIF
    ENDIF
    
    //---------------------------------------------------
    // DIBUJO y GESTIÓN
    //---------------------------------------------------
    IF islastbarupdate THEN
      
      FOR i = 1 TO n DO
       for j=barindex-$right[i] downto 0 do
         IF $side[i] = 1 AND low[j] > $top[i] THEN
          $broken[i] = 1
          $right[i] = barindex[j]
          break
         ELSIF $side[i] = -1 AND high[j] < $bot[i] THEN
          $broken[i] = 1
          $right[i] = barindex[j]
          break
         ENDIF
       next
        
       vol=$volume[i]
        
       if $broken[i]=1 and $side[i]=1 then
         drawrectangle($left[i],$bot[i],$left[i]+2,$top[i])coloured("red")
         drawsegment($left[i],$top[i],$right[i],$top[i])coloured("grey",125)style(line,3)
       ELSIF $broken[i]=0 AND $side[i]=1 THEN
         leftX = $left[i]
         rightX = barindex
         topY  = $top[i]
         botY  = $bot[i]
         height = ABS(topY - botY)
         IF height > 0 THEN
          steps = 10
          stepH = height / steps
          DRAWRECTANGLE(leftX, topY, leftX + 2, botY) COLOURED(upR,upG,upB)
          FOR s = 0 TO steps - 1 DO
            segBot  = botY + stepH * s
            segTop  = segBot + stepH
            alphaVal = 30 + s * 12
            IF s = steps - 1 THEN
             alphaVal = 160
            ENDIF
            DRAWRECTANGLE(leftX, segTop, rightX, segBot) COLOURED(upR,upG,upB, 0)fillcolor(upR,upG,upB, alphaVal)
          NEXT
          midY = botY + height * 0.5
          DRAWTEXT("#vol#", rightX, midY)
         ENDIF
       elsif $broken[i]=1 and $side[i]=-1 then
         drawrectangle($left[i],$bot[i],$left[i]+2,$top[i])coloured("green")
         drawsegment($left[i],$bot[i],$right[i],$bot[i])coloured("grey",125)style(line,3)
       ELSIF $broken[i]=0 AND $side[i]=-1 THEN
         leftX = $left[i]
         rightX = barindex
         topY  = $top[i]
         botY  = $bot[i]
         height = ABS(topY - botY)
         IF height > 0 THEN
          steps = 10
          stepH = height / steps
          DRAWRECTANGLE(leftX, topY, leftX + 2, botY) COLOURED(dnR,dnG,dnB)
          FOR s = 0 TO steps - 1 DO
            segBot  = botY + stepH * s
            segTop  = segBot + stepH
            alphaVal = 160 - s * 12
            IF s = 0 THEN
             alphaVal = 160
            ENDIF
            DRAWRECTANGLE(leftX, segTop, rightX, segBot) COLOURED(dnR,dnG,dnB, 0)fillcolor(dnR,dnG,dnB, alphaVal)
          NEXT
          midY = botY + height * 0.5
          DRAWTEXT("#vol#", rightX, midY)
         ENDIF
       endif
      NEXT
    ENDIF
    
    RETURN
    


    #260002 quote
    Iván González
    Moderator
    Master

    aqui tienes.

    // Screener combinado: zonas de alerta
    // Dispara cuando Supply-Demand-CVD-Flow o Wick Pressure Zones
    // forman una zona nueva en el momento actual
    
    
    // === 1. Supply-Demand-CVD-Flow (ChartPrime) ===
    atrLen = 14
    momMult = 1.0
    myATR = averagetruerange[atrLen](close)
    
    brkBody = abs(close[1] - open[1])
    isDemand = 0
    isSupply = 0
    if barindex > 2 then
       if (close[2] < open[2]) and (close[1] > open[1]) and brkBody >= momMult * myATR[1] then
          isDemand = 1
       endif
       if (close[2] > open[2]) and (close[1] < open[1]) and brkBody >= momMult * myATR[1] then
          isSupply = 1
       endif
    endif
    
    // === 2. Wick Pressure Zones (BigBeluga) ===
    lookback = 200
    threshold = 80
    extendBars = 20
    rsiLen = 14
    
    bodyTop = max(open, close)
    bodyBot = min(open, close)
    denUp = max(bodyTop, 0.0000001)
    denLo = max(low, 0.0000001)
    upperWick = (high - bodyTop) / denUp
    lowerWick = (bodyBot - low) / denLo
    
    maxUpper = highest[lookback](upperWick)
    maxLower = highest[lookback](lowerWick)
    
    sizeUpWick = 0
    sizeLoWick = 0
    if maxUpper > 0 then
       sizeUpWick = floor((upperWick / maxUpper) * 100)
    endif
    if maxLower > 0 then
       sizeLoWick = floor((lowerWick / maxLower) * 100)
    endif
    
    myrsi = rsi[rsiLen](close)
    
    once startidx = -100000
    
    newUpper = 0
    newLower = 0
    if sizeUpWick >= threshold and sizeLoWick < threshold and myrsi > 50 and (barindex - startidx > extendBars) then
       newUpper = 1
       startidx = barindex
    endif
    if sizeLoWick >= threshold and sizeUpWick < threshold and myrsi < 50 and (barindex - startidx > extendBars) then
       newLower = 1
       startidx = barindex
    endif
    
    // === 3. Condicion combinada ===
    zoneFormed = isDemand or isSupply or newUpper or newLower
    
    // === 4. Tipo de zona detectada ===
    sType = 0
    if isDemand then
       sType = 1
    endif
    if isSupply then
       sType = -1
    endif
    if newLower then
       sType = 2
    endif
    if newUpper then
       sType = -2
    endif
    
    SCREENER[zoneFormed] (sType as "Zone Type")
    



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

Screener combinado de zonas de alerta Supply Demand


ProScreener: Buscadores de Mercado y Rastreo

New Reply
Author
author-avatar
NicoGB67 @nicogb67 Participant
Summary

This topic contains 1 reply,
has 2 voices, and was last updated by Iván González
1 week ago.

Topic Details
Forum: ProScreener: Buscadores de Mercado y Rastreo
Language: Spanish
Started: 04/09/2026
Status: Active
Attachments: No files
Logo Logo
Loading...