{"slug":"tradegate-vs-xetra-trading-hours","qid":"close_concentration","label":"Where one session's volume actually printed, by phase","post_title":"Tradegate vs Xetra: Hours and Prices","post_url":"/blog/tradegate-vs-xetra-trading-hours#q-close_concentration","columns":["phase","volume_millions","pct_of_day"],"rows":[{"phase":"premarket 04:00 to 09:30","volume_millions":3.34,"pct_of_day":5.7},{"phase":"first 30 minutes","volume_millions":5.02,"pct_of_day":8.57},{"phase":"midday 10:00 to 15:50","volume_millions":37.26,"pct_of_day":63.62},{"phase":"final 10 minutes","volume_millions":5.96,"pct_of_day":10.17},{"phase":"after hours 16:00 to 20:00","volume_millions":6.99,"pct_of_day":11.94}],"shape":"series","sql":"WITH\n    (\n        SELECT sum(volume)\n        FROM global_markets.delayed_stocks_minute_aggs\n        WHERE ticker = 'SPY'\n          AND window_start >= toDateTime('2026-06-10 08:00:00')\n          AND window_start <  toDateTime('2026-06-11 00:00:00')\n    ) AS day_volume,\n    (toHour(toTimeZone(window_start, 'America/New_York')) * 60\n     + toMinute(toTimeZone(window_start, 'America/New_York'))) AS et_minutes\nSELECT\n    multiIf(et_minutes < 570, 'premarket 04:00 to 09:30',\n            et_minutes < 600, 'first 30 minutes',\n            et_minutes < 950, 'midday 10:00 to 15:50',\n            et_minutes < 960, 'final 10 minutes',\n                              'after hours 16:00 to 20:00') AS phase,\n    round(sum(volume) / 1e6, 2)              AS volume_millions,\n    round(100 * sum(volume) / day_volume, 2) AS pct_of_day\nFROM global_markets.delayed_stocks_minute_aggs\nWHERE ticker = 'SPY'\n  AND window_start >= toDateTime('2026-06-10 08:00:00')\n  AND window_start <  toDateTime('2026-06-11 00:00:00')\nGROUP BY phase\nORDER BY min(et_minutes)","computed_at":"2026-09-27T15:08:19.061526+00:00","elapsed":0.004007075}