hyperquant 0.45__py3-none-any.whl → 0.46__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -697,8 +697,9 @@ class SpotBook(DataStore):
|
|
697
697
|
# super().__init__()
|
698
698
|
self._time: int | None = None
|
699
699
|
self.limit = 1
|
700
|
-
self.loss =
|
701
|
-
self.
|
700
|
+
self.loss = {} # 改为字典,按symbol跟踪
|
701
|
+
self.versions = {}
|
702
|
+
self.cache = []
|
702
703
|
|
703
704
|
def _onresponse(self, data: dict[str, Any]):
|
704
705
|
data = data.get("data")
|
@@ -706,18 +707,22 @@ class SpotBook(DataStore):
|
|
706
707
|
book_data = data.get("data")
|
707
708
|
asks = book_data.get("asks", [])
|
708
709
|
bids = book_data.get("bids", [])
|
709
|
-
version = int(data.get("version",
|
710
|
+
version = int(data.get("version", None))
|
711
|
+
|
710
712
|
|
711
713
|
# 保存当前快照版本
|
712
|
-
self.
|
713
|
-
|
714
|
-
# 应用缓存的增量(只保留连续的部分)
|
715
|
-
items: list = self.find({"s": symbol})
|
714
|
+
self.versions[symbol] = version
|
715
|
+
|
716
|
+
# # 应用缓存的增量(只保留连续的部分)
|
717
|
+
# items: list = self.find({"s": symbol})
|
718
|
+
# items.sort(key=lambda x: x.get("fv", 0)) # 按 fromVersion 排序
|
719
|
+
# self._find_and_delete({"s": symbol})
|
720
|
+
|
721
|
+
# 处理缓存
|
722
|
+
items = [item for item in self.cache if item.get("s") == symbol]
|
716
723
|
items.sort(key=lambda x: x.get("fv", 0)) # 按 fromVersion 排序
|
724
|
+
self.cache = [item for item in self.cache if item.get("s") != symbol]
|
717
725
|
|
718
|
-
# 清空旧数据,插入快照
|
719
|
-
self._find_and_delete({"s": symbol})
|
720
|
-
|
721
726
|
for side, S in ((asks, "a"), (bids, "b")):
|
722
727
|
for item in side:
|
723
728
|
self._insert([{"s": symbol, "S": S, "p": item["p"], "q": item["q"]}])
|
@@ -725,57 +730,77 @@ class SpotBook(DataStore):
|
|
725
730
|
if items:
|
726
731
|
min_version = min(item.get("fv", 0) for item in items)
|
727
732
|
max_version = max(item.get("tv", 0) for item in items)
|
728
|
-
self.version = max_version
|
733
|
+
# self.version = max_version
|
734
|
+
self.versions[symbol] = max_version
|
729
735
|
|
730
|
-
if
|
731
|
-
|
736
|
+
# if max_version == 0:
|
737
|
+
# print('vvv---')
|
738
|
+
# print(items)
|
739
|
+
|
740
|
+
if not (min_version <= self.versions[symbol] <= max_version):
|
741
|
+
self.loss[symbol] = True
|
732
742
|
logger.warning(f"SpotBook: Snapshot version {self.version} out of range ({min_version}, {max_version}) for symbol={symbol} (丢补丁)")
|
733
743
|
return
|
734
|
-
|
735
|
-
|
744
|
+
|
745
|
+
# 处理过往msg内容
|
746
|
+
self.loss[symbol] = False
|
736
747
|
for item in items:
|
737
748
|
fv, tv = item.get("fv", 0), item.get("tv", 0)
|
738
|
-
if self.
|
739
|
-
|
749
|
+
if self.versions[symbol] <= tv and self.versions[symbol] >= fv:
|
750
|
+
if float(item["q"]) == 0.0:
|
751
|
+
self._find_and_delete({"s": symbol, "S": item["S"], "p": item["p"]})
|
752
|
+
else:
|
753
|
+
self._insert([{ "s": symbol, "S": item["S"], "p": item["p"], "q": item["q"]}])
|
754
|
+
|
755
|
+
sort_data = self.sorted({'s': symbol}, self.limit)
|
756
|
+
asks = sort_data.get('a', [])
|
757
|
+
bids = sort_data.get('b', [])
|
758
|
+
self._find_and_delete({'s': symbol})
|
759
|
+
self._update(asks + bids)
|
760
|
+
|
740
761
|
else:
|
741
|
-
self.loss = False
|
762
|
+
self.loss[symbol] = False
|
742
763
|
|
743
764
|
|
744
765
|
def _on_message(self, msg: dict[str, Any]) -> None:
|
745
766
|
|
746
|
-
ts = time.time() * 1000 # 预留时间戳(如需记录可用)
|
767
|
+
# ts = time.time() * 1000 # 预留时间戳(如需记录可用)
|
747
768
|
data = msg.get("d", {}) or {}
|
748
769
|
symbol = msg.get("s")
|
749
770
|
fv = int(data.get("fromVersion"))
|
750
771
|
tv = int(data.get("toVersion"))
|
772
|
+
if fv == 0 or tv == 0:
|
773
|
+
# print(f'发现fv或tv为0, msg:\n {msg}')
|
774
|
+
return
|
775
|
+
|
751
776
|
asks: list = data.get("asks", []) or []
|
752
777
|
bids: list = data.get("bids", []) or []
|
753
778
|
|
779
|
+
now_version = self.versions.get(symbol, None)
|
780
|
+
|
754
781
|
# 以下几张情况都会被认为正常
|
755
782
|
check_con = (
|
756
|
-
|
757
|
-
fv <=
|
758
|
-
|
783
|
+
now_version is None or
|
784
|
+
fv <= now_version <= tv or
|
785
|
+
now_version + 1 == fv
|
759
786
|
)
|
760
787
|
|
761
788
|
if not check_con:
|
762
|
-
logger.warning(f"(丢补丁) version:{
|
763
|
-
|
764
|
-
|
765
|
-
|
766
|
-
self.version = tv
|
789
|
+
logger.warning(f"(丢补丁) version:{now_version} fv:{fv} tv:{tv} ")
|
790
|
+
self.loss[symbol] = True # 暂时不这样做
|
791
|
+
|
792
|
+
|
767
793
|
|
768
|
-
if self.loss:
|
794
|
+
if self.loss.get(symbol, True):
|
769
795
|
for item in asks:
|
770
|
-
self.
|
771
|
-
[{"s": symbol, "S": "a", "p": item["p"], "q": item["q"], "fv": fv, "tv": tv}]
|
772
|
-
)
|
796
|
+
self.cache.append({"s": symbol, "S": "a", "p": item["p"], "q": item["q"], "fv": fv, "tv": tv})
|
773
797
|
for item in bids:
|
774
|
-
self.
|
775
|
-
[{"s": symbol, "S": "b", "p": item["p"], "q": item["q"], "fv": fv, "tv": tv}]
|
776
|
-
)
|
798
|
+
self.cache.append({"s": symbol, "S": "b", "p": item["p"], "q": item["q"], "fv": fv, "tv": tv})
|
777
799
|
return
|
778
800
|
|
801
|
+
self.versions[symbol] = tv
|
802
|
+
|
803
|
+
|
779
804
|
to_delete, to_update = [], []
|
780
805
|
for side, S in ((asks, "a"), (bids, "b")):
|
781
806
|
for item in side:
|
@@ -793,7 +818,7 @@ class SpotBook(DataStore):
|
|
793
818
|
self._find_and_delete({'s': symbol})
|
794
819
|
self._update(asks + bids)
|
795
820
|
|
796
|
-
print(f'处理耗时: {time.time()*1000 - ts:.2f} ms')
|
821
|
+
# print(f'处理耗时: {time.time()*1000 - ts:.2f} ms')
|
797
822
|
|
798
823
|
|
799
824
|
|
hyperquant/broker/ourbit.py
CHANGED
@@ -413,7 +413,7 @@ class OurbitSpot:
|
|
413
413
|
)
|
414
414
|
await wsapp._event.wait()
|
415
415
|
|
416
|
-
# await asyncio.sleep(
|
416
|
+
# await asyncio.sleep(1) # 等待ws连接稳定
|
417
417
|
|
418
418
|
# 并发获取每个交易对的初始深度数据
|
419
419
|
tasks = [
|
@@ -428,14 +428,18 @@ class OurbitSpot:
|
|
428
428
|
for idx, response in enumerate(responses):
|
429
429
|
symbol = symbols[idx]
|
430
430
|
self.store.book._onresponse(response.data)
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
431
|
+
|
432
|
+
async def check_loss():
|
433
|
+
await asyncio.sleep(1)
|
434
|
+
while True:
|
435
|
+
loss = self.store.book.loss
|
436
|
+
for symbol, is_loss in loss.items():
|
437
|
+
if is_loss:
|
438
|
+
resp = await self.client.fetch('GET', f"{self.api_url}/api/platform/spot/market/depth?symbol={symbol}")
|
439
|
+
self.store.book._onresponse(resp.data)
|
440
|
+
await asyncio.sleep(1)
|
441
|
+
|
442
|
+
asyncio.create_task(check_loss())
|
439
443
|
|
440
444
|
|
441
445
|
async def place_order(
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: hyperquant
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.46
|
4
4
|
Summary: A minimal yet hyper-efficient backtesting framework for quantitative trading
|
5
5
|
Project-URL: Homepage, https://github.com/yourusername/hyperquant
|
6
6
|
Project-URL: Issues, https://github.com/yourusername/hyperquant/issues
|
@@ -6,16 +6,16 @@ hyperquant/logkit.py,sha256=WALpXpIA3Ywr5DxKKK3k5EKubZ2h-ISGfc5dUReQUBQ,7795
|
|
6
6
|
hyperquant/notikit.py,sha256=x5yAZ_tAvLQRXcRbcg-VabCaN45LUhvlTZnUqkIqfAA,3596
|
7
7
|
hyperquant/broker/auth.py,sha256=oA9Yw1I59-u0Tnoj2e4wUup5q8V5T2qpga5RKbiAiZI,2614
|
8
8
|
hyperquant/broker/hyperliquid.py,sha256=7MxbI9OyIBcImDelPJu-8Nd53WXjxPB5TwE6gsjHbto,23252
|
9
|
-
hyperquant/broker/ourbit.py,sha256=
|
9
|
+
hyperquant/broker/ourbit.py,sha256=yQyjkAYuz6-HhVYJ17SNvopiL-CNN7pSTpKW8h4lzHs,17730
|
10
10
|
hyperquant/broker/ws.py,sha256=umRzxwCaZaRIgIq4YY-AuA0wCXFT0uOBmQbIXFY8CK0,1555
|
11
11
|
hyperquant/broker/lib/hpstore.py,sha256=LnLK2zmnwVvhEbLzYI-jz_SfYpO1Dv2u2cJaRAb84D8,8296
|
12
12
|
hyperquant/broker/lib/hyper_types.py,sha256=HqjjzjUekldjEeVn6hxiWA8nevAViC2xHADOzDz9qyw,991
|
13
13
|
hyperquant/broker/models/hyperliquid.py,sha256=c4r5739ibZfnk69RxPjQl902AVuUOwT8RNvKsMtwXBY,9459
|
14
|
-
hyperquant/broker/models/ourbit.py,sha256=
|
14
|
+
hyperquant/broker/models/ourbit.py,sha256=aBmc6H1VZ2VZfn6JJGzlsnbc--Tw1dDcUmi2s5YYRJM,39580
|
15
15
|
hyperquant/datavison/_util.py,sha256=92qk4vO856RqycO0YqEIHJlEg-W9XKapDVqAMxe6rbw,533
|
16
16
|
hyperquant/datavison/binance.py,sha256=3yNKTqvt_vUQcxzeX4ocMsI5k6Q6gLZrvgXxAEad6Kc,5001
|
17
17
|
hyperquant/datavison/coinglass.py,sha256=PEjdjISP9QUKD_xzXNzhJ9WFDTlkBrRQlVL-5pxD5mo,10482
|
18
18
|
hyperquant/datavison/okx.py,sha256=yg8WrdQ7wgWHNAInIgsWPM47N3Wkfr253169IPAycAY,6898
|
19
|
-
hyperquant-0.
|
20
|
-
hyperquant-0.
|
21
|
-
hyperquant-0.
|
19
|
+
hyperquant-0.46.dist-info/METADATA,sha256=pa_Mm81myuL2GMcSqwm42hdcF7T-srQAsJrng7fHH1A,4317
|
20
|
+
hyperquant-0.46.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
21
|
+
hyperquant-0.46.dist-info/RECORD,,
|
File without changes
|