kaq-quant-common 0.2.17__py3-none-any.whl → 0.2.18__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.
@@ -1,6 +1,6 @@
1
1
  # 定义 客户端
2
2
  import time
3
- from typing import Type, TypeVar, Callable, Optional
3
+ from typing import Callable, Optional, Type, TypeVar
4
4
 
5
5
  from kaq_quant_common.api.rest.api_client_base import ApiClientBase
6
6
  from kaq_quant_common.api.rest.instruction.models import (
@@ -8,6 +8,10 @@ from kaq_quant_common.api.rest.instruction.models import (
8
8
  from kaq_quant_common.api.rest.instruction.models.account import (
9
9
  AccountIncomeRequest, AccountIncomeResponse, ContractBalanceRequest,
10
10
  ContractBalanceResponse)
11
+ from kaq_quant_common.api.rest.instruction.models.kline import (KlineRequest,
12
+ KlineResponse)
13
+ from kaq_quant_common.api.rest.instruction.models.loan import (
14
+ QueryFlexibleLoanAssetRequest, QueryFlexibleLoanAssetResponse)
11
15
  from kaq_quant_common.api.rest.instruction.models.order import (
12
16
  AllOpenOrdersRequest, AllOpenOrdersResponse, CancelOrderRequest,
13
17
  CancelOrderResponse, ChangeLeverageRequest, ChangeLeverageResponse,
@@ -89,6 +93,14 @@ class InstructionClient(ApiClientBase):
89
93
  def query_open_interest(self, request: QueryOpenInterestRequest) -> QueryOpenInterestResponse:
90
94
  return self._make_request("query_open_interest", request, QueryOpenInterestResponse)
91
95
 
96
+ # k线
97
+ def kline(self, request: KlineRequest) -> KlineResponse:
98
+ return self._make_request("kline", request, KlineResponse)
99
+
100
+ # 查询活期借币种数据
101
+ def query_flexible_loan_asset(self, request: QueryFlexibleLoanAssetRequest) -> QueryFlexibleLoanAssetResponse:
102
+ return self._make_request("query_flexible_loan_asset", request, QueryFlexibleLoanAssetResponse)
103
+
92
104
  # ==================== 异步方法 ====================
93
105
 
94
106
  async def _make_request_async(self, method: str, request: InstructionRequestBase, response_model: Type[R]) -> R:
@@ -152,6 +164,14 @@ class InstructionClient(ApiClientBase):
152
164
  async def query_open_interest_async(self, request: QueryOpenInterestRequest) -> QueryOpenInterestResponse:
153
165
  return await self._make_request_async("query_open_interest", request, QueryOpenInterestResponse)
154
166
 
167
+ # 异步k线
168
+ async def kline_async(self, request: KlineRequest) -> KlineResponse:
169
+ return await self._make_request_async("kline", request, KlineResponse)
170
+
171
+ # 异步查询活期借币种数据
172
+ async def query_flexible_loan_asset_async(self, request: QueryFlexibleLoanAssetRequest) -> QueryFlexibleLoanAssetResponse:
173
+ return await self._make_request_async("query_flexible_loan_asset", request, QueryFlexibleLoanAssetResponse)
174
+
155
175
  # ==================== 回调方法 ====================
156
176
 
157
177
  def _make_request_callback(
@@ -285,4 +305,22 @@ class InstructionClient(ApiClientBase):
285
305
  on_success: Optional[Callable[[QueryOpenInterestResponse], None]] = None,
286
306
  on_error: Optional[Callable[[Exception], None]] = None
287
307
  ) -> None:
288
- self._make_request_callback("query_open_interest", request, QueryOpenInterestResponse, on_success, on_error)
308
+ self._make_request_callback("query_open_interest", request, QueryOpenInterestResponse, on_success, on_error)
309
+
310
+ # 回调k线
311
+ def kline_callback(
312
+ self,
313
+ request: KlineRequest,
314
+ on_success: Optional[Callable[[KlineResponse], None]] = None,
315
+ on_error: Optional[Callable[[Exception], None]] = None
316
+ ) -> None:
317
+ self._make_request_callback("kline", request, KlineResponse, on_success, on_error)
318
+
319
+ # 回调查询活期借币种数据
320
+ def query_flexible_loan_asset_callback(
321
+ self,
322
+ request: QueryFlexibleLoanAssetRequest,
323
+ on_success: Optional[Callable[[QueryFlexibleLoanAssetResponse], None]] = None,
324
+ on_error: Optional[Callable[[Exception], None]] = None
325
+ ) -> None:
326
+ self._make_request_callback("query_flexible_loan_asset", request, QueryFlexibleLoanAssetResponse, on_success, on_error)
@@ -4,31 +4,38 @@ from abc import ABC, abstractmethod
4
4
 
5
5
  from kaq_quant_common.api.common.api_interface import ApiInterface, api_method
6
6
  from kaq_quant_common.api.rest.api_server_base import ApiServerBase
7
- from kaq_quant_common.api.rest.instruction.helper.order_helper import \
8
- OrderHelper
9
- from kaq_quant_common.api.rest.instruction.helper.mock_order_helper import \
10
- MockOrderHelper
11
- from kaq_quant_common.api.rest.instruction.helper.commission_helper import \
12
- CommissionHelper
13
- from kaq_quant_common.api.rest.instruction.models import \
14
- InstructionResponseBase
7
+ from kaq_quant_common.api.rest.instruction.helper.commission_helper import CommissionHelper
8
+ from kaq_quant_common.api.rest.instruction.helper.mock_order_helper import MockOrderHelper
9
+ from kaq_quant_common.api.rest.instruction.helper.order_helper import OrderHelper
10
+ from kaq_quant_common.api.rest.instruction.models import InstructionResponseBase
15
11
  from kaq_quant_common.api.rest.instruction.models.account import (
16
- AccountIncomeRequest, AccountIncomeResponse, ContractBalanceRequest,
17
- ContractBalanceResponse)
12
+ AccountIncomeRequest,
13
+ AccountIncomeResponse,
14
+ ContractBalanceRequest,
15
+ ContractBalanceResponse,
16
+ )
17
+ from kaq_quant_common.api.rest.instruction.models.kline import KlineRequest, KlineResponse
18
+ from kaq_quant_common.api.rest.instruction.models.loan import QueryFlexibleLoanAssetRequest, QueryFlexibleLoanAssetResponse
18
19
  from kaq_quant_common.api.rest.instruction.models.order import (
19
- AllOpenOrdersRequest, AllOpenOrdersResponse, CancelOrderRequest,
20
- CancelOrderResponse, ChangeLeverageRequest, ChangeLeverageResponse,
21
- LimitOrderBookRequest, LimitOrderBookResponse, ModifyOrderRequest,
22
- ModifyOrderResponse, OrderRequest, OrderResponse, QuerySymbolConfigRequest,
23
- QuerySymbolConfigResponse)
24
- from kaq_quant_common.api.rest.instruction.models.position import (
25
- QueryOpenInterestRequest, QueryOpenInterestResponse)
26
- from kaq_quant_common.api.rest.instruction.models.transfer import (
27
- TransferRequest, TransferResponse)
28
- from kaq_quant_common.resources.kaq_mysql_resources import \
29
- KaqQuantMysqlRepository
30
- from kaq_quant_common.resources.kaq_redis_resources import \
31
- KaqQuantRedisRepository
20
+ AllOpenOrdersRequest,
21
+ AllOpenOrdersResponse,
22
+ CancelOrderRequest,
23
+ CancelOrderResponse,
24
+ ChangeLeverageRequest,
25
+ ChangeLeverageResponse,
26
+ LimitOrderBookRequest,
27
+ LimitOrderBookResponse,
28
+ ModifyOrderRequest,
29
+ ModifyOrderResponse,
30
+ OrderRequest,
31
+ OrderResponse,
32
+ QuerySymbolConfigRequest,
33
+ QuerySymbolConfigResponse,
34
+ )
35
+ from kaq_quant_common.api.rest.instruction.models.position import QueryOpenInterestRequest, QueryOpenInterestResponse
36
+ from kaq_quant_common.api.rest.instruction.models.transfer import TransferRequest, TransferResponse
37
+ from kaq_quant_common.resources.kaq_mysql_resources import KaqQuantMysqlRepository
38
+ from kaq_quant_common.resources.kaq_redis_resources import KaqQuantRedisRepository
32
39
 
33
40
 
34
41
  class InstructionServerBase(ApiServerBase, ApiInterface, ABC):
@@ -71,44 +78,28 @@ class InstructionServerBase(ApiServerBase, ApiInterface, ABC):
71
78
  直接在父类处理,子类无需重写
72
79
  """
73
80
  ret = OrderResponse(orders=[])
74
-
81
+
75
82
  # 遍历所有订单
76
83
  for order in request.orders:
77
84
  # 获取模拟成交价
78
85
  mock_fill_price = order.current_price
79
-
86
+
80
87
  # 从commission_helper获取手续费率,如果获取失败使用默认值0.0005
81
- mock_fee_rate = self._commission_helper.get_taker_commission_rate(
82
- symbol=order.symbol,
83
- default_rate=0.0005
84
- )
85
-
88
+ mock_fee_rate = self._commission_helper.get_taker_commission_rate(symbol=order.symbol, default_rate=0.0005)
89
+
86
90
  # 使用mock_order_helper处理
87
91
  try:
88
- self._mock_order_helper.process_order(
89
- order=order,
90
- mock_fill_price=mock_fill_price,
91
- mock_fee_rate=mock_fee_rate
92
- )
92
+ self._mock_order_helper.process_order(order=order, mock_fill_price=mock_fill_price, mock_fee_rate=mock_fee_rate)
93
93
  # 成功的订单
94
94
  from kaq_quant_common.api.rest.instruction.models.order import OpenedOrderInfo
95
- ret.orders.append(
96
- OpenedOrderInfo(
97
- order_id=order.order_id,
98
- symbol=order.symbol
99
- )
100
- )
95
+
96
+ ret.orders.append(OpenedOrderInfo(order_id=order.order_id, symbol=order.symbol))
101
97
  except Exception as e:
102
98
  self._logger.error(f"Mock order failed: {e}")
103
99
  from kaq_quant_common.api.rest.instruction.models.order import OpenedOrderInfo
104
- ret.orders.append(
105
- OpenedOrderInfo(
106
- order_id=order.order_id,
107
- symbol=order.symbol,
108
- message=str(e)
109
- )
110
- )
111
-
100
+
101
+ ret.orders.append(OpenedOrderInfo(order_id=order.order_id, symbol=order.symbol, message=str(e)))
102
+
112
103
  return ret
113
104
 
114
105
  # 修改订单
@@ -145,22 +136,32 @@ class InstructionServerBase(ApiServerBase, ApiInterface, ABC):
145
136
  @api_method(ContractBalanceRequest, ContractBalanceResponse)
146
137
  def contract_balance(self, request: ContractBalanceRequest) -> ContractBalanceResponse:
147
138
  return self._on_contract_balance(request)
148
-
139
+
149
140
  # 查询5档深度
150
141
  @api_method(LimitOrderBookRequest, LimitOrderBookResponse)
151
142
  def get_limit_order(self, request: LimitOrderBookRequest) -> LimitOrderBookResponse:
152
143
  return self._on_get_limit_order(request)
153
-
144
+
154
145
  # 查询账户损益资金流水
155
146
  @api_method(AccountIncomeRequest, AccountIncomeResponse)
156
147
  def get_account_income(self, request: AccountIncomeRequest) -> AccountIncomeResponse:
157
148
  return self._on_get_account_income(request)
158
-
149
+
159
150
  # 查询未平仓合约数量
160
151
  @api_method(QueryOpenInterestRequest, QueryOpenInterestResponse)
161
152
  def query_open_interest(self, request: QueryOpenInterestRequest) -> QueryOpenInterestResponse:
162
153
  return self._on_query_open_interest(request)
163
154
 
155
+ # 查询K线
156
+ @api_method(KlineRequest, KlineResponse)
157
+ def kline(self, request: KlineRequest) -> KlineResponse:
158
+ return self._on_kline(request)
159
+
160
+ # 查询活期借币种数据
161
+ @api_method(QueryFlexibleLoanAssetRequest, QueryFlexibleLoanAssetResponse)
162
+ def query_flexible_loan_asset(self, request: QueryFlexibleLoanAssetRequest) -> QueryFlexibleLoanAssetResponse:
163
+ return self._on_query_flexible_loan_asset(request)
164
+
164
165
  # ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ abstract methods
165
166
 
166
167
  @abstractmethod
@@ -205,4 +206,12 @@ class InstructionServerBase(ApiServerBase, ApiInterface, ABC):
205
206
 
206
207
  @abstractmethod
207
208
  def _on_query_open_interest(self, request: QueryOpenInterestRequest) -> QueryOpenInterestResponse:
208
- pass
209
+ pass
210
+
211
+ # TODO@abstractmethod
212
+ def _on_kline(self, request: KlineRequest) -> KlineResponse:
213
+ pass
214
+
215
+ # TODO@abstractmethod
216
+ def _on_query_flexible_loan_asset(self, request: QueryFlexibleLoanAssetRequest) -> QueryFlexibleLoanAssetResponse:
217
+ pass
@@ -1,17 +1,17 @@
1
- # 定义model
2
- from typing import Optional
3
-
4
- from pydantic import BaseModel
5
-
6
-
7
- #
8
- class InstructionRequestBase(BaseModel):
9
- # 时间
10
- event_time: Optional[int] = None
11
- # 任务id
12
- task_id: Optional[str] = None
13
-
14
-
15
- class InstructionResponseBase(BaseModel):
16
- # 时间
17
- event_time: Optional[int] = None
1
+ # 定义model
2
+ from typing import Optional
3
+
4
+ from pydantic import BaseModel
5
+
6
+
7
+ #
8
+ class InstructionRequestBase(BaseModel):
9
+ # 时间
10
+ event_time: Optional[int] = None
11
+ # 任务id
12
+ task_id: Optional[str] = None
13
+
14
+
15
+ class InstructionResponseBase(BaseModel):
16
+ # 时间
17
+ event_time: Optional[int] = None
@@ -0,0 +1,60 @@
1
+ from enum import Enum
2
+ from typing import Optional
3
+
4
+ from . import InstructionRequestBase, InstructionResponseBase
5
+ from pydantic import BaseModel
6
+
7
+
8
+ # k线数据
9
+ class KlineData(BaseModel):
10
+ # 时间戳-秒
11
+ time: int
12
+ # 开盘价
13
+ open: float
14
+ # 最高价
15
+ high: float
16
+ # 最低价
17
+ low: float
18
+ # 收盘价
19
+ close: float
20
+ # 成交量
21
+ volume: float
22
+
23
+
24
+ # 间隔枚举
25
+ class KlineInterval(str, Enum):
26
+ ONE_MINUTE = "1m"
27
+ THREE_MINUTE = "3m"
28
+ FIVE_MINUTE = "5m"
29
+ FIFTEEN_MINUTE = "15m"
30
+ THIRTY_MINUTE = "30m"
31
+ ONE_HOUR = "1h"
32
+ TWO_HOUR = "2h"
33
+ FOUR_HOUR = "4h"
34
+ SIX_HOUR = "6h"
35
+ EIGHT_HOUR = "8h"
36
+ TWELVE_HOUR = "12h"
37
+ ONE_DAY = "1d"
38
+ THREE_DAY = "3d"
39
+ ONE_WEEK = "1w"
40
+ ONE_MONTH = "1M"
41
+
42
+
43
+ class KlineRequest(InstructionRequestBase):
44
+ # 交易对
45
+ symbol: str
46
+ # 间隔
47
+ interval: KlineInterval
48
+ # 开始时间-毫秒
49
+ start_time: Optional[int] = None
50
+ # 结束时间-毫秒
51
+ end_time: Optional[int] = None
52
+ # 返回数量
53
+ limit: Optional[int] = None
54
+ # 是否现货
55
+ spot: Optional[bool] = None
56
+
57
+
58
+ class KlineResponse(InstructionResponseBase):
59
+ # k线数据
60
+ data: list[KlineData]
@@ -1,32 +1,32 @@
1
- from enum import Enum
2
-
3
- from . import InstructionRequestBase, InstructionResponseBase
4
-
5
- # ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 划转
6
-
7
-
8
- # 划转类型
9
- class TransferType(int, Enum):
10
- # 资金&现货
11
- FUNDING_SPOT = 1
12
- # 资金&合约
13
- FUNDING_FUTURES = 2
14
- # 合约&现货
15
- SPOT_FUTURES = 3
16
-
17
-
18
- # 划转请求
19
- class TransferRequest(InstructionRequestBase):
20
- # 划转类型
21
- type: TransferType
22
- # 资产/币种
23
- assets: str
24
- # 划转数量
25
- amount: float
26
- # 划转方向 1正向,2反向
27
- direction: int
28
-
29
-
30
- # 划转响应
31
- class TransferResponse(InstructionResponseBase):
32
- transfer_id: str
1
+ from enum import Enum
2
+
3
+ from . import InstructionRequestBase, InstructionResponseBase
4
+
5
+ # ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 划转
6
+
7
+
8
+ # 划转类型
9
+ class TransferType(int, Enum):
10
+ # 资金&现货
11
+ FUNDING_SPOT = 1
12
+ # 资金&合约
13
+ FUNDING_FUTURES = 2
14
+ # 合约&现货
15
+ SPOT_FUTURES = 3
16
+
17
+
18
+ # 划转请求
19
+ class TransferRequest(InstructionRequestBase):
20
+ # 划转类型
21
+ type: TransferType
22
+ # 资产/币种
23
+ assets: str
24
+ # 划转数量
25
+ amount: float
26
+ # 划转方向 1正向,2反向
27
+ direction: int
28
+
29
+
30
+ # 划转响应
31
+ class TransferResponse(InstructionResponseBase):
32
+ transfer_id: str
@@ -1,23 +1,23 @@
1
- from typing import Optional
2
-
3
- from pydantic import BaseModel
4
-
5
-
6
- class FundingRateEvent(BaseModel):
7
- # 使用毫秒时间戳,保持与现有事件风格一致
8
- event_time: int
9
- exchange_symbol: Optional[str] = None
10
- exchange: Optional[str] = None
11
- symbol: Optional[str] = None
12
- open_rate: Optional[float] = None
13
- close_rate: Optional[float] = None
14
- high_rate: Optional[float] = None
15
- low_rate: Optional[float] = None
16
- # 毫秒时间戳
17
- close_time: Optional[int] = None
18
- # 毫秒时间戳
19
- next_event_time: Optional[int] = None
20
-
21
- # 兼容表中其他字段
22
- id: Optional[str] = None
23
- ctimestamp: Optional[str] = None
1
+ from typing import Optional
2
+
3
+ from pydantic import BaseModel
4
+
5
+
6
+ class FundingRateEvent(BaseModel):
7
+ # 使用毫秒时间戳,保持与现有事件风格一致
8
+ event_time: int
9
+ exchange_symbol: Optional[str] = None
10
+ exchange: Optional[str] = None
11
+ symbol: Optional[str] = None
12
+ open_rate: Optional[float] = None
13
+ close_rate: Optional[float] = None
14
+ high_rate: Optional[float] = None
15
+ low_rate: Optional[float] = None
16
+ # 毫秒时间戳
17
+ close_time: Optional[int] = None
18
+ # 毫秒时间戳
19
+ next_event_time: Optional[int] = None
20
+
21
+ # 兼容表中其他字段
22
+ id: Optional[str] = None
23
+ ctimestamp: Optional[str] = None