hyperquant 0.97__py3-none-any.whl → 0.99__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.
@@ -4,7 +4,7 @@ import asyncio
4
4
  import json
5
5
  import random
6
6
  import time
7
- from typing import Any, Literal, Sequence
7
+ from typing import Any, Literal, Optional, Sequence
8
8
 
9
9
  import pybotters
10
10
 
@@ -33,10 +33,19 @@ class Bitmart:
33
33
 
34
34
  self.account_index = account_index
35
35
  self.apis = apis
36
+ self.symbol_to_contract_id: dict[str, str] = {}
36
37
 
37
38
  async def __aenter__(self) -> "Bitmart":
38
39
  await self.update("detail")
39
40
  asyncio.create_task(self.auto_refresh())
41
+
42
+ for entry in self.store.detail.find():
43
+ contract_id = entry.get("contract_id")
44
+ symbol = entry.get("name") or entry.get("display_name")
45
+ if contract_id is None or symbol is None:
46
+ continue
47
+ self.symbol_to_contract_id[str(symbol)] = str(contract_id)
48
+
40
49
  return self
41
50
 
42
51
  async def auto_refresh(self, sec=3600, test=False) -> None:
@@ -325,8 +334,9 @@ class Bitmart:
325
334
  *,
326
335
  category: Literal[1,2,"limit","market"] = "limit",
327
336
  price: float,
328
- volume: float,
329
- way: Literal[1, 2, 3, 4, "open_long", "close_short", "close_long", "open_short", "buy", "sell"] = "open_long",
337
+ qty: float,
338
+ qty_contract: Optional[int] = None,
339
+ side: Literal[1, 2, 3, 4, "open_long", "close_short", "close_long", "open_short", "buy", "sell"] = "open_long",
330
340
  mode: Literal[1, 2, 3, 4, "gtc", "ioc", "fok", "maker_only", "maker-only", "post_only"] = "gtc",
331
341
  open_type: Literal[1, 2, "cross", "isolated"] = "isolated",
332
342
  leverage: int | str = 10,
@@ -334,8 +344,9 @@ class Bitmart:
334
344
  trigger_price: float | None = None,
335
345
  custom_id: int | str | None = None,
336
346
  extra_params: dict[str, Any] | None = None,
337
- ) -> dict[str, Any]:
347
+ ) -> int:
338
348
  """Submit an order via ``submitOrder``.
349
+ 返回值: order_id (int)
339
350
  """
340
351
 
341
352
  contract_id = self.get_contract_id(symbol)
@@ -351,25 +362,31 @@ class Bitmart:
351
362
  raise ValueError(f"Market metadata unavailable for symbol: {symbol}")
352
363
 
353
364
 
354
- contract_size_str = detail.get("contract_size") or detail.get("vol_unit") or "1"
355
- try:
356
- contract_size_val = float(contract_size_str)
357
- except (TypeError, ValueError):
358
- contract_size_val = 1.0
359
- if contract_size_val <= 0:
360
- raise ValueError(f"Invalid contract_size for {symbol}: {contract_size_str}")
361
-
362
- contracts_float = float(volume) / contract_size_val
363
- contracts_int = int(round(contracts_float))
364
- if contracts_int <= 0:
365
- raise ValueError(
366
- f"Volume too small for contract size ({contract_size_val}): volume={volume}"
367
- )
368
- if abs(contracts_float - contracts_int) > 1e-8:
369
- raise ValueError(
370
- f"Volume must be a multiple of contract_size ({contract_size_val}). "
371
- f"Received volume={volume} -> {contracts_float} contracts."
372
- )
365
+ if qty_contract is not None:
366
+
367
+ contract_size_str = detail.get("contract_size") or detail.get("vol_unit") or "1"
368
+ try:
369
+ contract_size_val = float(contract_size_str)
370
+ except (TypeError, ValueError):
371
+ contract_size_val = 1.0
372
+ if contract_size_val <= 0:
373
+ raise ValueError(f"Invalid contract_size for {symbol}: {contract_size_str}")
374
+
375
+ contracts_float = float(qty) / contract_size_val
376
+ contracts_int = int(round(contracts_float))
377
+ if contracts_int <= 0:
378
+ raise ValueError(
379
+ f"Volume too small for contract size ({contract_size_val}): volume={qty}"
380
+ )
381
+ if abs(contracts_float - contracts_int) > 1e-8:
382
+ raise ValueError(
383
+ f"Volume must be a multiple of contract_size ({contract_size_val}). "
384
+ f"Received volume={qty} -> {contracts_float} contracts."
385
+ )
386
+ else:
387
+ contracts_int = int(qty)
388
+ if contracts_int <= 0:
389
+ raise ValueError(f"Volume must be positive integer contracts: volume={qty}")
373
390
 
374
391
  price_unit = detail.get("price_unit") or 1
375
392
  try:
@@ -396,7 +413,7 @@ class Bitmart:
396
413
  price_fmt = f"{adjusted_price:.15f}".rstrip("0").rstrip(".") or "0"
397
414
 
398
415
  way_value = self._normalize_enum(
399
- way,
416
+ side,
400
417
  {
401
418
  "open_long": 1,
402
419
  "close_short": 2,
@@ -460,7 +477,10 @@ class Bitmart:
460
477
 
461
478
  if resp.get("success") is False or resp.get("errno") not in (None, "OK"):
462
479
  raise ValueError(f"Bitmart submitOrder error: {resp}")
463
- return resp
480
+
481
+ # {"errno":"OK","message":"Success","data":{"order_id":3000236525013551},"success":true}
482
+ # 直接取order_id返回
483
+ return resp.get("data", {}).get("order_id")
464
484
 
465
485
  async def cancel_order(
466
486
  self,
@@ -381,7 +381,7 @@ class BitmartDataStore(DataStoreCollection):
381
381
  @property
382
382
  def orders(self) -> Orders:
383
383
  """用户订单 (`userAllOrders`)。
384
-
384
+ key: order_id
385
385
  .. code:: json
386
386
 
387
387
  [
@@ -510,19 +510,19 @@ class BitmartDataStore(DataStoreCollection):
510
510
  {
511
511
  "account_id": 14794011,
512
512
  "coin_code": "USDT",
513
- "available_vol": "0",
514
- "cash_vol": "0",
513
+ "available_vol": "10.970977797397999999",
514
+ "cash_vol": "11.000536099457999999",
515
515
  "freeze_vol": "0",
516
- "realised_vol": "0",
517
- "un_realised_vol": "0",
518
- "earnings_vol": "0",
516
+ "realised_vol": "0.000536099457999999",
517
+ "un_realised_vol": "-0.00001502",
518
+ "earnings_vol": "0.000536099457999999",
519
519
  "total_im": "",
520
520
  "margin_balance": "",
521
521
  "available_balance": "",
522
522
  "trans_out_balance": "",
523
523
  "status": 0,
524
524
  "total_balance": "",
525
- "account_rights": "0",
525
+ "account_rights": "11.000521079457999999",
526
526
  "bonus_voucher_vol": "",
527
527
  "freeze_bonus_voucher_vol": ""
528
528
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hyperquant
3
- Version: 0.97
3
+ Version: 0.99
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,7 +6,7 @@ hyperquant/logkit.py,sha256=nUo7nx5eONvK39GOhWwS41zNRL756P2J7-5xGzwXnTY,8462
6
6
  hyperquant/notikit.py,sha256=x5yAZ_tAvLQRXcRbcg-VabCaN45LUhvlTZnUqkIqfAA,3596
7
7
  hyperquant/broker/auth.py,sha256=C8B5-x8Qcaeafm4ZwPCVFR7GRURmHC3CE4_vdg00Qgw,12139
8
8
  hyperquant/broker/bitget.py,sha256=X_S0LKZ7FZAEb6oEMr1vdGP1fondzK74BhmNTpRDSEA,9488
9
- hyperquant/broker/bitmart.py,sha256=3lAkSy8J2p-M-663cUVFuRU-XtgNEwWAa4SKgeG6Vb8,16798
9
+ hyperquant/broker/bitmart.py,sha256=d9eEWCskoRRAH0knjyT8K-3ob0MK_0uQ9h_0UnQSOJM,17708
10
10
  hyperquant/broker/coinup.py,sha256=eOr8BTRXiTb5tCU2FDmvBdXXgqiwVmCbP5pdeA1ORJ8,20390
11
11
  hyperquant/broker/coinw.py,sha256=SnJU0vASh77rfcpMGWaIfTblQSjQk3vjlW_4juYdbcs,17214
12
12
  hyperquant/broker/edgex.py,sha256=TqUO2KRPLN_UaxvtLL6HnA9dAQXC1sGxOfqTHd6W5k8,18378
@@ -20,7 +20,7 @@ hyperquant/broker/lib/hpstore.py,sha256=LnLK2zmnwVvhEbLzYI-jz_SfYpO1Dv2u2cJaRAb8
20
20
  hyperquant/broker/lib/hyper_types.py,sha256=HqjjzjUekldjEeVn6hxiWA8nevAViC2xHADOzDz9qyw,991
21
21
  hyperquant/broker/lib/util.py,sha256=iMU1qF0CHj5zzlIMEQGwjz-qtEVosEe7slXOCuB7Rcw,566
22
22
  hyperquant/broker/models/bitget.py,sha256=0RwDY75KrJb-c-oYoMxbqxWfsILe-n_Npojz4UFUq7c,11389
23
- hyperquant/broker/models/bitmart.py,sha256=sZQPWDOhLMGdZZzAIP1z2lDKKQeuGZYDiYLjqamK1B4,20326
23
+ hyperquant/broker/models/bitmart.py,sha256=6lOpQXLcuR7MEayvMt_e-okE2A8CCUvpzAT6aCxWSaM,20455
24
24
  hyperquant/broker/models/coinup.py,sha256=X_ngB2_sgTOdfAZqTyeWvCN03j-0_inZ6ugZKW6hR7k,11173
25
25
  hyperquant/broker/models/coinw.py,sha256=LvLMVP7i-qkkTK1ubw8eBkMK2RQmFoKPxdKqmC4IToY,22157
26
26
  hyperquant/broker/models/edgex.py,sha256=vPAkceal44cjTYKQ_0BoNAskOpmkno_Yo1KxgMLPc6Y,33954
@@ -32,6 +32,6 @@ hyperquant/datavison/_util.py,sha256=92qk4vO856RqycO0YqEIHJlEg-W9XKapDVqAMxe6rbw
32
32
  hyperquant/datavison/binance.py,sha256=3yNKTqvt_vUQcxzeX4ocMsI5k6Q6gLZrvgXxAEad6Kc,5001
33
33
  hyperquant/datavison/coinglass.py,sha256=PEjdjISP9QUKD_xzXNzhJ9WFDTlkBrRQlVL-5pxD5mo,10482
34
34
  hyperquant/datavison/okx.py,sha256=yg8WrdQ7wgWHNAInIgsWPM47N3Wkfr253169IPAycAY,6898
35
- hyperquant-0.97.dist-info/METADATA,sha256=LwzokAHUJ7hKAvG0RAfUsx9kSM9qcdti-mXc6sPQrBI,4409
36
- hyperquant-0.97.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
37
- hyperquant-0.97.dist-info/RECORD,,
35
+ hyperquant-0.99.dist-info/METADATA,sha256=Xp8eYdpew89TrwNCR-NUygnlHVMwrQ3SkG8kCogxm28,4409
36
+ hyperquant-0.99.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
37
+ hyperquant-0.99.dist-info/RECORD,,