From 0615b58c9645670ae55a7e4452152f6974f781ae Mon Sep 17 00:00:00 2001 From: "vn.py" Date: Thu, 21 Dec 2023 14:47:25 +0800 Subject: [PATCH] [Mod] add TickTrade and TickBook object --- .flake8 | 2 +- CHANGELOG.md | 7 ++++- requirements.txt | 2 +- setup.cfg | 1 + vnpy/trader/event.py | 3 +++ vnpy/trader/object.py | 59 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 71 insertions(+), 3 deletions(-) diff --git a/.flake8 b/.flake8 index c8372ee..3801cfa 100644 --- a/.flake8 +++ b/.flake8 @@ -4,4 +4,4 @@ ignore = # line too long, fixed by black E501, # line break before binary operator - W503, + W503, \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 257efa4..b481e38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,8 @@ # 3.9.0 -1. First release of VeighNa Crypto \ No newline at end of file +## Framework + +1. First release of VeighNa Crypto as a fork of the original VeighNa project +2. Translate core and UI language from Chinese to English +3. Support only crypto exchanges for the Exchange enum +4. Remove unnecessary offset converter related data update and functions diff --git a/requirements.txt b/requirements.txt index daea6b5..f108268 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,4 +12,4 @@ pyzmq==23.2.1 plotly==5.10.0 importlib-metadata==4.12.0 tqdm==4.64.1 -backports.zoneinfo; python_version < '3.9' +sortedcontainers==2.4.0 diff --git a/setup.cfg b/setup.cfg index 907b308..883b35a 100644 --- a/setup.cfg +++ b/setup.cfg @@ -49,6 +49,7 @@ install_requires = pyzmq plotly tqdm + sortedcontainers [options.package_data] * = *.dll, *.so, *.pyd diff --git a/vnpy/trader/event.py b/vnpy/trader/event.py index 3af9cef..d4f1ed9 100644 --- a/vnpy/trader/event.py +++ b/vnpy/trader/event.py @@ -12,3 +12,6 @@ EVENT_QUOTE = "eQuote." EVENT_CONTRACT = "eContract." EVENT_LOG = "eLog" + +EVENT_TICK_BOOK = "eTickBook" +EVENT_TICK_TRADE = "eTickTrade" diff --git a/vnpy/trader/object.py b/vnpy/trader/object.py index f5b9446..7d3315f 100644 --- a/vnpy/trader/object.py +++ b/vnpy/trader/object.py @@ -6,8 +6,11 @@ from datetime import datetime from logging import INFO +from sortedcontainers import SortedDict + from .constant import Direction, Exchange, Interval, Offset, Status, Product, OptionType, OrderType + ACTIVE_STATUSES = set([Status.SUBMITTING, Status.NOTTRADED, Status.PARTTRADED]) @@ -421,3 +424,59 @@ def create_quote_data(self, quoteid: str, gateway_name: str) -> QuoteData: gateway_name=gateway_name, ) return quote + + +@dataclass +class TickTrade(BaseData): + """ + Detailed fill data of the market. + """ + + symbol: str + exchange: Exchange + price: float + volume: int + datetime: datetime + direction: Direction = None + + def __post_init__(self) -> None: + """""" + self.vt_symbol: str = f"{self.symbol}.{self.exchange.value}" + + +class TickBook: + """Order book with detailed market depth""" + + def __init__(self, vt_symbol: str) -> None: + """""" + self.vt_symbol: str = vt_symbol + + self.bid_book: SortedDict = SortedDict(lambda i: -i) + self.ask_book: SortedDict = SortedDict() + + self.sequence_id: int = 0 + + def update_bid(self, price: float, volume: float) -> None: + """Update bid data into the book""" + if volume: + self.bid_book[price] = volume + else: + self.bid_book.pop(price, None) + + def update_ask(self, price: float, volume: float) -> None: + """Update ask data into the book""" + if volume: + self.ask_book[price] = volume + else: + self.ask_book.pop(price, None) + + def update_sequence(self, sequence_id: int) -> None: + """Update sequence id of order book""" + self.sequence_id = sequence_id + + def clear(self) -> None: + """Clear all depth data""" + self.bid_book.clear() + self.ask_book.clear() + + self.sequence_id = 0