kaq-quant-common 0.1.83__py3-none-any.whl → 0.1.85__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.
Files changed (30) hide show
  1. kaq_quant_common/api/common/__init__.py +1 -1
  2. kaq_quant_common/api/common/api_interface.py +38 -38
  3. kaq_quant_common/api/rest/api_client_base.py +42 -42
  4. kaq_quant_common/api/rest/instruction/helper/order_helper.py +324 -324
  5. kaq_quant_common/api/rest/instruction/instruction_client.py +76 -88
  6. kaq_quant_common/api/rest/instruction/instruction_server_base.py +133 -132
  7. kaq_quant_common/api/rest/instruction/models/__init__.py +17 -17
  8. kaq_quant_common/api/rest/instruction/models/account.py +24 -24
  9. kaq_quant_common/api/rest/instruction/models/order.py +248 -223
  10. kaq_quant_common/api/rest/instruction/models/position.py +56 -56
  11. kaq_quant_common/api/rest/instruction/models/transfer.py +32 -32
  12. kaq_quant_common/api/ws/exchange/models.py +23 -23
  13. kaq_quant_common/api/ws/exchange/ws_exchange_server.py +440 -440
  14. kaq_quant_common/common/ddb_table_monitor.py +106 -106
  15. kaq_quant_common/common/http_monitor.py +69 -69
  16. kaq_quant_common/common/modules/limit_order_helper.py +81 -81
  17. kaq_quant_common/common/modules/limit_order_symbol_monitor.py +76 -76
  18. kaq_quant_common/common/modules/limit_order_symbol_monitor_group.py +69 -69
  19. kaq_quant_common/common/monitor_base.py +84 -84
  20. kaq_quant_common/common/monitor_group.py +97 -97
  21. kaq_quant_common/common/statistics/funding_rate_history_statistics.py +208 -0
  22. kaq_quant_common/common/statistics/kline_history_statistics.py +36 -13
  23. kaq_quant_common/common/ws_wrapper.py +21 -21
  24. kaq_quant_common/resources/kaq_ddb_stream_write_resources.py +2 -0
  25. kaq_quant_common/utils/logger_utils.py +5 -5
  26. kaq_quant_common/utils/signal_utils.py +23 -23
  27. kaq_quant_common/utils/uuid_utils.py +5 -5
  28. {kaq_quant_common-0.1.83.dist-info → kaq_quant_common-0.1.85.dist-info}/METADATA +1 -1
  29. {kaq_quant_common-0.1.83.dist-info → kaq_quant_common-0.1.85.dist-info}/RECORD +30 -29
  30. {kaq_quant_common-0.1.83.dist-info → kaq_quant_common-0.1.85.dist-info}/WHEEL +1 -1
@@ -0,0 +1,208 @@
1
+ import datetime
2
+ import json
3
+ from typing import Optional
4
+
5
+ import pandas as pd
6
+ from pydantic import BaseModel
7
+
8
+ from kaq_quant_common.common.statistics.kline_history_statistics import \
9
+ StatisticsInfo
10
+ from kaq_quant_common.utils import logger_utils
11
+
12
+ platforms = ["binance", "bitget", "bybit", "gate", "htx", "okx"]
13
+
14
+
15
+ # 这个类是统计合约历史资金数据的,在确保已经抓取完数据后使用
16
+ class FuturesFundingRateHistoryStatistics:
17
+ def __init__(
18
+ self,
19
+ begin_timestamp: int,
20
+ end_timestamp: int,
21
+ symbols: list[str],
22
+ master: str,
23
+ redis: None,
24
+ mysql: None,
25
+ ):
26
+ self.redis_key = "kaq_futures_funding_rate_history_statistics"
27
+ self.begin_timestamp = begin_timestamp
28
+ self.end_timestamp = end_timestamp
29
+ self.symbols = symbols
30
+ # 计算天数
31
+ self.day_num = (end_timestamp - begin_timestamp) // (24 * 3600 * 1000)
32
+ self._redis = redis
33
+ self._mysql = mysql
34
+ self.master = master
35
+ self._logger = logger_utils.get_logger()
36
+ self.table_name = "kaq_futures_funding_rate_history"
37
+
38
+ # 针对本平台的所有交易对每个进行对应统计
39
+ def symbols_statistics(self):
40
+ for symbol in self.symbols:
41
+ try:
42
+ self.get_symbol_funding_rate_all_platform(symbol)
43
+ except Exception as e:
44
+ self._logger.error(f"拉取{symbol}的资金数据出现异常: {e}")
45
+ ddd = 1
46
+ continue
47
+
48
+ # 对指定交易对进行全平台的资金数据拉取
49
+ def get_symbol_funding_rate_all_platform(self, symbol: str):
50
+ df_dict = {}
51
+ # 先拉自己的吧
52
+ master_df = self.query_symbol_funding_rate_data(symbol, self.master)
53
+
54
+ # 先记录下主平台拉到的数据量,用来对比其它平台,其它平台不是这么多就证明有问题,需要记录下日志
55
+ master_df_len = len(master_df)
56
+
57
+ # 没有数据就跳过
58
+ if master_df_len == 0:
59
+ raise Exception(
60
+ f"{self.master}平台拉取到的{symbol}的资金数据量为:{master_df_len}条,跳过后续处理"
61
+ )
62
+
63
+ # 对其它交易所进行拉取
64
+ for platform in platforms:
65
+ if platform == self.master:
66
+ continue
67
+ platform_df = self.query_symbol_funding_rate_data(symbol, platform)
68
+
69
+ if len(platform_df) != master_df_len:
70
+ self._logger.error(
71
+ f"{platform}平台拉取到的{symbol}的资金数据量与主平台不一致,主平台:{master_df_len},{platform}平台:{len(platform_df)},跳过该交易所数据"
72
+ )
73
+ continue
74
+
75
+ df_dict[platform] = platform_df
76
+
77
+ # 开始计算差异
78
+ symbol_diffrenence_dict = self.calculate_funding_rate_difference(
79
+ symbol, master_df, df_dict
80
+ )
81
+
82
+ self._redis.hset(
83
+ self.redis_key + ":" + self.master.upper(),
84
+ symbol,
85
+ json.dumps({k: v.model_dump() for k, v in symbol_diffrenence_dict.items()}),
86
+ )
87
+
88
+ # 计算各个平台的资金数据差异
89
+ def calculate_funding_rate_difference(
90
+ self, symbol: str, master_df: pd.DataFrame, df_dict: dict
91
+ ):
92
+ res = {}
93
+ master_hour = master_df.iloc[0]["hour"]
94
+ # 自己也要计算差异
95
+ master_std = master_df[f"{self.master}_rate"].std()
96
+ master_mean = master_df[f"{self.master}_rate"].mean()
97
+ master_max = master_df[f"{self.master}_rate"].max()
98
+ master_rate_corr = master_df[f"{self.master}_rate"].corr(
99
+ master_df["event_time_hour"]
100
+ )
101
+ master_min = master_df[f"{self.master}_rate"].min()
102
+ master_quantile = master_df[f"{self.master}_rate"].quantile([0.25, 0.5, 0.75])
103
+
104
+ res[self.master] = StatisticsInfo(
105
+ platform=self.master,
106
+ std=master_std,
107
+ mean=master_mean,
108
+ max=master_max,
109
+ corr=master_rate_corr,
110
+ min=master_min,
111
+ quantile={str(k): float(v) for k, v in master_quantile.to_dict().items()},
112
+ period=master_hour,
113
+ )
114
+
115
+ # 还要加主平台的差异,主平台不需要减,只需要直接处理
116
+ for platform, platform_df in df_dict.items():
117
+ platform_hour = platform_df.iloc[0]["hour"]
118
+ # 合并数据,找出差异
119
+ merged_df = pd.merge(
120
+ master_df, platform_df, on=["symbol", "event_time_hour"], how="inner"
121
+ )
122
+
123
+ # 计算差值
124
+ merged_df["rate_diff"] = (
125
+ merged_df[f"{self.master}_rate"] - merged_df[f"{platform}_rate"]
126
+ )
127
+ # 标准差
128
+ rate_std = merged_df["rate_diff"].std()
129
+ # 平均值
130
+ rate_mean = merged_df["rate_diff"].mean()
131
+ # 最大值
132
+ rate_max = merged_df["rate_diff"].max()
133
+ # 皮尔逊系数(斜率)
134
+ rate_corr = merged_df["rate_diff"].corr(merged_df["event_time_hour"])
135
+ # 最小值
136
+ rate_min = merged_df["rate_diff"].min()
137
+ # 4分位数
138
+ rate_quantile = merged_df["rate_diff"].quantile([0.25, 0.5, 0.75])
139
+ # self._logger.info(
140
+ # f"{self.master}与{platform}平台的{symbol}的K线差异统计: 标准差={rate_std}, 平均值={rate_mean}, 最大值={rate_max}, 最小值={rate_min}, 皮尔逊系数={rate_corr}, 四分位数={rate_quantile.to_dict()}"
141
+ # )
142
+ res[platform] = StatisticsInfo(
143
+ platform=platform,
144
+ std=rate_std,
145
+ mean=rate_mean,
146
+ max=rate_max,
147
+ corr=rate_corr,
148
+ min=rate_min,
149
+ quantile={str(k): v for k, v in rate_quantile.to_dict().items()},
150
+ period=platform_hour,
151
+ )
152
+
153
+ return res
154
+
155
+ # 拉指定时间指定symbol的资金数据
156
+ def query_symbol_funding_rate_data(self, symbol: str, platform: str):
157
+ sql_result_df = pd.DataFrame()
158
+ # 先转成周一日期来定表名,因为数据表是按周来分表的
159
+ sql = f"select exchange, symbol, rate as {platform}_rate, event_time from {self.table_name} where symbol = '{symbol}' and event_time >= {self.begin_timestamp} and event_time < {self.end_timestamp} and exchange='{platform}' order by event_time desc ;"
160
+ result = self._mysql.fetch_data(sql)
161
+ sql_result_df = pd.DataFrame(result)
162
+ if sql_result_df.empty:
163
+ return sql_result_df
164
+ # 转换类型
165
+ sql_result_df[f"{platform}_rate"] = sql_result_df[f"{platform}_rate"].astype(
166
+ float
167
+ )
168
+ # 增加个周期字段用来补全24小时数据
169
+ # 我操,接口拿到的event_time毫秒有些不是整点,转成小时处理吧。
170
+ sql_result_df["event_time"] = sql_result_df["event_time"].astype(int)
171
+ sql_result_df["event_time_hour"] = sql_result_df["event_time"] // 1000
172
+ # 计算周期
173
+ sql_result_df["period"] = sql_result_df["event_time_hour"].diff(periods=-1)
174
+ sql_result_df["hour"] = sql_result_df["period"] // 3600
175
+
176
+ sql_result_df = sql_result_df[::-1] # 反向排序
177
+
178
+ start_ts = int(sql_result_df["event_time"].iloc[0])
179
+ start_dt = pd.to_datetime(start_ts // 1000, unit="s")
180
+ # 先生成一批完整的时间序列数据
181
+ temp_date_df = pd.date_range(
182
+ start_dt,
183
+ periods=self.day_num * 24,
184
+ freq="h",
185
+ )
186
+ temp_date_df = temp_date_df[::-1] # 反向排序
187
+
188
+ # 生成完整的毫秒级时间戳DataFrame
189
+ temp_time_df = pd.DataFrame(
190
+ {"event_time_hour": temp_date_df.astype(int) // 10**9} # 转为毫秒
191
+ )
192
+ # 合并,左侧为完整时间
193
+ merged_df = temp_time_df.merge(sql_result_df, on="event_time_hour", how="left")
194
+ # 向上对齐填充
195
+ merged_df = merged_df.sort_values("event_time_hour").ffill()
196
+ # event_time用自身时间,其它字段用ffill
197
+ merged_df["event_time_hour"] = temp_time_df["event_time_hour"]
198
+ merged_df = merged_df.sort_values(
199
+ "event_time_hour", ascending=False
200
+ ).reset_index(drop=True)
201
+ return merged_df
202
+
203
+
204
+ if __name__ == "__main__":
205
+ klineStatistics = FuturesFundingRateHistoryStatistics(
206
+ 1765296000000, 1765382400000, ["BTCUSDT", "ETHUSDT"]
207
+ )
208
+ klineStatistics.symbols_statistics()
@@ -1,10 +1,12 @@
1
1
  import datetime
2
2
  import json
3
+ from typing import Optional
3
4
 
4
5
  import pandas as pd
5
- from kaq_quant_common.utils import logger_utils
6
6
  from pydantic import BaseModel
7
7
 
8
+ from kaq_quant_common.utils import logger_utils
9
+
8
10
  platforms = ["binance", "bitget", "bybit", "gate", "htx", "okx"]
9
11
 
10
12
 
@@ -13,17 +15,19 @@ class StatisticsInfo(BaseModel):
13
15
  # 对比平台
14
16
  platform: str
15
17
  # 标准差
16
- std: str
18
+ std: float
17
19
  # 平均值
18
- mean: str
20
+ mean: float
19
21
  # 最大值
20
- max: str
22
+ max: float
21
23
  # 皮尔逊系数(斜率)
22
- corr: str
24
+ corr: float
23
25
  # 最小值
24
- min: str
26
+ min: float
25
27
  # 4分位数
26
- quantile: dict[str, str]
28
+ quantile: dict[str, float]
29
+ # 相隔时间(hour)
30
+ period: Optional[int] = 0
27
31
 
28
32
 
29
33
  # 这个类是统计合约K线历史数据的,在确保已经抓取完数据后使用
@@ -99,6 +103,25 @@ class FuturesKlineHistoryStatistics:
99
103
  self, symbol: str, master_df: pd.DataFrame, df_dict: dict
100
104
  ):
101
105
  res = {}
106
+ # 自己也要计算差异
107
+ master_std = master_df[f"{self.master}_close"].std()
108
+ master_mean = master_df[f"{self.master}_close"].mean()
109
+ master_max = master_df[f"{self.master}_close"].max()
110
+ master_rate_corr = master_df[f"{self.master}_close"].corr(
111
+ master_df["event_time"]
112
+ )
113
+ master_min = master_df[f"{self.master}_close"].min()
114
+ master_quantile = master_df[f"{self.master}_close"].quantile([0.25, 0.5, 0.75])
115
+
116
+ res[self.master] = StatisticsInfo(
117
+ platform=self.master,
118
+ std=master_std,
119
+ mean=master_mean,
120
+ max=master_max,
121
+ corr=master_rate_corr,
122
+ min=master_min,
123
+ quantile={str(k): float(v) for k, v in master_quantile.to_dict().items()},
124
+ )
102
125
  for platform, platform_df in df_dict.items():
103
126
  # 合并数据,找出差异
104
127
  merged_df = pd.merge(
@@ -125,12 +148,12 @@ class FuturesKlineHistoryStatistics:
125
148
  # )
126
149
  res[platform] = StatisticsInfo(
127
150
  platform=platform,
128
- std=str(close_std),
129
- mean=str(close_mean),
130
- max=str(close_max),
131
- corr=str(close_corr),
132
- min=str(close_min),
133
- quantile={str(k): str(v) for k, v in close_quantile.to_dict().items()},
151
+ std=close_std,
152
+ mean=close_mean,
153
+ max=close_max,
154
+ corr=close_corr,
155
+ min=close_min,
156
+ quantile={str(k): float(v) for k, v in close_quantile.to_dict().items()},
134
157
  )
135
158
 
136
159
  return res
@@ -1,21 +1,21 @@
1
- from abc import abstractmethod
2
-
3
- from kaq_quant_common.common.monitor_base import MonitorBase
4
-
5
-
6
- # 通用的抽象类,包装一层ws操作
7
- class WsWrapper(MonitorBase):
8
- def __init__(self):
9
- super().__init__()
10
-
11
- # stop 就是调用close,ws 更好理解
12
- def _do_stop(self):
13
- self._do_close()
14
-
15
- # 断开连接,主动关闭
16
- def close(self):
17
- self.stop()
18
-
19
- @abstractmethod
20
- def _do_close(self):
21
- pass
1
+ from abc import abstractmethod
2
+
3
+ from kaq_quant_common.common.monitor_base import MonitorBase
4
+
5
+
6
+ # 通用的抽象类,包装一层ws操作
7
+ class WsWrapper(MonitorBase):
8
+ def __init__(self):
9
+ super().__init__()
10
+
11
+ # stop 就是调用close,ws 更好理解
12
+ def _do_stop(self):
13
+ self._do_close()
14
+
15
+ # 断开连接,主动关闭
16
+ def close(self):
17
+ self.stop()
18
+
19
+ @abstractmethod
20
+ def _do_close(self):
21
+ pass
@@ -48,6 +48,8 @@ class KaqQuantDdbStreamWriteRepository:
48
48
  self.logger.error(f'KaqQuantDdbStreamWriteRepository.save2stream is occured error: tableName is {ddb_table_name} - {str(e)} - {str(traceback.format_exc())}')
49
49
 
50
50
  def build_insert_values_fast(self, df):
51
+ if df.empty:
52
+ return []
51
53
  dtypes = df.dtypes.tolist()
52
54
  # 提前确定哪些列需要加引号
53
55
  str_idx = {i for i, dt in enumerate(dtypes) if dt == object or dt == 'object' or dt == 'str'}
@@ -13,7 +13,7 @@ logger.add(
13
13
  # 输出到标准输出(控制台)
14
14
  sink=sys.stdout,
15
15
  # TODO 配置
16
- level="DEBUG",
16
+ level="INFO",
17
17
  #
18
18
  # format="{time} {level} [{extra[module]}] {message}", # 显示绑定的module
19
19
  format=(
@@ -36,9 +36,9 @@ def _is_dagster_env():
36
36
 
37
37
 
38
38
  def get_logger(obj: Union[str, object] = None):
39
- """
39
+ '''
40
40
  获取logger
41
- """
41
+ '''
42
42
 
43
43
  is_dagster_env = _is_dagster_env()
44
44
 
@@ -46,9 +46,9 @@ def get_logger(obj: Union[str, object] = None):
46
46
  if isinstance(obj, str):
47
47
  # do nothing
48
48
  name = obj
49
- elif hasattr(obj, "__class__"):
49
+ elif hasattr(obj, '__class__'):
50
50
  name = obj.__class__.__name__
51
- elif hasattr(obj, "__name__"):
51
+ elif hasattr(obj, '__name__'):
52
52
  name = obj.__name__
53
53
  else:
54
54
  name = ""
@@ -1,23 +1,23 @@
1
- import signal
2
- import sys
3
-
4
- # 1. 为目标信号(例如 SIGINT,即 Ctrl+C 触发)维护一个处理函数列表
5
- signal_handlers = []
6
-
7
-
8
- # 2. 定义「总处理函数」:触发时依次执行列表中的所有处理逻辑
9
- def total_handler(signalnum, frame):
10
- # 依次调用所有注册的处理函数
11
- for handler in signal_handlers:
12
- handler(signalnum, frame)
13
-
14
-
15
- # 3. 注册「总处理函数」到目标信号(例如 SIGINT)
16
- # SIGTERM:Dagster通常发送此信号进行终止
17
- # SIGINT:对应Ctrl+C,用于本地测试
18
- signal.signal(signal.SIGTERM, total_handler)
19
- signal.signal(signal.SIGINT, total_handler)
20
-
21
-
22
- def register_signal_handler(handler):
23
- signal_handlers.append(handler)
1
+ import signal
2
+ import sys
3
+
4
+ # 1. 为目标信号(例如 SIGINT,即 Ctrl+C 触发)维护一个处理函数列表
5
+ signal_handlers = []
6
+
7
+
8
+ # 2. 定义「总处理函数」:触发时依次执行列表中的所有处理逻辑
9
+ def total_handler(signalnum, frame):
10
+ # 依次调用所有注册的处理函数
11
+ for handler in signal_handlers:
12
+ handler(signalnum, frame)
13
+
14
+
15
+ # 3. 注册「总处理函数」到目标信号(例如 SIGINT)
16
+ # SIGTERM:Dagster通常发送此信号进行终止
17
+ # SIGINT:对应Ctrl+C,用于本地测试
18
+ signal.signal(signal.SIGTERM, total_handler)
19
+ signal.signal(signal.SIGINT, total_handler)
20
+
21
+
22
+ def register_signal_handler(handler):
23
+ signal_handlers.append(handler)
@@ -1,5 +1,5 @@
1
- import uuid
2
-
3
-
4
- def generate_uuid() -> str:
5
- return str(uuid.uuid4())
1
+ import uuid
2
+
3
+
4
+ def generate_uuid() -> str:
5
+ return str(uuid.uuid4())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kaq_quant_common
3
- Version: 0.1.83
3
+ Version: 0.1.85
4
4
  Summary:
5
5
  Author: kevinfuture
6
6
  Author-email: liuenbofuture@foxmail.com
@@ -1,23 +1,23 @@
1
1
  kaq_quant_common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  kaq_quant_common/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- kaq_quant_common/api/common/__init__.py,sha256=frcCV1k9oG9oKj3dpUqdJg1PxRT2RSN_XKdLCPjaYaY,2
4
- kaq_quant_common/api/common/api_interface.py,sha256=wMnP6ImhsvSGNY4vPViqV4SO64Hx0iHQui86g-Vkhjs,1000
3
+ kaq_quant_common/api/common/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
4
+ kaq_quant_common/api/common/api_interface.py,sha256=E59C2Gh51wmy9NpD9y_SnCh_J-ZbZhT7rUsaORWzXHI,962
5
5
  kaq_quant_common/api/common/auth.py,sha256=XqirJRL4D01YfSrBY4hyugw-Op6OJveNE--AnaqhYTQ,3987
6
6
  kaq_quant_common/api/rest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
- kaq_quant_common/api/rest/api_client_base.py,sha256=-C_jptM__xVd4c47IjmpIY2fktkNhoToL7UmmErMf20,1715
7
+ kaq_quant_common/api/rest/api_client_base.py,sha256=LYpqjjVGbVRVyP8qdmlgMelUtEY-jGA0JlMJy9d1r4w,1673
8
8
  kaq_quant_common/api/rest/api_server_base.py,sha256=URrvzerHIE6XQLERYFcFH1ftLbCYTz3sENAxFD0HWY0,4653
9
- kaq_quant_common/api/rest/instruction/helper/order_helper.py,sha256=uFBSkvMlqXCvkkVzeLwlOTNWyQm0F7AM1nB7tveM_Nk,12591
10
- kaq_quant_common/api/rest/instruction/instruction_client.py,sha256=8485oHC98MEGHm-wgV9pwnVx5H0UHdsthT75K_sXXP0,3381
11
- kaq_quant_common/api/rest/instruction/instruction_server_base.py,sha256=dM3CEXYAoN0Ionv0exySj0Vs2uXsJ6hJfAKlXYtAFkg,5027
12
- kaq_quant_common/api/rest/instruction/models/__init__.py,sha256=nCcogQU_gDdRVIVIwCRHjDU8pQJ08IFwhuhTpRbnyrU,329
13
- kaq_quant_common/api/rest/instruction/models/account.py,sha256=AqMsO-VyQmEJ8XFkqKNIWDnPWuQwGd2K-DHgJrFwtJ8,656
14
- kaq_quant_common/api/rest/instruction/models/order.py,sha256=JnD2kxU0wMX2EfvyFbjJ2shNmMC0la_ru8TGvDjzQhM,6428
15
- kaq_quant_common/api/rest/instruction/models/position.py,sha256=OxfAwTqxnlYXtaYmzzEHn4PYzN0fivYj8mhbZdm_7Fo,1324
16
- kaq_quant_common/api/rest/instruction/models/transfer.py,sha256=5qA2EtUAEnCCicDmHQEwN-k7ON985mQKflTeYOPnmPw,807
9
+ kaq_quant_common/api/rest/instruction/helper/order_helper.py,sha256=q2opRLHrysvgqoFpAC70WNQpFJsbviHqjRldXj6tiMY,12267
10
+ kaq_quant_common/api/rest/instruction/instruction_client.py,sha256=CI5RidyBN51qxq3NKNMIJGs3boCIt-EYN5bnn12ywIo,3489
11
+ kaq_quant_common/api/rest/instruction/instruction_server_base.py,sha256=uKE0O_x3hC3595YCFbIZ2CDnmsk6V7b0dQ4J-5lvbI0,5279
12
+ kaq_quant_common/api/rest/instruction/models/__init__.py,sha256=fx5pnfcf9L5KvAqhsQBZkl9fUf9oABuroLGZqDNycpc,312
13
+ kaq_quant_common/api/rest/instruction/models/account.py,sha256=3rdsEnEqaHWjQ3yHMZ4pOupfHqHMRZ_W5kxIxuRQoac,632
14
+ kaq_quant_common/api/rest/instruction/models/order.py,sha256=F941DPXlbsklpc8jHLaJ2nQZiUmjPt0zyL_bagijSzI,6847
15
+ kaq_quant_common/api/rest/instruction/models/position.py,sha256=PGyZg_z4ZIB09BWl1uRtmePz8T3mzgrHSgpdN0ZKRzA,1268
16
+ kaq_quant_common/api/rest/instruction/models/transfer.py,sha256=htjk4hb9THUZP4REW5gtyPdo850jHPtHPWFLPA2ERzo,775
17
17
  kaq_quant_common/api/ws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- kaq_quant_common/api/ws/exchange/models.py,sha256=lmYPQnRC-hWb0vTHDclpIIyacfYlR21oD1-V6KnojvI,687
18
+ kaq_quant_common/api/ws/exchange/models.py,sha256=RPD5cDRQyISguTjO5Si1V5hJza8Uyr4u2EZEHNFtLb8,664
19
19
  kaq_quant_common/api/ws/exchange/ws_exchange_client.py,sha256=Q9ymPcehpUW-lYilBlL7HU4JXkW9jA3kHFYLxnd-pJU,996
20
- kaq_quant_common/api/ws/exchange/ws_exchange_server.py,sha256=BanrFdVzzMSFjPba5ZS4g1F-IJmseYbw7nN82gv4SPo,20350
20
+ kaq_quant_common/api/ws/exchange/ws_exchange_server.py,sha256=z2aJfpx-iHIs7V1PmGFwqZS8t4-I9RiicbQOrfF4d7c,19910
21
21
  kaq_quant_common/api/ws/instruction/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  kaq_quant_common/api/ws/instruction/ws_instruction_client.py,sha256=j8FgMUeuZvz8siknEYoLwElVRgHSX0x29F7dxNWPrsE,3154
23
23
  kaq_quant_common/api/ws/instruction/ws_instruction_server_base.py,sha256=zXS0gO8eKkz6sVzY4Ei1RcQhW5_Tb32OQ-g3lbQD_pc,5033
@@ -25,22 +25,23 @@ kaq_quant_common/api/ws/models.py,sha256=onvZydQBWIoSSTmabZDlLgYCa1TppuCQJb5noO3
25
25
  kaq_quant_common/api/ws/ws_client_base.py,sha256=QiQnZN3DJUIpP0YDLskx_A5Axu9pdSoQm4slnAQYhUE,9463
26
26
  kaq_quant_common/api/ws/ws_server_base.py,sha256=-JFA5fnYHXPYBZ09aZmhYuhgDHFfJbkX-ppnbLfTexY,11574
27
27
  kaq_quant_common/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
28
- kaq_quant_common/common/ddb_table_monitor.py,sha256=CGwOxJWIWek6UX97CZJxMB5WXh3oin4hJO9PFaFiEko,3768
29
- kaq_quant_common/common/http_monitor.py,sha256=Uet5nXnhr_6-ennoI9syzkXu6Z9DgNk9r2d8UD1JEpM,2444
30
- kaq_quant_common/common/modules/limit_order_helper.py,sha256=TPvx6TwJ_-IvYCzZKMdV1942G4qz3JYaApIvjHJZRA8,2975
31
- kaq_quant_common/common/modules/limit_order_symbol_monitor.py,sha256=euWrustYLoE4tXB1K_6NxLScBu4kwyuqysiX0QlczgU,2929
32
- kaq_quant_common/common/modules/limit_order_symbol_monitor_group.py,sha256=QHkJIYNUTBfeBnibt9D5iBZIWn1onyK_XK1fkkTM8SY,2383
33
- kaq_quant_common/common/monitor_base.py,sha256=VMboqTRO_iDhKQyAoSeCXBOE7Li27O7pHtjmBO7xahg,2551
34
- kaq_quant_common/common/monitor_group.py,sha256=WvvWJJwilhbYFwoup7mtooP5bK0zEe9J36tRHsC5c5g,2959
28
+ kaq_quant_common/common/ddb_table_monitor.py,sha256=7Yihz_uGGujo_QqqPl45Gp8fwUMMw1auXx5egbzyYlE,3662
29
+ kaq_quant_common/common/http_monitor.py,sha256=_yChiwfVv1c5g_lKgYUjWY40fX61BWVK8SL4kXwRfwk,2375
30
+ kaq_quant_common/common/modules/limit_order_helper.py,sha256=Pbh1RHapr9D0Uacup5oQqeXgfI72zLAG2vZHEjPgoPY,2894
31
+ kaq_quant_common/common/modules/limit_order_symbol_monitor.py,sha256=cizWXXqeHWYc0MM26qfDtSz9wFPMccAHBL0Fk_XfVGw,2853
32
+ kaq_quant_common/common/modules/limit_order_symbol_monitor_group.py,sha256=-H4Aw82DwP-OQ0xGF2csiVX7QSkeMu8tPusAzbQbd3Y,2314
33
+ kaq_quant_common/common/monitor_base.py,sha256=E4EUMsO3adNltCDNRgxkvUSbTTfKOL9S1zzN3WkZvpU,2467
34
+ kaq_quant_common/common/monitor_group.py,sha256=cNLD-vU6CI8_2u5oV_joxDavK64weaUD0UND1__Hfuo,2862
35
35
  kaq_quant_common/common/redis_table_monitor.py,sha256=nckt1-Jq2hU2fBA-OWSRyoSwOCmDZg79u1VRaAI7ArA,4464
36
- kaq_quant_common/common/statistics/kline_history_statistics.py,sha256=RPaCN2x6qAfJutCyIwOc8TbOZmcLtmo-stfv-mAPaaI,6960
37
- kaq_quant_common/common/ws_wrapper.py,sha256=pvueZWJX5UecrIXwOMsHCpolfeFAboL6kGr0-GvR-Uw,473
36
+ kaq_quant_common/common/statistics/funding_rate_history_statistics.py,sha256=DFEhotfQkv83pzkGghDXb0sSFJo4rYpS2AkVXLANIl0,8533
37
+ kaq_quant_common/common/statistics/kline_history_statistics.py,sha256=pQgWkP7Z0nRUm1FBb3ssy_uHFs4mnYLuTXFkz36PHWk,7839
38
+ kaq_quant_common/common/ws_wrapper.py,sha256=JNJ0CIjDXgCsRjOLSbCi7ysYDHw7tT_aK7V4ADqw3vA,452
38
39
  kaq_quant_common/config/config.yaml,sha256=ST_QBLo7kwVaoNOvuN3mpeSF7LPNSWdD7EjxrBYZYBs,230
39
40
  kaq_quant_common/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
41
  kaq_quant_common/resources/kaq_ddb_pool_stream_read_resources.py,sha256=Y-rtGpBF3bNh2mPZ2Lze6D9JZnpkqh24OEh7okikh1w,2536
41
42
  kaq_quant_common/resources/kaq_ddb_stream_init_resources.py,sha256=0FY0cmqedrLSYoaHJah2QiO0L7l3lsQJzIfXXpd9WSQ,3347
42
43
  kaq_quant_common/resources/kaq_ddb_stream_read_resources.py,sha256=yqeruZELmxAKjVsdnZ7ieAeV3Wt7KpFYJdt8Vn_Y_qA,3163
43
- kaq_quant_common/resources/kaq_ddb_stream_write_resources.py,sha256=JSPJeq3YboDgXNcakCo5n7x-AnBc6tFem4VTUWIdpfA,4096
44
+ kaq_quant_common/resources/kaq_ddb_stream_write_resources.py,sha256=pebBaDypkY6Mn--Od5Wh1_ZfHewbQH3ce_JsfiWsyl4,4139
44
45
  kaq_quant_common/resources/kaq_mysql_init_resources.py,sha256=UcqWey6LgoMqvLq1SxK33nS6-rkViGYhzUPxcrucOks,827
45
46
  kaq_quant_common/resources/kaq_mysql_resources.py,sha256=j-rvzWs_AMCijj2H_4IPLXFVzS0BTb3x2qVfak7O_lA,13224
46
47
  kaq_quant_common/resources/kaq_postgresql_resources.py,sha256=iG1eYkciI0xUIBdEpGqKGOLBFxvVrfbBoTuaOmhQ0v0,1762
@@ -54,12 +55,12 @@ kaq_quant_common/utils/enums_utils.py,sha256=UH7epXLxRJ9fLNzzFe5ksfv1fdACfkeCD3i
54
55
  kaq_quant_common/utils/error_utils.py,sha256=u9jGnfQItSSgCeFJf8_67ud_F_uV_sY5Dh5HcbILJDs,423
55
56
  kaq_quant_common/utils/hash_utils.py,sha256=uAiRbiIpPjVLWD-6X0EZtn6_zDkiMDIcjVqEhWn54vU,1672
56
57
  kaq_quant_common/utils/log_time_utils.py,sha256=thuCD6j6eu9YUuhBBq2DGkrDpXVh1PvuoUozR1S8q9g,832
57
- kaq_quant_common/utils/logger_utils.py,sha256=pYYw9uc6eD30sQpseyIf7rzz2MPdsYnBruaAv8B3zbs,2527
58
+ kaq_quant_common/utils/logger_utils.py,sha256=uj4Z0QEdm8-BnUdqvWHmg9BT-mhS35KefQhHTi1U9gY,2526
58
59
  kaq_quant_common/utils/mytt_utils.py,sha256=gMdxJu_PV140Sxwjtnv5ppf483PPgsudPDlbNRsk_PU,14078
59
- kaq_quant_common/utils/signal_utils.py,sha256=MZX2VHj7NXiqwCFAzshn0vEYul-j9bXIeRON-oufxpg,734
60
+ kaq_quant_common/utils/signal_utils.py,sha256=zBSyEltNTKqkQCsrETd47kEBb3Q_OWUBUn2W5wonFyU,711
60
61
  kaq_quant_common/utils/sqlite_utils.py,sha256=UDDFKfwL0N-jFifl40HdyOCENh2YQfW5so6hRaSJpv0,5722
61
- kaq_quant_common/utils/uuid_utils.py,sha256=OST_qafowMk4kl8Z5P9AoAg3Og9XSRRc6_hrL6HU0Gc,76
62
+ kaq_quant_common/utils/uuid_utils.py,sha256=pm_pnXpd8n9CI66x3A20cOEUiriJyqHaKGCeLrgkBxU,71
62
63
  kaq_quant_common/utils/yml_utils.py,sha256=gcKjb_-uuUajBGAl5QBPIZTg2wXm7qeeJvtHflj_zOE,4513
63
- kaq_quant_common-0.1.83.dist-info/METADATA,sha256=9JesL3dsrh9czF9WbEVtEV7F38hCwDlg0i2OEtIjt2c,1971
64
- kaq_quant_common-0.1.83.dist-info/WHEEL,sha256=M5asmiAlL6HEcOq52Yi5mmk9KmTVjY2RDPtO4p9DMrc,88
65
- kaq_quant_common-0.1.83.dist-info/RECORD,,
64
+ kaq_quant_common-0.1.85.dist-info/METADATA,sha256=VNPjNY7SWi_wUJxYNOWGOr9zGBDeg2QW7_KO7pdeH-4,1971
65
+ kaq_quant_common-0.1.85.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
66
+ kaq_quant_common-0.1.85.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.2.0
2
+ Generator: poetry-core 2.2.1
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any