[Add] vnpy/trader/database.py for database connection
This commit is contained in:
parent
758d252681
commit
9d5866e997
239
vnpy/trader/database.py
Normal file
239
vnpy/trader/database.py
Normal file
@ -0,0 +1,239 @@
|
||||
""""""
|
||||
|
||||
from peewee import (
|
||||
SqliteDatabase,
|
||||
Model,
|
||||
CharField,
|
||||
DateTimeField,
|
||||
FloatField,
|
||||
IntegerField
|
||||
)
|
||||
|
||||
from .utility import get_temp_path
|
||||
from .object import BarData, TickData
|
||||
from .constant import Exchange, Interval
|
||||
|
||||
DB_NAME = "database.vt"
|
||||
DB = SqliteDatabase(str(get_temp_path(DB_NAME)))
|
||||
|
||||
|
||||
class DbBarData(Model):
|
||||
"""
|
||||
Candlestick bar data for database storage.
|
||||
|
||||
Index is defined unique with vt_symbol, interval and datetime.
|
||||
"""
|
||||
symbol = CharField()
|
||||
exchange = CharField()
|
||||
datetime = DateTimeField()
|
||||
interval = CharField()
|
||||
|
||||
volume = FloatField()
|
||||
open_price = FloatField()
|
||||
high_price = FloatField()
|
||||
low_price = FloatField()
|
||||
close_price = FloatField()
|
||||
|
||||
vt_symbol = CharField()
|
||||
gateway_name = CharField()
|
||||
|
||||
class Meta:
|
||||
database = DB
|
||||
indexes = ((('vt_symbol', 'interval', 'datetime'), True),)
|
||||
|
||||
@staticmethod
|
||||
def from_bar(bar: BarData):
|
||||
"""
|
||||
Generate DbBarData object from BarData.
|
||||
"""
|
||||
db_bar = DbBarData()
|
||||
|
||||
db_bar.symbol = bar.symbol
|
||||
db_bar.exchange = bar.exchange.value
|
||||
db_bar.datetime = bar.datetime
|
||||
db_bar.interval = bar.interval
|
||||
db_bar.volume = bar.volume
|
||||
db_bar.open_price = bar.open_price
|
||||
db_bar.high_price = bar.high_price
|
||||
db_bar.low_price = bar.low_price
|
||||
db_bar.close_price = bar.close_price
|
||||
db_bar.vt_symbol = bar.vt_symbol
|
||||
db_bar.gateway_name = "DB"
|
||||
|
||||
return db_bar
|
||||
|
||||
def to_bar(self):
|
||||
"""
|
||||
Generate BarData object from DbBarData.
|
||||
"""
|
||||
bar = BarData(
|
||||
symbol=self.symbol,
|
||||
exchange=Exchange(self.exchange),
|
||||
datetime=self.datetime,
|
||||
interval=Interval(self.interval),
|
||||
volume=self.volume,
|
||||
open_price=open_price,
|
||||
high_price=high_price,
|
||||
low_price=low_price,
|
||||
close_price=close_price,
|
||||
gateway_name=self.gateway_name
|
||||
)
|
||||
return bar
|
||||
|
||||
|
||||
class DbTickData(Model):
|
||||
"""
|
||||
Tick data for database storage.
|
||||
|
||||
Index is defined unique with vt_symbol, interval and datetime.
|
||||
"""
|
||||
symbol = CharField()
|
||||
exchange = CharField()
|
||||
datetime = DateTimeField()
|
||||
|
||||
name = CharField()
|
||||
volume = FloatField()
|
||||
last_price = FloatField()
|
||||
last_volume = FloatField()
|
||||
limit_up = FloatField()
|
||||
limit_down = FloatField()
|
||||
|
||||
open_price = FloatField()
|
||||
high_price = FloatField()
|
||||
low_price = FloatField()
|
||||
close_price = FloatField()
|
||||
|
||||
bid_price_1 = FloatField()
|
||||
bid_price_2 = FloatField()
|
||||
bid_price_3 = FloatField()
|
||||
bid_price_4 = FloatField()
|
||||
bid_price_5 = FloatField()
|
||||
|
||||
ask_price_1 = FloatField()
|
||||
ask_price_2 = FloatField()
|
||||
ask_price_3 = FloatField()
|
||||
ask_price_4 = FloatField()
|
||||
ask_price_5 = FloatField()
|
||||
|
||||
bid_volume_1 = FloatField()
|
||||
bid_volume_2 = FloatField()
|
||||
bid_volume_3 = FloatField()
|
||||
bid_volume_4 = FloatField()
|
||||
bid_volume_5 = FloatField()
|
||||
|
||||
ask_volume_1 = FloatField()
|
||||
ask_volume_2 = FloatField()
|
||||
ask_volume_3 = FloatField()
|
||||
ask_volume_4 = FloatField()
|
||||
ask_volume_5 = FloatField()
|
||||
|
||||
vt_symbol = CharField()
|
||||
gateway_name = CharField()
|
||||
|
||||
class Meta:
|
||||
database = DB
|
||||
indexes = ((('vt_symbol', 'datetime'), True),)
|
||||
|
||||
@staticmethod
|
||||
def from_tick(tick: TickData):
|
||||
"""
|
||||
Generate DbTickData object from TickData.
|
||||
"""
|
||||
db_tick = DbTickData()
|
||||
|
||||
db_tick.symbol = tick.symbol
|
||||
db_tick.exchange = tick.exchange.value
|
||||
db_tick.datetime = tick.datetime
|
||||
db_tick.name = tick.name
|
||||
db_tick.volume = tick.volume
|
||||
db_tick.last_price = tick.last_price
|
||||
db_tick.last_volume = tick.last_volume
|
||||
db_tick.limit_up = tick.limit_up
|
||||
db_tick.limit_down = tick.limit_down
|
||||
db_tick.open_price = tick.open_price
|
||||
db_tick.high_price = tick.high_price
|
||||
db_tick.low_price = tick.low_price
|
||||
db_tick.pre_close = tick.pre_close
|
||||
|
||||
db_tick.bid_price_1 = tick.bid_price_1
|
||||
db_tick.ask_price_1 = tick.ask_price_1
|
||||
db_tick.bid_volume_1 = tick.bid_volume_1
|
||||
db_tick.ask_volume_1 = tick.ask_volume_1
|
||||
|
||||
if tick.bid_price_2:
|
||||
db_tick.bid_price_2 = tick.bid_price_2
|
||||
db_tick.bid_price_3 = tick.bid_price_3
|
||||
db_tick.bid_price_4 = tick.bid_price_4
|
||||
db_tick.bid_price_5 = tick.bid_price_5
|
||||
|
||||
db_tick.ask_price_2 = tick.ask_price_2
|
||||
db_tick.ask_price_3 = tick.ask_price_3
|
||||
db_tick.ask_price_4 = tick.ask_price_4
|
||||
db_tick.ask_price_5 = tick.ask_price_5
|
||||
|
||||
db_tick.bid_volume_2 = tick.bid_volume_2
|
||||
db_tick.bid_volume_3 = tick.bid_volume_3
|
||||
db_tick.bid_volume_4 = tick.bid_volume_4
|
||||
db_tick.bid_volume_5 = tick.bid_volume_5
|
||||
|
||||
db_tick.ask_volume_2 = tick.ask_volume_2
|
||||
db_tick.ask_volume_3 = tick.ask_volume_3
|
||||
db_tick.ask_volume_4 = tick.ask_volume_4
|
||||
db_tick.ask_volume_5 = tick.ask_volume_5
|
||||
|
||||
db_tick.vt_symbol = tick.vt_symbol
|
||||
db_tick.gateway_name = "DB"
|
||||
|
||||
return tick
|
||||
|
||||
def to_tick(self):
|
||||
"""
|
||||
Generate TickData object from DbTickData.
|
||||
"""
|
||||
tick = TickData(
|
||||
symbol=self.symbol,
|
||||
exchange=Exchange(self.exchange),
|
||||
datetime=self.datetime,
|
||||
name=self.name,
|
||||
volume=self.volume,
|
||||
last_price=self.last_price,
|
||||
last_volume=self.last_volume,
|
||||
limit_up=self.limit_up,
|
||||
limit_down=self.limit_down,
|
||||
open_price=self.open_price,
|
||||
high_price=self.high_price,
|
||||
low_price=self.low_price,
|
||||
pre_close=self.pre_close,
|
||||
bid_price_1=self.bid_price_1,
|
||||
ask_price_1=self.ask_price_1,
|
||||
bid_volume_1=self.bid_volume_1,
|
||||
ask_volume_1=self.ask_volume_1,
|
||||
gateway_name=self.gateway_name
|
||||
)
|
||||
|
||||
if self.bid_price_2:
|
||||
tick.bid_price_2 = self.bid_price_2
|
||||
tick.bid_price_3 = self.bid_price_3
|
||||
tick.bid_price_4 = self.bid_price_4
|
||||
tick.bid_price_5 = self.bid_price_5
|
||||
|
||||
tick.ask_price_2 = self.ask_price_2
|
||||
tick.ask_price_3 = self.ask_price_3
|
||||
tick.ask_price_4 = self.ask_price_4
|
||||
tick.ask_price_5 = self.ask_price_5
|
||||
|
||||
tick.bid_volume_2 = self.bid_volume_2
|
||||
tick.bid_volume_3 = self.bid_volume_3
|
||||
tick.bid_volume_4 = self.bid_volume_4
|
||||
tick.bid_volume_5 = self.bid_volume_5
|
||||
|
||||
tick.ask_volume_2 = self.ask_volume_2
|
||||
tick.ask_volume_3 = self.ask_volume_3
|
||||
tick.ask_volume_4 = self.ask_volume_4
|
||||
tick.ask_volume_5 = self.ask_volume_5
|
||||
|
||||
return tick
|
||||
|
||||
|
||||
DB.connect()
|
||||
DB.create_tables([DbBarData, DbTickData])
|
Loading…
Reference in New Issue
Block a user