Screener combinado de zonas de alerta Supply Demand

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

    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
    Legend

    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.
ProRealAI ProRealAI New

Stuck on this ProBuilder code?

Describe what this topic is trying to build, in plain English, and ProRealAI writes the ProRealTime™ indicator, screener or system for you.

Available in 7 languages
Try ProRealAI

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
5 months, 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...