hyperquant 1.48__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.
Potentially problematic release.
This version of hyperquant might be problematic. Click here for more details.
- hyperquant/__init__.py +8 -0
- hyperquant/broker/auth.py +972 -0
- hyperquant/broker/bitget.py +311 -0
- hyperquant/broker/bitmart.py +720 -0
- hyperquant/broker/coinw.py +487 -0
- hyperquant/broker/deepcoin.py +651 -0
- hyperquant/broker/edgex.py +500 -0
- hyperquant/broker/hyperliquid.py +570 -0
- hyperquant/broker/lbank.py +661 -0
- hyperquant/broker/lib/edgex_sign.py +455 -0
- hyperquant/broker/lib/hpstore.py +252 -0
- hyperquant/broker/lib/hyper_types.py +48 -0
- hyperquant/broker/lib/polymarket/ctfAbi.py +721 -0
- hyperquant/broker/lib/polymarket/safeAbi.py +1138 -0
- hyperquant/broker/lib/util.py +22 -0
- hyperquant/broker/lighter.py +679 -0
- hyperquant/broker/models/apexpro.py +150 -0
- hyperquant/broker/models/bitget.py +359 -0
- hyperquant/broker/models/bitmart.py +635 -0
- hyperquant/broker/models/coinw.py +724 -0
- hyperquant/broker/models/deepcoin.py +809 -0
- hyperquant/broker/models/edgex.py +1053 -0
- hyperquant/broker/models/hyperliquid.py +284 -0
- hyperquant/broker/models/lbank.py +557 -0
- hyperquant/broker/models/lighter.py +868 -0
- hyperquant/broker/models/ourbit.py +1155 -0
- hyperquant/broker/models/polymarket.py +1071 -0
- hyperquant/broker/ourbit.py +550 -0
- hyperquant/broker/polymarket.py +2399 -0
- hyperquant/broker/ws.py +132 -0
- hyperquant/core.py +513 -0
- hyperquant/datavison/_util.py +18 -0
- hyperquant/datavison/binance.py +111 -0
- hyperquant/datavison/coinglass.py +237 -0
- hyperquant/datavison/okx.py +177 -0
- hyperquant/db.py +191 -0
- hyperquant/draw.py +1200 -0
- hyperquant/logkit.py +205 -0
- hyperquant/notikit.py +124 -0
- hyperquant-1.48.dist-info/METADATA +32 -0
- hyperquant-1.48.dist-info/RECORD +42 -0
- hyperquant-1.48.dist-info/WHEEL +4 -0
hyperquant/logkit.py
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
import sys
|
|
3
|
+
import unicodedata
|
|
4
|
+
from datetime import datetime
|
|
5
|
+
from zoneinfo import ZoneInfo
|
|
6
|
+
from colorama import Fore, Style, init
|
|
7
|
+
import os
|
|
8
|
+
import traceback
|
|
9
|
+
|
|
10
|
+
init(autoreset=True)
|
|
11
|
+
|
|
12
|
+
# ====================================================================================================
|
|
13
|
+
# ** 添加ok的日志级别 **
|
|
14
|
+
# 给默认的logging模块,添加一个用于表达成功的级别
|
|
15
|
+
# ====================================================================================================
|
|
16
|
+
OK_LEVEL = 25
|
|
17
|
+
logging.addLevelName(OK_LEVEL, "OK")
|
|
18
|
+
|
|
19
|
+
def ok(self, message, *args, **kwargs):
|
|
20
|
+
if self.isEnabledFor(OK_LEVEL):
|
|
21
|
+
self._log(OK_LEVEL, message, args, **kwargs)
|
|
22
|
+
|
|
23
|
+
logging.Logger.ok = ok
|
|
24
|
+
|
|
25
|
+
# ====================================================================================================
|
|
26
|
+
# ** 辅助函数 **
|
|
27
|
+
# - get_display_width(): 获取文本的显示宽度,中文字符算作1.685个宽度单位,以尽量保持显示居中
|
|
28
|
+
# ====================================================================================================
|
|
29
|
+
def get_display_width(text: str) -> int:
|
|
30
|
+
width = 0
|
|
31
|
+
for char in text:
|
|
32
|
+
if unicodedata.east_asian_width(char) in ('F', 'W', 'A'):
|
|
33
|
+
width += 1.685
|
|
34
|
+
else:
|
|
35
|
+
width += 1
|
|
36
|
+
return int(width)
|
|
37
|
+
|
|
38
|
+
# ====================================================================================================
|
|
39
|
+
# ** 自定义Logger类封装所有功能 **
|
|
40
|
+
# ====================================================================================================
|
|
41
|
+
class Logger:
|
|
42
|
+
OK_LEVEL = 25
|
|
43
|
+
FORMATS = {
|
|
44
|
+
logging.DEBUG: ('', ''),
|
|
45
|
+
logging.INFO: (Fore.BLUE, "🔵 "),
|
|
46
|
+
logging.WARNING: (Fore.YELLOW, "🔔 "),
|
|
47
|
+
logging.ERROR: (Fore.RED, "❌ "),
|
|
48
|
+
logging.CRITICAL: (Fore.RED + Style.BRIGHT, "⭕ "),
|
|
49
|
+
OK_LEVEL: (Fore.GREEN, "✅ "),
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
def __init__(self, name='Log', show_time=False, use_color=True, timezone="Asia/Shanghai"):
|
|
53
|
+
# 设置日志级别
|
|
54
|
+
self.logger = logging.getLogger(name)
|
|
55
|
+
self.logger.setLevel(logging.DEBUG)
|
|
56
|
+
self.show_time = show_time
|
|
57
|
+
self.timezone = timezone # 新增时区配置
|
|
58
|
+
|
|
59
|
+
# 如果已存在 handlers,先清理
|
|
60
|
+
if self.logger.hasHandlers():
|
|
61
|
+
self.logger.handlers.clear()
|
|
62
|
+
|
|
63
|
+
# 控制台输出 handler
|
|
64
|
+
console_handler = MinConsoleHandler(sys.stdout)
|
|
65
|
+
console_handler.setFormatter(MinFormatter(use_color=use_color, show_time=show_time, timezone=timezone))
|
|
66
|
+
self.logger.addHandler(console_handler)
|
|
67
|
+
|
|
68
|
+
# 禁用传播到根日志记录器
|
|
69
|
+
self.logger.propagate = False
|
|
70
|
+
|
|
71
|
+
def divider(self, name='', sep='=', display_time=True):
|
|
72
|
+
"""打印带时间戳的分割线"""
|
|
73
|
+
seperator_len = 72
|
|
74
|
+
now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
75
|
+
middle = f' {name} {now} ' if display_time else f' {name} '
|
|
76
|
+
middle_width = get_display_width(middle)
|
|
77
|
+
decoration_count = max(4, (seperator_len - middle_width) // 2)
|
|
78
|
+
line = sep * decoration_count + middle + sep * decoration_count
|
|
79
|
+
|
|
80
|
+
if get_display_width(line) < seperator_len:
|
|
81
|
+
line += sep
|
|
82
|
+
|
|
83
|
+
self.logger.debug(line)
|
|
84
|
+
|
|
85
|
+
def get_logger(self):
|
|
86
|
+
"""返回 logger 实例"""
|
|
87
|
+
return self.logger
|
|
88
|
+
|
|
89
|
+
# 为各个日志级别创建方法,便于编辑器提示
|
|
90
|
+
def ok(self, message, *args, **kwargs):
|
|
91
|
+
return self.logger.ok(message, *args, **kwargs)
|
|
92
|
+
|
|
93
|
+
def info(self, message, *args, **kwargs):
|
|
94
|
+
return self.logger.info(message, *args, **kwargs)
|
|
95
|
+
|
|
96
|
+
def debug(self, message, *args, **kwargs):
|
|
97
|
+
return self.logger.debug(message, *args, **kwargs)
|
|
98
|
+
|
|
99
|
+
def warning(self, message, *args, **kwargs):
|
|
100
|
+
return self.logger.warning(message, *args, **kwargs)
|
|
101
|
+
|
|
102
|
+
def error(self, message, *args, **kwargs):
|
|
103
|
+
return self.logger.error(message, *args, **kwargs)
|
|
104
|
+
|
|
105
|
+
def critical(self, message, *args, **kwargs):
|
|
106
|
+
return self.logger.critical(message, *args, **kwargs)
|
|
107
|
+
|
|
108
|
+
def exception(self, message, *args, **kwargs):
|
|
109
|
+
return self.logger.exception(message, *args, **kwargs)
|
|
110
|
+
|
|
111
|
+
class MinFormatter(logging.Formatter):
|
|
112
|
+
def __init__(self, use_color=True, show_time=False, timezone="Asia/Shanghai"):
|
|
113
|
+
super().__init__("%(message)s")
|
|
114
|
+
self.use_color = use_color
|
|
115
|
+
self.show_time = show_time
|
|
116
|
+
self.timezone = timezone # 新增时区配置
|
|
117
|
+
|
|
118
|
+
def format(self, record):
|
|
119
|
+
original_message = record.getMessage()
|
|
120
|
+
|
|
121
|
+
# 使用配置的时区
|
|
122
|
+
local_tz = ZoneInfo(self.timezone)
|
|
123
|
+
timestamp = f"[{datetime.now(local_tz).strftime('%Y-%m-%d %H:%M:%S')}] " if self.show_time else ""
|
|
124
|
+
|
|
125
|
+
if self.use_color:
|
|
126
|
+
color, prefix = Logger.FORMATS.get(record.levelno, ('', ''))
|
|
127
|
+
formatted_message = f"{timestamp}{color}{prefix}{original_message}{Style.RESET_ALL}"
|
|
128
|
+
else:
|
|
129
|
+
_, prefix = Logger.FORMATS.get(record.levelno, ('', ''))
|
|
130
|
+
formatted_message = f"{timestamp}{prefix}{original_message}"
|
|
131
|
+
|
|
132
|
+
# 添加异常信息
|
|
133
|
+
if record.exc_info:
|
|
134
|
+
exc_text = ''.join(traceback.format_exception(*record.exc_info))
|
|
135
|
+
formatted_message += f"\n{Fore.RED}{exc_text}{Style.RESET_ALL}" if self.use_color else f"\n{exc_text}"
|
|
136
|
+
|
|
137
|
+
return formatted_message
|
|
138
|
+
|
|
139
|
+
class MinConsoleHandler(logging.StreamHandler):
|
|
140
|
+
def emit(self, record):
|
|
141
|
+
if record.levelno == logging.DEBUG:
|
|
142
|
+
print(self.format(record), flush=True)
|
|
143
|
+
elif record.levelno == Logger.OK_LEVEL:
|
|
144
|
+
super().emit(record)
|
|
145
|
+
print()
|
|
146
|
+
else:
|
|
147
|
+
super().emit(record)
|
|
148
|
+
|
|
149
|
+
# ====================================================================================================
|
|
150
|
+
# ** NullLogger 类,用于禁用日志 **
|
|
151
|
+
# ====================================================================================================
|
|
152
|
+
class NullLogger:
|
|
153
|
+
def debug(self, *a, **k): pass
|
|
154
|
+
def info(self, *a, **k): pass
|
|
155
|
+
def ok(self, *a, **k): pass
|
|
156
|
+
def warning(self, *a, **k): pass
|
|
157
|
+
def error(self, *a, **k): pass
|
|
158
|
+
def critical(self, *a, **k): pass
|
|
159
|
+
def exception(self, *a, **k): pass
|
|
160
|
+
def divider(self, *a, **k): pass
|
|
161
|
+
|
|
162
|
+
# ====================================================================================================
|
|
163
|
+
# ** 功能函数 **
|
|
164
|
+
# ====================================================================================================
|
|
165
|
+
def get_logger(name=None, file_path=None, show_time=False, use_color=True, timezone="Asia/Shanghai", level: object = None, enable_console: bool = True, enabled: bool = True):
|
|
166
|
+
if not enabled:
|
|
167
|
+
return NullLogger()
|
|
168
|
+
if name is None:
|
|
169
|
+
name = '_'
|
|
170
|
+
logger_instance = Logger(name, show_time, use_color, timezone) # 传递时区参数
|
|
171
|
+
if file_path:
|
|
172
|
+
# 如果目录不存在,创建目录
|
|
173
|
+
os.makedirs(os.path.dirname(file_path), exist_ok=True)
|
|
174
|
+
add_file_handler(logger_instance.get_logger(), file_path, show_time, timezone)
|
|
175
|
+
return logger_instance
|
|
176
|
+
|
|
177
|
+
def add_file_handler(logger: logging.Logger, path: str, show_time=False, timezone="Asia/Shanghai"):
|
|
178
|
+
# 添加文件日志输出,启用时间戳
|
|
179
|
+
file_handler = logging.FileHandler(path)
|
|
180
|
+
file_handler.setFormatter(MinFormatter(use_color=False, show_time=show_time, timezone=timezone)) # 传递时区参数
|
|
181
|
+
logger.addHandler(file_handler)
|
|
182
|
+
|
|
183
|
+
# ====================================================================================================
|
|
184
|
+
# ** 示例使用 **
|
|
185
|
+
# ====================================================================================================
|
|
186
|
+
if __name__ == '__main__':
|
|
187
|
+
# 获取日志对象
|
|
188
|
+
logger = get_logger('xx', 'logs/application.log', show_time=True, use_color=True) # This will use Logger
|
|
189
|
+
|
|
190
|
+
# 输出日志信息
|
|
191
|
+
logger.debug("调试信息,没有标记和颜色,等同于print")
|
|
192
|
+
logger.info("提示信息,蓝色的,可以记录一些中间结果")
|
|
193
|
+
logger.ok("完成提示,绿色的,通常表示成功和完成")
|
|
194
|
+
logger.warning("警告信息,黄色的,通常表示警告")
|
|
195
|
+
logger.error("错误信息,红色的,通常是报错的相关提示")
|
|
196
|
+
logger.critical("重要提示,深红色。通常是非常关键的信息")
|
|
197
|
+
|
|
198
|
+
# 使用 divider 方法
|
|
199
|
+
logger.divider("这是一个分割线", sep='*', display_time=True)
|
|
200
|
+
|
|
201
|
+
# 触发一个异常
|
|
202
|
+
try:
|
|
203
|
+
1 / 0
|
|
204
|
+
except Exception:
|
|
205
|
+
logger.exception("捕获到一个异常,程序将继续运行。")
|
hyperquant/notikit.py
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"""
|
|
2
|
+
通知类的功能简单封装,非必要别修改 :)
|
|
3
|
+
只要知道怎么使用以下函数:
|
|
4
|
+
- send_wecom_msg
|
|
5
|
+
- send_wecom_img
|
|
6
|
+
|
|
7
|
+
Binance期现套利 | 邢不行 | 2024分享会
|
|
8
|
+
author: 邢不行
|
|
9
|
+
微信: xbx6660
|
|
10
|
+
"""
|
|
11
|
+
import base64
|
|
12
|
+
import hashlib
|
|
13
|
+
import os.path
|
|
14
|
+
import json
|
|
15
|
+
import traceback
|
|
16
|
+
import aiohttp
|
|
17
|
+
import asyncio
|
|
18
|
+
from datetime import datetime
|
|
19
|
+
|
|
20
|
+
from hyperquant.logkit import get_logger
|
|
21
|
+
logger = get_logger('notikit', './data/logs/notikit.log', show_time=True)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
proxy = {}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def handle_exception(e: Exception, msg: str = '') -> None:
|
|
29
|
+
logger.error(f"{msg}:{e}")
|
|
30
|
+
logger.error(e)
|
|
31
|
+
logger.error(traceback.format_exc())
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# 企业微信通知
|
|
35
|
+
async def send_wecom_msg(content: str, webhook_url: str) -> None:
|
|
36
|
+
if not webhook_url:
|
|
37
|
+
logger.warning('未配置wecom_webhook_url,不发送信息')
|
|
38
|
+
return
|
|
39
|
+
if not content:
|
|
40
|
+
logger.warning('未配置content,不发送信息')
|
|
41
|
+
return
|
|
42
|
+
|
|
43
|
+
try:
|
|
44
|
+
data = {
|
|
45
|
+
"msgtype": "text",
|
|
46
|
+
"text": {
|
|
47
|
+
"content": content + '\n' + datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async with aiohttp.ClientSession() as session:
|
|
52
|
+
async with session.post(
|
|
53
|
+
webhook_url,
|
|
54
|
+
json=data,
|
|
55
|
+
proxy=proxy.get('http') if proxy else None,
|
|
56
|
+
timeout=aiohttp.ClientTimeout(total=10)
|
|
57
|
+
) as response:
|
|
58
|
+
result = await response.text()
|
|
59
|
+
logger.info(f'调用企业微信接口返回: {result}')
|
|
60
|
+
logger.ok('成功发送企业微信')
|
|
61
|
+
except Exception as e:
|
|
62
|
+
handle_exception(e, '发送企业微信失败')
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
# 上传图片,解析bytes
|
|
66
|
+
class MyEncoder(json.JSONEncoder):
|
|
67
|
+
def default(self, obj):
|
|
68
|
+
"""
|
|
69
|
+
只要检查到了是bytes类型的数据就把它转为str类型
|
|
70
|
+
:param obj:
|
|
71
|
+
:return:
|
|
72
|
+
"""
|
|
73
|
+
if isinstance(obj, bytes):
|
|
74
|
+
return str(obj, encoding='utf-8')
|
|
75
|
+
return json.JSONEncoder.default(self, obj)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# 企业微信发送图片
|
|
79
|
+
async def send_wecom_img(file_path: str, webhook_url: str) -> None:
|
|
80
|
+
"""
|
|
81
|
+
企业微信发送图片
|
|
82
|
+
:param file_path: 图片地址
|
|
83
|
+
:param webhook_url: 企业微信webhook网址
|
|
84
|
+
:return:
|
|
85
|
+
"""
|
|
86
|
+
if not os.path.exists(file_path):
|
|
87
|
+
logger.warning('找不到图片')
|
|
88
|
+
return
|
|
89
|
+
if not webhook_url:
|
|
90
|
+
logger.warning('未配置wecom_webhook_url,不发送信息')
|
|
91
|
+
return
|
|
92
|
+
|
|
93
|
+
try:
|
|
94
|
+
with open(file_path, 'rb') as f:
|
|
95
|
+
image_content = f.read()
|
|
96
|
+
|
|
97
|
+
image_base64 = base64.b64encode(image_content).decode('utf-8')
|
|
98
|
+
md5 = hashlib.md5()
|
|
99
|
+
md5.update(image_content)
|
|
100
|
+
image_md5 = md5.hexdigest()
|
|
101
|
+
|
|
102
|
+
data = {
|
|
103
|
+
'msgtype': 'image',
|
|
104
|
+
'image': {
|
|
105
|
+
'base64': image_base64,
|
|
106
|
+
'md5': image_md5
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async with aiohttp.ClientSession() as session:
|
|
111
|
+
async with session.post(
|
|
112
|
+
webhook_url,
|
|
113
|
+
json=data,
|
|
114
|
+
proxy=proxy.get('http') if proxy else None,
|
|
115
|
+
timeout=aiohttp.ClientTimeout(total=10)
|
|
116
|
+
) as response:
|
|
117
|
+
result = await response.text()
|
|
118
|
+
logger.info(f'调用企业微信接口返回: {result}')
|
|
119
|
+
logger.ok('成功发送企业微信图片')
|
|
120
|
+
except Exception as e:
|
|
121
|
+
handle_exception(e, '发送企业微信图片失败')
|
|
122
|
+
finally:
|
|
123
|
+
if os.path.exists(file_path):
|
|
124
|
+
os.remove(file_path)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: hyperquant
|
|
3
|
+
Version: 1.48
|
|
4
|
+
Summary: A minimal yet hyper-efficient backtesting framework for quantitative trading
|
|
5
|
+
Project-URL: Homepage, https://github.com/yourusername/hyperquant
|
|
6
|
+
Project-URL: Issues, https://github.com/yourusername/hyperquant/issues
|
|
7
|
+
Author-email: MissinA <1421329142@qq.com>
|
|
8
|
+
License: MIT
|
|
9
|
+
Keywords: backtesting,hyperquant,quant,trading
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Topic :: Office/Business :: Financial :: Investment
|
|
15
|
+
Requires-Python: >=3.13
|
|
16
|
+
Requires-Dist: aiohttp>=3.13
|
|
17
|
+
Requires-Dist: coincurve>=21.0.0
|
|
18
|
+
Requires-Dist: colorama>=0.4.6
|
|
19
|
+
Requires-Dist: cryptography>=44.0.2
|
|
20
|
+
Requires-Dist: duckdb>=1.2.2
|
|
21
|
+
Requires-Dist: eth-account>=0.10.0
|
|
22
|
+
Requires-Dist: numpy>=1.21.0
|
|
23
|
+
Requires-Dist: pandas>=2.2.3
|
|
24
|
+
Requires-Dist: pybotters>=1.10
|
|
25
|
+
Requires-Dist: pyecharts>=2.0.8
|
|
26
|
+
Requires-Dist: python-dotenv>=1.2.1
|
|
27
|
+
Requires-Dist: web3>=7.14.0
|
|
28
|
+
Description-Content-Type: text/markdown
|
|
29
|
+
|
|
30
|
+
# hyperquant
|
|
31
|
+
|
|
32
|
+
hyperquant is a minimalistic framework for quantitative trading strategies. It allows users to quickly validate their strategy ideas with ease and efficiency.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
hyperquant/__init__.py,sha256=UpjiX4LS5jmrBc2kE8RiLR02eCfD8JDQrR1q8zkLNcQ,161
|
|
2
|
+
hyperquant/core.py,sha256=RzRFbyImqzBiaA-9lQzvxPfxwcOvScdABZviS4y0kqM,20783
|
|
3
|
+
hyperquant/db.py,sha256=i2TjkCbmH4Uxo7UTDvOYBfy973gLcGexdzuT_YcSeIE,6678
|
|
4
|
+
hyperquant/draw.py,sha256=up_lQ3pHeVLoNOyh9vPjgNwjD0M-6_IetSGviQUgjhY,54624
|
|
5
|
+
hyperquant/logkit.py,sha256=nUo7nx5eONvK39GOhWwS41zNRL756P2J7-5xGzwXnTY,8462
|
|
6
|
+
hyperquant/notikit.py,sha256=x5yAZ_tAvLQRXcRbcg-VabCaN45LUhvlTZnUqkIqfAA,3596
|
|
7
|
+
hyperquant/broker/auth.py,sha256=JVv04m-Z2fnM0Fds-nRjbVEXMnf-JrK7sk2URvUMsC4,37102
|
|
8
|
+
hyperquant/broker/bitget.py,sha256=X_S0LKZ7FZAEb6oEMr1vdGP1fondzK74BhmNTpRDSEA,9488
|
|
9
|
+
hyperquant/broker/bitmart.py,sha256=7j_8TU3Dxjj5HCNX7CbSO3nPZcQH1t31A9UOv5tTbg0,25974
|
|
10
|
+
hyperquant/broker/coinw.py,sha256=SnJU0vASh77rfcpMGWaIfTblQSjQk3vjlW_4juYdbcs,17214
|
|
11
|
+
hyperquant/broker/deepcoin.py,sha256=DdXQRuL1m0FeFRmGVC3hvQLXXXaDOsXK-p2zZoFWODE,22997
|
|
12
|
+
hyperquant/broker/edgex.py,sha256=TqUO2KRPLN_UaxvtLL6HnA9dAQXC1sGxOfqTHd6W5k8,18378
|
|
13
|
+
hyperquant/broker/hyperliquid.py,sha256=7MxbI9OyIBcImDelPJu-8Nd53WXjxPB5TwE6gsjHbto,23252
|
|
14
|
+
hyperquant/broker/lbank.py,sha256=98M5wmSoeHwbBYMA3rh25zqLb6fQKVaEmwqALF5nOvY,22181
|
|
15
|
+
hyperquant/broker/lighter.py,sha256=xyF967a-AwzecJ9qRPatxEzqis-J8dKQB6Xh1deR9Vc,25611
|
|
16
|
+
hyperquant/broker/ourbit.py,sha256=NUcDSIttf-HGWzoW1uBTrGLPHlkuemMjYCm91MigTno,18228
|
|
17
|
+
hyperquant/broker/polymarket.py,sha256=Js6_joi00144uS9J7uz44S4PpETyH7a85Dm9rNf-YmU,90516
|
|
18
|
+
hyperquant/broker/ws.py,sha256=3r8PGxR_1IflcY8fXc4EWwG7LWo_ylVXFFDZIPrXllM,4704
|
|
19
|
+
hyperquant/broker/lib/edgex_sign.py,sha256=lLUCmY8HHRLfLKyGrlTJYaBlSHPsIMWg3EZnQJKcmyk,95785
|
|
20
|
+
hyperquant/broker/lib/hpstore.py,sha256=LnLK2zmnwVvhEbLzYI-jz_SfYpO1Dv2u2cJaRAb84D8,8296
|
|
21
|
+
hyperquant/broker/lib/hyper_types.py,sha256=HqjjzjUekldjEeVn6hxiWA8nevAViC2xHADOzDz9qyw,991
|
|
22
|
+
hyperquant/broker/lib/util.py,sha256=iMU1qF0CHj5zzlIMEQGwjz-qtEVosEe7slXOCuB7Rcw,566
|
|
23
|
+
hyperquant/broker/lib/polymarket/ctfAbi.py,sha256=E6cdz5tQpfoz8qmLZ4_nmzqsodiPzLZ45RDpMw_PmqU,15004
|
|
24
|
+
hyperquant/broker/lib/polymarket/safeAbi.py,sha256=oenPmWl8rK_153ItkNAPmPhlKwivCAGL-cmUQVD7HDc,24373
|
|
25
|
+
hyperquant/broker/models/apexpro.py,sha256=fJvMTXHJFQqhDtQ4qWi3WKYexCWIYRRKy-tEtvkl2vY,4197
|
|
26
|
+
hyperquant/broker/models/bitget.py,sha256=0RwDY75KrJb-c-oYoMxbqxWfsILe-n_Npojz4UFUq7c,11389
|
|
27
|
+
hyperquant/broker/models/bitmart.py,sha256=O9RnU-XBeR9SzicG15jzuzK5oy2kMrRJAyZSqC8DXUw,21938
|
|
28
|
+
hyperquant/broker/models/coinw.py,sha256=LvLMVP7i-qkkTK1ubw8eBkMK2RQmFoKPxdKqmC4IToY,22157
|
|
29
|
+
hyperquant/broker/models/deepcoin.py,sha256=6JlCWpK9UOYlfyinR5REpWqFqJCzydnD7pS8nRjy06s,25692
|
|
30
|
+
hyperquant/broker/models/edgex.py,sha256=vPAkceal44cjTYKQ_0BoNAskOpmkno_Yo1KxgMLPc6Y,33954
|
|
31
|
+
hyperquant/broker/models/hyperliquid.py,sha256=c4r5739ibZfnk69RxPjQl902AVuUOwT8RNvKsMtwXBY,9459
|
|
32
|
+
hyperquant/broker/models/lbank.py,sha256=vHkNKxIMzpoC_EwcZnEOPOupizF92yGWi9GKxvYYFUQ,19181
|
|
33
|
+
hyperquant/broker/models/lighter.py,sha256=I6hjM0of8NLtjSmI6OlbJlvpYDDswLn9yyQLz0I1Mes,30495
|
|
34
|
+
hyperquant/broker/models/ourbit.py,sha256=xMcbuCEXd3XOpPBq0RYF2zpTFNnxPtuNJZCexMZVZ1k,41965
|
|
35
|
+
hyperquant/broker/models/polymarket.py,sha256=d3XD1RUeiMjV8ru0wCY1Uv6JIjmnfTG_mqeXapGpJ2g,38372
|
|
36
|
+
hyperquant/datavison/_util.py,sha256=92qk4vO856RqycO0YqEIHJlEg-W9XKapDVqAMxe6rbw,533
|
|
37
|
+
hyperquant/datavison/binance.py,sha256=3yNKTqvt_vUQcxzeX4ocMsI5k6Q6gLZrvgXxAEad6Kc,5001
|
|
38
|
+
hyperquant/datavison/coinglass.py,sha256=PEjdjISP9QUKD_xzXNzhJ9WFDTlkBrRQlVL-5pxD5mo,10482
|
|
39
|
+
hyperquant/datavison/okx.py,sha256=yg8WrdQ7wgWHNAInIgsWPM47N3Wkfr253169IPAycAY,6898
|
|
40
|
+
hyperquant-1.48.dist-info/METADATA,sha256=xYfb3OlarL3T3kh7rlNVcztVmrdpcqFtKN5Xz7mPNW4,1245
|
|
41
|
+
hyperquant-1.48.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
42
|
+
hyperquant-1.48.dist-info/RECORD,,
|