def coarse_selection(self, coarse):
	        def ok(c):
            if not c.HasFundamentalData: return False
            if c.Price is None or c.Price <= px_min: return False
            # Prefer coarse DollarVolume if available; fall back to Price*Volume if needed
            dv = getattr(c, 'DollarVolume', None)
            if dv is None or dv <= 0:
                if c.Volume is None: return False
                dv = c.Price * c.Volume
            if dv <= dv_min: return False
            sv = c.Symbol.Value
            if ' ' in sv: return False
            return True

        filtered = (c for c in coarse if ok(c))