#!/usr/bin/env python3 """같은 종목·같은 분에 키움 vs 한투 틱 밀도 (스톨 전).""" from __future__ import annotations import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[1] if str(ROOT) not in sys.path: sys.path.insert(0, str(ROOT)) from database import TradeDB from kis_trader.utils.env import get_env_from_db, get_env_int db = TradeDB() print("LIVE_TICK", get_env_from_db("LIVE_TICK_PROVIDER", "")) print("LIVE_OB", get_env_from_db("LIVE_OB_PROVIDER", "")) print("KW_MAX", get_env_from_db("KIWOOM_WS_MAX_SUBSCRIPTIONS", ""), "def", get_env_int("KIWOOM_WS_MAX_SUBSCRIPTIONS", 100)) print("SCOPE", get_env_from_db("WS_TICK_RECORD_SCOPE", "")) print("TICK_SELL", get_env_from_db("TICK_SELL_ENABLED", ""), "BO", get_env_from_db("BREAKOUT_TICK_SELL_ENABLED", "")) print("\n== 09:00~09:05 (매도 전) 겹치는 종목 틱수 ==") rows = db.conn.execute( """ SELECT code, SUM(source='kiwoom') n_kw, SUM(source='kis') n_kis FROM ws_ticks WHERE recv_ts >= %s AND recv_ts < %s AND source IN ('kiwoom','kis') GROUP BY code HAVING SUM(source='kiwoom') > 0 AND SUM(source='kis') > 0 ORDER BY SUM(source='kis') DESC LIMIT 15 """, ("2026-08-19 09:00:00", "2026-08-19 09:05:00"), ).fetchall() for r in rows: d = dict(r) kw = int(d["n_kw"] or 0) ki = int(d["n_kis"] or 0) d["kis_per_kw"] = round(ki / kw, 2) if kw else None print(d) print("\n== 025980 분별 틱수 09:00~09:20 ==") rows = db.conn.execute( """ SELECT DATE_FORMAT(recv_ts, '%%H:%%i') mm, SUM(source='kiwoom') n_kw, SUM(source='kis') n_kis FROM ws_ticks WHERE code=%s AND recv_ts >= %s AND recv_ts < %s AND source IN ('kiwoom','kis') GROUP BY DATE_FORMAT(recv_ts, '%%H:%%i') ORDER BY mm """, ("025980", "2026-08-19 09:00:00", "2026-08-19 09:20:00"), ).fetchall() for r in rows: print(dict(r)) print("\n== 같은 초 025980 09:04:50~09:05:06 (건강 구간) ==") rows = db.conn.execute( """ SELECT DATE_FORMAT(recv_ts, '%%H:%%i:%%s') ss, SUM(source='kiwoom') n_kw, SUM(source='kis') n_kis FROM ws_ticks WHERE code=%s AND recv_ts >= %s AND recv_ts <= %s AND source IN ('kiwoom','kis') GROUP BY DATE_FORMAT(recv_ts, '%%H:%%i:%%s') ORDER BY ss """, ("025980", "2026-08-19 09:04:50", "2026-08-19 09:05:06"), ).fetchall() for r in rows: print(dict(r)) print("\n== 09:00~09:35 distinct 종목: 키움만 / 한투만 / 둘다 ==") r = db.conn.execute( """ SELECT COUNT(DISTINCT CASE WHEN source='kiwoom' THEN code END) kw, COUNT(DISTINCT CASE WHEN source='kis' THEN code END) kis, COUNT(DISTINCT code) either FROM ws_ticks WHERE recv_ts >= %s AND recv_ts < %s AND source IN ('kiwoom','kis') """, ("2026-08-19 09:00:00", "2026-08-19 09:35:00"), ).fetchone() print(dict(r)) only = db.conn.execute( """ SELECT SUM(srcs='kis') only_kis, SUM(srcs='kiwoom') only_kw, SUM(srcs='both') both_n FROM ( SELECT code, CASE WHEN SUM(source='kis')>0 AND SUM(source='kiwoom')>0 THEN 'both' WHEN SUM(source='kis')>0 THEN 'kis' ELSE 'kiwoom' END srcs FROM ws_ticks WHERE recv_ts >= %s AND recv_ts < %s AND source IN ('kiwoom','kis') GROUP BY code ) z """, ("2026-08-19 09:00:00", "2026-08-19 09:35:00"), ).fetchone() print(dict(only))