{"slug":"trade-markouts-explained","qid":"markout_by_size","label":"The same curve, split by print size: small fills against blocks","post_title":"Trade Markouts Explained: Execution Quality","post_url":"/blog/trade-markouts-explained#q-markout_by_size","columns":["horizon","small_fill_bps","block_fill_bps","block_fill_count"],"rows":[{"horizon":"1 sec","small_fill_bps":3.073,"block_fill_bps":2.651,"block_fill_count":11604},{"horizon":"5 sec","small_fill_bps":2.86,"block_fill_bps":2.518,"block_fill_count":11592},{"horizon":"15 sec","small_fill_bps":2.779,"block_fill_bps":2.686,"block_fill_count":11596},{"horizon":"1 min","small_fill_bps":3.81,"block_fill_bps":3.445,"block_fill_count":11594},{"horizon":"5 min","small_fill_bps":2.983,"block_fill_bps":2.495,"block_fill_count":11588}],"shape":"ranking","sql":"WITH\n    mid_by_second AS\n    (\n        SELECT\n            dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,\n            argMax((toFloat64(bid_price) + toFloat64(ask_price)) / 2, sip_timestamp)    AS mid\n        FROM global_markets.cache_stocks_quotes\n        WHERE ticker = 'INTC'\n          AND sip_timestamp >= toDateTime('2026-06-10 13:30:00', 'UTC')\n          AND sip_timestamp <  toDateTime('2026-06-10 20:00:00', 'UTC')\n          AND bid_price > 0\n          AND ask_price > bid_price\n        GROUP BY sec\n    ),\n    signed_fills AS\n    (\n        SELECT\n            t.sec        AS sec,\n            t.fill_size  AS fill_size,\n            q.mid        AS ref_mid,\n            if(t.fill_price > q.mid, 1, -1) AS side\n        FROM\n        (\n            SELECT\n                dateDiff('second', toDateTime('2026-06-10 13:30:00', 'UTC'), sip_timestamp) AS sec,\n                sec - 1          AS ref_sec,\n                toFloat64(price) AS fill_price,\n                size             AS fill_size\n            FROM global_markets.stocks_trades\n            WHERE ticker = 'INTC'\n              AND sip_timestamp >= toDateTime('2026-06-10 13:30:01', 'UTC')\n              AND sip_timestamp <  toDateTime('2026-06-10 19:55:00', 'UTC')\n              AND price > 0\n              AND size > 0\n        ) AS t\n        INNER JOIN mid_by_second AS q ON q.sec = t.ref_sec\n        WHERE t.fill_price != q.mid\n    )\nSELECT\n    multiIf(f.horizon_s < 60,\n            concat(toString(f.horizon_s), ' sec'),\n            concat(toString(intDiv(f.horizon_s, 60)), ' min'))                                   AS horizon,\n    round(avgIf(f.side * (fut.mid - f.ref_mid) / f.ref_mid, f.fill_size < 1000) * 10000, 3)       AS small_fill_bps,\n    round(avgIf(f.side * (fut.mid - f.ref_mid) / f.ref_mid, f.fill_size >= 1000) * 10000, 3)      AS block_fill_bps,\n    countIf(f.fill_size >= 1000)                                                                 AS block_fill_count\nFROM\n(\n    SELECT\n        sec,\n        fill_size,\n        ref_mid,\n        side,\n        horizon_s,\n        sec + horizon_s AS future_sec\n    FROM signed_fills\n    ARRAY JOIN [1, 5, 15, 60, 300] AS horizon_s\n) AS f\nINNER JOIN mid_by_second AS fut ON fut.sec = f.future_sec\nGROUP BY f.horizon_s\nHAVING countIf(f.fill_size < 1000) > 0\n   AND countIf(f.fill_size >= 1000) > 0\nORDER BY f.horizon_s","computed_at":"2026-08-15T16:21:16.644959+00:00","elapsed":0.005555912}