{"slug":"cup-and-handle-pattern-follow-through","qid":"volume_split","label":"volume_split","post_title":"cup-and-handle-pattern-follow-through","post_url":"/blog/lang/vi/cup-and-handle-pattern-follow-through#q-volume_split","columns":["volume_bucket","signal_count","hit_rate_pct","stopped_first_pct"],"rows":[{"volume_bucket":"Dưới 1x","signal_count":1329,"hit_rate_pct":31.3,"stopped_first_pct":39.9},{"volume_bucket":"1x đến 1,5x","signal_count":1230,"hit_rate_pct":33.8,"stopped_first_pct":41.1},{"volume_bucket":"1,5x đến 2x","signal_count":474,"hit_rate_pct":30.6,"stopped_first_pct":42.4},{"volume_bucket":"2x đến 3x","signal_count":357,"hit_rate_pct":35,"stopped_first_pct":34.2},{"volume_bucket":"Trên 3x","signal_count":242,"hit_rate_pct":36,"stopped_first_pct":22.3}],"shape":"ranking","sql":"WITH\n    universe AS\n    (\n        SELECT ticker\n        FROM global_markets.stocks_daily_aggs\n        WHERE date >= '2014-06-01'\n          AND ifNull(otc, 0) = 0\n          AND ticker NOT IN ('SPCX')\n        GROUP BY ticker\n        HAVING count() >= 250\n           AND avg(toFloat64(close) * volume) >= 2e7\n    ),\n    daily AS\n    (\n        SELECT\n            ticker,\n            date,\n            toFloat64(close)  AS close,\n            toFloat64(high)   AS high,\n            toFloat64(low)    AS low,\n            toFloat64(volume) AS volume\n        FROM global_markets.stocks_daily_aggs\n        WHERE date >= '2014-06-01'\n          AND ticker IN (SELECT ticker FROM universe)\n    ),\n    featured AS\n    (\n        SELECT\n            ticker,\n            date,\n            close,\n            volume,\n            max(high)   OVER cup    AS rim,\n            min(low)    OVER cup    AS cup_low,\n            max(high)   OVER handle AS handle_high,\n            min(low)    OVER handle AS handle_low,\n            avg(volume) OVER vol50  AS adv50,\n            lagInFrame(close, 120)  OVER trend AS base_start_close,\n            lagInFrame(close, 240)  OVER trend AS trend_start_close,\n            count()     OVER trend  AS history_bars\n        FROM daily\n        WINDOW\n            cup    AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 120 PRECEDING AND 11 PRECEDING),\n            handle AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 10 PRECEDING AND 1 PRECEDING),\n            vol50  AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 50 PRECEDING AND 1 PRECEDING),\n            trend  AS (PARTITION BY ticker ORDER BY date ROWS BETWEEN 240 PRECEDING AND CURRENT ROW)\n    ),\n    signals AS\n    (\n        SELECT\n            ticker,\n            date           AS breakout_date,\n            close          AS breakout_close,\n            handle_low     AS handle_low,\n            volume / adv50 AS rel_volume\n        FROM featured\n        WHERE history_bars = 241\n          AND date >= '2015-01-01'\n          AND date <= today() - 65\n          AND rim > 0\n          AND adv50 > 0\n          AND close >= 10\n          AND adv50 * close >= 1e8\n          AND close > rim\n          AND handle_high <= rim\n          AND handle_low > cup_low\n          AND (1 - cup_low / rim) >= 0.12\n          AND (1 - cup_low / rim) <= 0.50\n          AND (rim - handle_low) / rim <= 0.5 * (1 - cup_low / rim)\n          AND base_start_close >= 1.10 * trend_start_close\n    ),\n    paths AS\n    (\n        SELECT\n            s.rel_volume                                                             AS rel_volume,\n            min(if(b.low  <= s.handle_low,            b.date, toDate('2099-12-31'))) AS stop_date,\n            min(if(b.high >= s.breakout_close * 1.10, b.date, toDate('2099-12-31'))) AS hit_date\n        FROM daily AS b\n        INNER JOIN signals AS s ON s.ticker = b.ticker\n        WHERE b.date >  s.breakout_date\n          AND b.date <= s.breakout_date + 60\n        GROUP BY\n            s.ticker,\n            s.breakout_date,\n            s.breakout_close,\n            s.handle_low,\n            s.rel_volume\n    )\nSELECT\n    multiIf(rel_volume < 1,   'Dưới 1x',\n            rel_volume < 1.5, '1x đến 1,5x',\n            rel_volume < 2,   '1,5x đến 2x',\n            rel_volume < 3,   '2x đến 3x',\n                              'Trên 3x')                    AS volume_bucket,\n    count()                                                 AS signal_count,\n    round(100 * countIf(hit_date < stop_date) / count(), 1) AS hit_rate_pct,\n    round(100 * countIf(stop_date <= hit_date\n                        AND stop_date < toDate('2099-12-31')) / count(), 1) AS stopped_first_pct\nFROM paths\nGROUP BY volume_bucket\nORDER BY min(rel_volume)","computed_at":"2026-10-06T15:56:21.834307+00:00","elapsed":53.8255267}