//@version=5 indicator("Block of Candles (BoC) - FULLY FIXED ALL TF", shorttitle="BoC Pro", overlay=false, max_boxes_count=500, max_labels_count=50) // ══════════════════════════════════════════════════════════════════════════════ // INPUT PARAMETERS // ══════════════════════════════════════════════════════════════════════════════ colorBullish = input.color(color.new(color.green, 0), "Bullish Candle Color", group="Colors") colorBearish = input.color(color.new(color.red, 0), "Bearish Candle Color", group="Colors") colorWick = input.color(color.new(color.gray, 0), "Wick Color", group="Colors") showCandleCount = input.bool(true, "Show Current Block Candle Count", group="Colors") resetMode = input.string("None", "Reference Candle Reset Mode", options=["None", "Daily", "Weekly", "Monthly", "Session", "Custom Hours"], tooltip="Automatically reset reference candle at specified intervals", group="Reset") customResetHours = input.int(4, "Custom Reset Hours", minval=1, maxval=168, group="Reset") sessionResetHour = input.int(8, "Session Reset Hour (UTC)", minval=0, maxval=23, group="Reset") showMitigationZones = input.bool(true, "Show Closed Block Zones", group="Mitigation Zones") maxZonesToShow = input.int(20, "Max Zones to Display", minval=1, maxval=100, group="Mitigation Zones") zoneBullishColor = input.color(color.new(color.green, 85), "Bullish Zone Color", group="Mitigation Zones") zoneBearishColor = input.color(color.new(color.red, 85), "Bearish Zone Color", group="Mitigation Zones") showZoneLabels = input.bool(true, "Show Zone Labels (# candles)", group="Mitigation Zones") extendZonesRight = input.bool(true, "Extend Zones to Right", group="Mitigation Zones") enableMTF = input.bool(false, "Enable Multi-Timeframe BoC", group="Multi-Timeframe") mtfTimeframe = input.timeframe("240", "Higher Timeframe", group="Multi-Timeframe") mtfCandleColor = input.color(color.new(color.orange, 30), "MTF Candle Color", group="Multi-Timeframe") showStats = input.bool(true, "Show Statistics Table", group="Statistics") statsPosition = input.string("Top Right", "Table Position", options=["Top Left", "Top Center", "Top Right", "Middle Left", "Middle Center", "Middle Right", "Bottom Left", "Bottom Center", "Bottom Right"], group="Statistics") alertOnBlockClose = input.bool(false, "Alert on Any Block Close", group="Alerts") alertOnBullishBreak = input.bool(false, "Alert on Bullish Breakout Only", group="Alerts") alertOnBearishBreak = input.bool(false, "Alert on Bearish Breakout Only", group="Alerts") alertOnLongBlock = input.bool(false, "Alert on Long Block (>X candles)", group="Alerts") longBlockThreshold = input.int(20, "Long Block Threshold", minval=5, group="Alerts") filterEnabled = input.bool(false, "Enable Block Quality Filtering", group="Filters") minCandlesInBlock = input.int(3, "Min Candles per Block", minval=1, group="Filters") minBlockRangePercent = input.float(0.1, "Min Block Range (%)", minval=0.01, step=0.05, group="Filters") filterByVolume = input.bool(false, "Filter by Volume Spike", group="Filters") volumeSpikeMultiplier = input.float(1.5, "Volume Spike Multiplier", minval=1.0, step=0.1, group="Filters") // ══════════════════════════════════════════════════════════════════════════════ // STATE VARIABLES // ══════════════════════════════════════════════════════════════════════════════ var float ref_open = na var float ref_high = na var float ref_low = na var float ref_close = na var float indicator_open = na var float indicator_high = na var float indicator_low = na var float indicator_close = na var int blockCandleCount = 0 var float blockTotalVolume = 0.0 var bool isInitialized = false var int g_lastResetTime = 0 var int blockStartBar = 0 var array closedBlockBoxes = array.new() var array