instrument { name = 'Liquid FVG LSMA - BRYAN IN$IDER', icon = 'indicators:BelkhayateTiming', overlay = true } lookback_break = input(20, "Lookback topo/fundo", input.integer) fvg_lookback = input(10, "Lookback FVG", input.integer) use_fvg = input(true, "Usar FVG", input.boolean) use_gap = input(true, "Usar gap interno", input.boolean) lsma_period = input(9, "Perodo LSMA (Open)", input.integer) prox_pct = input(0.05, "Proximidade (%) para pr-sinal", input.double) arrow_up_color = input { default = "#00FF6A", type = input.color } arrow_down_color = input { default = "#FF3B30", type = input.color } -- Funes auxiliares local function highest_in_range(src, len, start_shift) local maxv = src[start_shift] for i = start_shift, start_shift + len - 1 do if src[i] and src[i] > maxv then maxv = src[i] end end return maxv end local function lowest_in_range(src, len, start_shift) local minv = src[start_shift] for i = start_shift, start_shift + len - 1 do if src[i] and src[i] < minv then minv = src[i] end end return minv end local function fvg_up_at(i) return low[i] and high[i+2] and (low[i] > high[i+2]) end local function fvg_down_at(i) return high[i] and low[i+2] and (high[i] < low[i+2]) end local function fvg_up_recent(w) for i=1,w do if fvg_up_at(i) then return true end end return false end local function fvg_down_recent(w) for i=1,w do if fvg_down_at(i) then return true end end return false end local function gap_up_now() return open[0] and close[1] and (open[0] > close[1]) end local function gap_down_now() return open[0] and close[1] and (open[0] < close[1]) end -- LSMA local function lsma(src, period, shift) if not src[shift] then return nil end local sumX,sumY,sumXY,sumX2=0,0,0,0 for i=0,period-1 do if not src[i+shift] then return nil end sumX=sumX+(i+1) sumY=sumY+src[i+shift] sumXY=sumXY+(i+1)*src[i+shift] sumX2=sumX2+(i+1)*(i+1) end local slope=(period*sumXY - sumX*sumY)/(period*sumX2 - sumX*sumX) local intercept=(sumY - slope*sumX)/period return slope*period + intercept end lsma_val = lsma(open, lsma_period, 0) -- Lgica local recent_high = highest_in_range(high, lookback_break, 1) local recent_low = lowest_in_range(low, lookback_break, 1) local dist_top = (recent_high - open[0]) / recent_high local dist_bot = (open[0] - recent_low) / recent_low local cond_up = dist_top <= prox_pct and (not use_fvg or fvg_up_recent(fvg_lookback)) and (not use_gap or gap_up_now()) local cond_dn = dist_bot <= prox_pct and (not use_fvg or fvg_down_recent(fvg_lookback)) and (not use_gap or gap_down_now()) local break_up = high[0] and (high[0] > recent_high) local break_down = low[0] and (low[0] < recent_low) plot_shape(cond_up and break_up, 'Buy', shape_style.arrowup, shape_size.normal, arrow_up_color, shape_location.belowbar) plot_shape(cond_dn and break_down, 'Sell', shape_style.arrowdown, shape_size.normal, arrow_down_color, shape_location.abovebar) if lsma_val then plot(lsma_val, "LSMA Open", "orange", 2) end