httptrading 1.0.2__py3-none-any.whl → 1.0.5__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.
httptrading/model.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import enum
2
+ from typing import Type
2
3
  from datetime import datetime
3
4
  from dataclasses import dataclass, field
4
5
 
@@ -164,6 +165,82 @@ class BrokerMeta:
164
165
  detect_package: DetectPkg = None
165
166
 
166
167
 
168
+ class JsonDefault:
169
+ @classmethod
170
+ def json_default(cls, obj):
171
+ if isinstance(obj, Position):
172
+ return {
173
+ 'type': 'position',
174
+ 'broker': obj.broker,
175
+ 'brokerDisplay': obj.broker_display,
176
+ 'contract': cls.json_default(obj.contract),
177
+ 'unit': obj.unit.name,
178
+ 'currency': obj.currency,
179
+ 'qty': obj.qty,
180
+ }
181
+ if isinstance(obj, Contract):
182
+ return {
183
+ 'type': 'contract',
184
+ 'tradeType': obj.trade_type.name,
185
+ 'region': obj.region,
186
+ 'ticker': obj.ticker,
187
+ }
188
+ if isinstance(obj, Cash):
189
+ return {
190
+ 'type': 'cash',
191
+ 'currency': obj.currency,
192
+ 'amount': obj.amount,
193
+ }
194
+ if isinstance(obj, MarketStatus):
195
+ return {
196
+ 'type': 'marketStatus',
197
+ 'region': obj.region,
198
+ 'originStatus': obj.origin_status,
199
+ 'unifiedStatus': obj.unified_status.name,
200
+ }
201
+ if isinstance(obj, Quote):
202
+ return {
203
+ 'type': 'quote',
204
+ 'contract': cls.json_default(obj.contract),
205
+ 'currency': obj.currency,
206
+ 'isTradable': obj.is_tradable,
207
+ 'latest': obj.latest,
208
+ 'preClose': obj.pre_close,
209
+ 'highPrice': obj.high_price,
210
+ 'lowPrice': obj.low_price,
211
+ 'openPrice': obj.open_price,
212
+ 'timestamp': int(obj.time.timestamp() * 1000),
213
+ }
214
+ if isinstance(obj, Order):
215
+ return {
216
+ 'type': 'order',
217
+ 'orderId': obj.order_id,
218
+ 'currency': obj.currency,
219
+ 'qty': obj.qty,
220
+ 'filledQty': obj.filled_qty,
221
+ 'avgPrice': obj.avg_price,
222
+ 'errorReason': obj.error_reason,
223
+ 'isCanceled': obj.is_canceled,
224
+ 'isFilled': obj.is_filled,
225
+ 'isCompleted': obj.is_completed,
226
+ 'isCancelable': obj.is_cancelable,
227
+ }
228
+ raise TypeError(f"Object of type {obj.__class__.__name__} is not JSON serializable")
229
+
230
+
231
+ class HtGlobalConfig:
232
+ # 提供一个静态文件目录, 使得当收到推送的订单时将订单落盘为 json 文件.
233
+ # 对于一些没有提供永久查询单个订单接口的交易通道, 访问静态文件可以是查询历史订单的击穿方法.
234
+ # 注意, 落盘的文件名是"{实例ID}-{订单号}.json"格式, 不确定同样一家交易通道, 不同的交易品种之间是否会撞号.
235
+ # 例如, 假如平台先做的证券交易, 后面组了一个期货团队, 然后开放接口团队接入的是两套没有交集的订单系统, 没做订单号码二次映射.
236
+ STREAM_DUMP_FOLDER: str = None
237
+ # 对于一些没有提供永久查询单个订单接口的交易通道, 可以在启动服务时把当时的活动订单更新一遍.
238
+ # 比如重启服务后担心漏掉订单的推送.
239
+ DUMP_ACTIVE_ORDERS: bool = False
240
+ # 如果需要定制接口返回对象的行为, 这里替换为自定义的类
241
+ JSON_DEFAULT: Type[JsonDefault] = JsonDefault
242
+
243
+
167
244
  __all__ = [
168
245
  'TradeType',
169
246
  'Unit',
@@ -179,4 +256,6 @@ __all__ = [
179
256
  'Order',
180
257
  'DetectPkg',
181
258
  'BrokerMeta',
259
+ 'JsonDefault',
260
+ 'HtGlobalConfig',
182
261
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: httptrading
3
- Version: 1.0.2
3
+ Version: 1.0.5
4
4
  Summary: 统一交易通道的接口服务
5
5
  Author-email: songwei <github@songwei.name>
6
6
  License: MIT
@@ -10,6 +10,7 @@ License-File: LICENSE
10
10
  Requires-Dist: aiohttp>=3.12.6
11
11
  Requires-Dist: humanize>=4.12.3
12
12
  Requires-Dist: tomlkit>=0.13.2
13
+ Requires-Dist: nest-asyncio>=1.6.0
13
14
  Dynamic: license-file
14
15
 
15
16
  # httptrading
@@ -397,6 +398,10 @@ POST /httptrading/api/{instanceId}/order/cancel
397
398
  }
398
399
  ```
399
400
 
401
+ ```
402
+ ⚠️ 撤单接口仅完成对交易通道的撤单接口调用, 不代表在较短时间后订单可以进入撤销的状态. 一个例子是假日发起撤单, 通道不一定执行撤单而是进入已请求撤单的状态.
403
+ ```
404
+
400
405
 
401
406
  ### 查询单个订单
402
407
 
@@ -423,15 +428,19 @@ GET /httptrading/api/{instanceId}/order/state?orderId={订单号}
423
428
  "errorReason": "", // 如果订单异常, 这里记录错误信息
424
429
  "isCanceled": false, // 是否已撤销
425
430
  "isFilled": false, // 是否全部成交
426
- "isCompleted": false, // 全部成交 或者 有异常 或者 已撤销
427
- "isCancelable": true // 是否可撤的标志
431
+ "isCompleted": false, // 全部成交 或者 有订单异常 或者 已撤销
432
+ "isCancelable": true // 是否可撤的标志, 等价于 not isCompleted and not isPendingCancel
428
433
  }
429
434
  }
430
435
  ```
431
-
432
- ```
433
- 富途证券不支持查询单个订单. 意味着订单结束周期的交易日之后, 将查不到订单.
434
- ```
436
+ ⚠️ 有些交易通道不支持查询单个订单状态, 而是查询活动订单的列表来实现, 意味着订单在结束周期的交易日之后, 将查不到订单.
437
+
438
+ | 交易通道 | 支持查单个订单 |
439
+ |------|---------|
440
+ | 盈透证券 | ❌ |
441
+ | 富途证券 | ❌ |
442
+ | 长桥证券 | ✅ |
443
+ | 老虎证券 | ✅ |
435
444
 
436
445
  交易通道的参数
437
446
  ------------
@@ -0,0 +1,18 @@
1
+ httptrading/__init__.py,sha256=H2kepS94z3YQWMyvM7R3WVbP4iDYgwGssLcYG24dnPQ,306
2
+ httptrading/http_server.py,sha256=MA4ROYG6w-tR5ddDz3Q9XF4ZpCQcEhDDi5jGpYdiZZ4,9124
3
+ httptrading/model.py,sha256=xa-psfYJuEzyR5aB776ErlX1CjhXDsAE2LuR6XI6h2I,7717
4
+ httptrading/broker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ httptrading/broker/base.py,sha256=P149UlFyy277y40qHPH9DdvbEy-j1x26QDllXV6XPMg,5664
6
+ httptrading/broker/futu_sec.py,sha256=-x0_Gb-LxUOUDPuZzAdBVMeX6-CEVrsODfK1jyF0kjA,20081
7
+ httptrading/broker/interactive_brokers.py,sha256=hWCrQs6UrFGH5CwY18yXVAMHRGBOccaTRdLTjSL4Wbw,13340
8
+ httptrading/broker/longbridge.py,sha256=eRuE6VhBB4Hv1HGdRmJuRbbrc6sxk2G1r9lMBlTyMAE,16219
9
+ httptrading/broker/tiger.py,sha256=Wjx2Rbth8hfKROpwlh5eUapvUxe5d-ertA9ycejvpjE,16285
10
+ httptrading/tool/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ httptrading/tool/leaky_bucket.py,sha256=Bvab3Fkn16hhZ1-WLCFcPkbFH_bHHhQ9boLv8HrmGSE,2817
12
+ httptrading/tool/locate.py,sha256=vSIzd09FWKmckkgY3mWtFXQm2Z0VIKv4FCXHT44e61s,2748
13
+ httptrading/tool/time.py,sha256=7eVmZ_td72JLjsBRLjMOHklxltNbOxeN97uSLi7wvIA,2188
14
+ httptrading-1.0.5.dist-info/licenses/LICENSE,sha256=KfMSrfnpo-TOqpCTJqnbcZNl0w7ErxadsMQf8uas_tY,1093
15
+ httptrading-1.0.5.dist-info/METADATA,sha256=U-AE51-YxKgFPGvXXM3oWY6vVwa5--gYtmgmnm_eXlU,17519
16
+ httptrading-1.0.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
+ httptrading-1.0.5.dist-info/top_level.txt,sha256=rsLGrGN6QubO9ILQRktwrWtxfGsGAmWUnQq7XksKu-4,12
18
+ httptrading-1.0.5.dist-info/RECORD,,
@@ -1,18 +0,0 @@
1
- httptrading/__init__.py,sha256=Z9ITAueneLgf-L_TYMfmMwyUcfkBpcPxMFnvjFmRK_o,260
2
- httptrading/http_server.py,sha256=MUf3B_rZmi9KziAeiVTsaQOaSIGBBEK_JQTDuQfAV1Y,10596
3
- httptrading/model.py,sha256=C5Glx6jC1e9Pmyux4lLmJmpGMi7P6IluX5cxpl34noo,4281
4
- httptrading/broker/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- httptrading/broker/base.py,sha256=fqxfLTVavHxfFZDPt9GqhjT_C_9n_xcERahxbeuDywU,4923
6
- httptrading/broker/futu_sec.py,sha256=PbI9lofWKE3rVu0rzxwGofTDFSRHLVnZkbOHqc0TGRA,17872
7
- httptrading/broker/interactive_brokers.py,sha256=seNrJ7TO9fN31f4MSqdEaTy3a1xxuqw5Kg6PMi5CS9Q,12406
8
- httptrading/broker/longbridge.py,sha256=OivkmVTo806XbIH0ZwUjLMOUQGaCtHTZRxuI9j2Pj68,14489
9
- httptrading/broker/tiger.py,sha256=aKOR90T3pUy_QdS0NFpdjMnoNjSJWYb8jfSvJxHcoFM,14292
10
- httptrading/tool/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- httptrading/tool/leaky_bucket.py,sha256=Bvab3Fkn16hhZ1-WLCFcPkbFH_bHHhQ9boLv8HrmGSE,2817
12
- httptrading/tool/locate.py,sha256=vSIzd09FWKmckkgY3mWtFXQm2Z0VIKv4FCXHT44e61s,2748
13
- httptrading/tool/time.py,sha256=7eVmZ_td72JLjsBRLjMOHklxltNbOxeN97uSLi7wvIA,2188
14
- httptrading-1.0.2.dist-info/licenses/LICENSE,sha256=KfMSrfnpo-TOqpCTJqnbcZNl0w7ErxadsMQf8uas_tY,1093
15
- httptrading-1.0.2.dist-info/METADATA,sha256=zVOIp8n4ZK6oIxYEQ40o1kZSE4InX8c0SwscMYB-DHw,16947
16
- httptrading-1.0.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
17
- httptrading-1.0.2.dist-info/top_level.txt,sha256=rsLGrGN6QubO9ILQRktwrWtxfGsGAmWUnQq7XksKu-4,12
18
- httptrading-1.0.2.dist-info/RECORD,,