18
18
from vnpy .trader .database import (
19
19
BaseDatabase ,
20
20
BarOverview ,
21
+ TickOverview ,
21
22
DB_TZ ,
22
23
convert_tz
23
24
)
@@ -128,14 +129,30 @@ class Meta:
128
129
indexes = ((("symbol" , "exchange" , "interval" ), True ),)
129
130
130
131
132
+ class DbTickOverview (Model ):
133
+ """Tick汇总数据表映射对象"""
134
+
135
+ id : AutoField = AutoField ()
136
+
137
+ symbol : str = CharField ()
138
+ exchange : str = CharField ()
139
+ count : int = IntegerField ()
140
+ start : datetime = DateTimeField ()
141
+ end : datetime = DateTimeField ()
142
+
143
+ class Meta :
144
+ database : PeeweePostgresqlDatabase = db
145
+ indexes : tuple = ((("symbol" , "exchange" ), True ),)
146
+
147
+
131
148
class PostgresqlDatabase (BaseDatabase ):
132
149
"""PostgreSQL数据库接口"""
133
150
134
151
def __init__ (self ) -> None :
135
152
""""""
136
153
self .db = db
137
154
self .db .connect ()
138
- self .db .create_tables ([DbBarData , DbTickData , DbBarOverview ])
155
+ self .db .create_tables ([DbBarData , DbTickData , DbBarOverview , DbTickOverview ])
139
156
140
157
def save_bar_data (self , bars : List [BarData ]) -> bool :
141
158
"""保存K线数据"""
@@ -203,6 +220,11 @@ def save_bar_data(self, bars: List[BarData]) -> bool:
203
220
204
221
def save_tick_data (self , ticks : List [TickData ]) -> bool :
205
222
"""保存TICK数据"""
223
+ # 读取主键参数
224
+ tick : TickData = ticks [0 ]
225
+ symbol : str = tick .symbol
226
+ exchange : Exchange = tick .exchange
227
+
206
228
# 将TickData数据转换为字典,并调整时区
207
229
data = []
208
230
@@ -227,6 +249,31 @@ def save_tick_data(self, ticks: List[TickData]) -> bool:
227
249
),
228
250
).execute ()
229
251
252
+ # 更新Tick汇总数据
253
+ overview : DbTickOverview = DbTickOverview .get_or_none (
254
+ DbTickOverview .symbol == symbol ,
255
+ DbTickOverview .exchange == exchange .value ,
256
+ )
257
+
258
+ if not overview :
259
+ overview : DbTickOverview = DbTickOverview ()
260
+ overview .symbol = symbol
261
+ overview .exchange = exchange .value
262
+ overview .start = ticks [0 ].datetime
263
+ overview .end = ticks [- 1 ].datetime
264
+ overview .count = len (ticks )
265
+ else :
266
+ overview .start = min (ticks [0 ].datetime , overview .start )
267
+ overview .end = max (ticks [- 1 ].datetime , overview .end )
268
+
269
+ s : ModelSelect = DbTickData .select ().where (
270
+ (DbTickData .symbol == symbol )
271
+ & (DbTickData .exchange == exchange .value )
272
+ )
273
+ overview .count = s .count ()
274
+
275
+ overview .save ()
276
+
230
277
return True
231
278
232
279
def load_bar_data (
@@ -364,6 +411,14 @@ def delete_tick_data(
364
411
& (DbTickData .exchange == exchange .value )
365
412
)
366
413
count = d .execute ()
414
+
415
+ # 删除Tick汇总数据
416
+ d2 : ModelDelete = DbTickOverview .delete ().where (
417
+ (DbTickOverview .symbol == symbol )
418
+ & (DbTickOverview .exchange == exchange .value )
419
+ )
420
+ d2 .execute ()
421
+
367
422
return count
368
423
369
424
def get_bar_overview (self ) -> List [BarOverview ]:
@@ -382,6 +437,15 @@ def get_bar_overview(self) -> List[BarOverview]:
382
437
overviews .append (overview )
383
438
return overviews
384
439
440
+ def get_tick_overview (self ) -> List [TickOverview ]:
441
+ """查询数据库中的Tick汇总信息"""
442
+ s : ModelSelect = DbTickOverview .select ()
443
+ overviews : list = []
444
+ for overview in s :
445
+ overview .exchange = Exchange (overview .exchange )
446
+ overviews .append (overview )
447
+ return overviews
448
+
385
449
def init_bar_overview (self ) -> None :
386
450
"""初始化数据库中的K线汇总信息"""
387
451
s : ModelSelect = (
0 commit comments