接收到tick数据,合成成实时1分钟的K线。
不是1分钟K线来一根,而是在1分钟内,最后一根K线的 H、L、C 在不断变化。
用 insert into 同时 on duplicate key,就能解决这个问题。
MySQL
sql = """INSERT INTO {TABLE_NAME} ({time_col_name}, `code`, `open`, `high`, `low`, `close`, `volume`) VALUES
('{RT_TIME}', '{code}', {open}, {high}, {low}, {close}, {volume})
ON DUPLICATE KEY UPDATE `high` = IF (`high` > {high},`high`,{high}),
`low` = IF (`low` < {low},`low`, {low}), `close` = {close}, `volume` = {volume};
""".format(**format_data)
主键要设置为 (time, code),这两个字段作为联合PK。
PostgreSQL
sql = """INSERT INTO {TABLE_NAME} (trade_date, ticker, open, high, low, close) VALUES
('{RT_TIME}', '{ticker}', {open}, {high}, {low}, {close})
ON CONFLICT (trade_date, ticker) DO UPDATE
SET
high = case when {TABLE_NAME}.high < excluded.high then excluded.high
when {TABLE_NAME}.high >= excluded.high then {TABLE_NAME}.high end,
low = case when {TABLE_NAME}.low > excluded.low then excluded.low
when {TABLE_NAME}.low <= excluded.low then {TABLE_NAME}.low end,
close = {close};""".format(**format_data)
如此啰嗦,因为暂时不会PG的IF函数……
还有类似于接入实时行情截面(快照)数据的需求,也可以用这个功能。
大概是这样,没测试,盲写的,见谅。
INSERT INTO t_quote (col_1, col_2) values ('601318.SH', 86.24), ('600519.SH', 1988.30)
ON DUPLICATE KEY UPDATE col_1 = values(col_1), col_2 = valeus(col_2);