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.

Files changed (42) hide show
  1. hyperquant/__init__.py +8 -0
  2. hyperquant/broker/auth.py +972 -0
  3. hyperquant/broker/bitget.py +311 -0
  4. hyperquant/broker/bitmart.py +720 -0
  5. hyperquant/broker/coinw.py +487 -0
  6. hyperquant/broker/deepcoin.py +651 -0
  7. hyperquant/broker/edgex.py +500 -0
  8. hyperquant/broker/hyperliquid.py +570 -0
  9. hyperquant/broker/lbank.py +661 -0
  10. hyperquant/broker/lib/edgex_sign.py +455 -0
  11. hyperquant/broker/lib/hpstore.py +252 -0
  12. hyperquant/broker/lib/hyper_types.py +48 -0
  13. hyperquant/broker/lib/polymarket/ctfAbi.py +721 -0
  14. hyperquant/broker/lib/polymarket/safeAbi.py +1138 -0
  15. hyperquant/broker/lib/util.py +22 -0
  16. hyperquant/broker/lighter.py +679 -0
  17. hyperquant/broker/models/apexpro.py +150 -0
  18. hyperquant/broker/models/bitget.py +359 -0
  19. hyperquant/broker/models/bitmart.py +635 -0
  20. hyperquant/broker/models/coinw.py +724 -0
  21. hyperquant/broker/models/deepcoin.py +809 -0
  22. hyperquant/broker/models/edgex.py +1053 -0
  23. hyperquant/broker/models/hyperliquid.py +284 -0
  24. hyperquant/broker/models/lbank.py +557 -0
  25. hyperquant/broker/models/lighter.py +868 -0
  26. hyperquant/broker/models/ourbit.py +1155 -0
  27. hyperquant/broker/models/polymarket.py +1071 -0
  28. hyperquant/broker/ourbit.py +550 -0
  29. hyperquant/broker/polymarket.py +2399 -0
  30. hyperquant/broker/ws.py +132 -0
  31. hyperquant/core.py +513 -0
  32. hyperquant/datavison/_util.py +18 -0
  33. hyperquant/datavison/binance.py +111 -0
  34. hyperquant/datavison/coinglass.py +237 -0
  35. hyperquant/datavison/okx.py +177 -0
  36. hyperquant/db.py +191 -0
  37. hyperquant/draw.py +1200 -0
  38. hyperquant/logkit.py +205 -0
  39. hyperquant/notikit.py +124 -0
  40. hyperquant-1.48.dist-info/METADATA +32 -0
  41. hyperquant-1.48.dist-info/RECORD +42 -0
  42. hyperquant-1.48.dist-info/WHEEL +4 -0
@@ -0,0 +1,635 @@
1
+ from __future__ import annotations
2
+
3
+ import time
4
+ from typing import TYPE_CHECKING, Any, Literal, Sequence
5
+
6
+ from pybotters.store import DataStore, DataStoreCollection
7
+
8
+ if TYPE_CHECKING:
9
+ from pybotters.typedefs import Item
10
+ from pybotters.ws import ClientWebSocketResponse
11
+
12
+
13
+ def _maybe_to_dict(payload: Any) -> Any:
14
+ if payload is None:
15
+ return None
16
+ if hasattr(payload, "to_dict"):
17
+ return payload.to_dict()
18
+ if hasattr(payload, "model_dump"):
19
+ return payload.model_dump()
20
+ return payload
21
+
22
+ class Ticker(DataStore):
23
+ """Bitmart 合约行情数据。"""
24
+
25
+ _KEYS = ["contract_id"]
26
+
27
+ def _onresponse(self, data: Any) -> None:
28
+ payload = _maybe_to_dict(data) or {}
29
+ tickers = payload.get("data", {}).get("tickers") or []
30
+ items: list[dict[str, Any]] = []
31
+ for entry in tickers:
32
+ if not isinstance(entry, dict):
33
+ continue
34
+ contract_id = entry.get("contract_id")
35
+ if contract_id is None:
36
+ continue
37
+ items.append(entry)
38
+ self._clear()
39
+ if items:
40
+ self._insert(items)
41
+
42
+ class Book(DataStore):
43
+ """Bitmart 合约深度数据。"""
44
+
45
+ _KEYS = ["s", "S", "p"]
46
+
47
+ def _init(self) -> None:
48
+ self.limit: int | None = None
49
+ self.id_to_symbol: dict[str, str] = {}
50
+ self._state: dict[str, dict[str, dict[float, float]]] = {}
51
+ self._last_update: float = 0.0
52
+
53
+ @classmethod
54
+ def _make_entry(cls, symbol: str, side: Literal["a", "b"], price: str, size: str) -> dict[str, Any]:
55
+ return {
56
+ "s": symbol,
57
+ "S": side,
58
+ "p": price,
59
+ "q": size,
60
+ }
61
+
62
+ def _on_message(self, msg: dict[str, Any]) -> None:
63
+ data = msg.get("data")
64
+ group = msg.get("group")
65
+ ms_t = msg.get("ms_t")
66
+ if not isinstance(data, dict) or not isinstance(group, str):
67
+ return
68
+
69
+ try:
70
+ _, contract_id = group.split(":", 1)
71
+ except ValueError:
72
+ return
73
+
74
+ symbol = self.id_to_symbol.get(contract_id) or contract_id
75
+
76
+ state = self._state.setdefault(symbol, {"a": {}, "b": {}})
77
+
78
+ way = data.get("way")
79
+ depths = data.get("depths") or []
80
+ if way not in {1, 2} or not isinstance(depths, Sequence):
81
+ return
82
+
83
+ side_key = "b" if way == 1 else "a"
84
+ if self.limit:
85
+ depths = depths[: self.limit]
86
+
87
+ self._find_and_delete({'s': symbol, 'S': side_key})
88
+ self._update([
89
+ self._make_entry(
90
+ symbol,
91
+ side_key,
92
+ entry.get("price", '0'),
93
+ entry.get("vol", '0'),
94
+ )
95
+ for entry in depths
96
+ ])
97
+
98
+ self._last_update = ms_t
99
+
100
+ def _on_message_api(self, msg: dict[str, Any]) -> None:
101
+ data = msg.get("data")
102
+ if not isinstance(data, dict):
103
+ return
104
+ # Some callers embed symbol at top-level; prefer msg["symbol"] when present
105
+ symbol = msg.get("symbol") or data.get("symbol")
106
+ asks = data.get("asks") or []
107
+ bids = data.get("bids") or []
108
+ if self.limit:
109
+ asks = asks[: self.limit]
110
+ bids = bids[: self.limit]
111
+
112
+ self._find_and_delete({'s': symbol})
113
+ # OpenAPI order book arrays are typically [price, size, timestamp]
114
+ def _normalize_level(level: Any) -> tuple[str, str]:
115
+ if isinstance(level, dict):
116
+ return str(level.get("price", "0")), str(level.get("vol", "0"))
117
+ if isinstance(level, (list, tuple)) and len(level) >= 2:
118
+ return str(level[0]), str(level[1])
119
+ return "0", "0"
120
+
121
+ self._update([
122
+ self._make_entry(
123
+ symbol,
124
+ "a",
125
+ *_normalize_level(entry),
126
+ )
127
+ for entry in asks
128
+ ])
129
+ self._update([
130
+ self._make_entry(
131
+ symbol,
132
+ "b",
133
+ *_normalize_level(entry),
134
+ )
135
+ for entry in bids
136
+ ])
137
+
138
+
139
+ def sorted(self, query: Item | None = None, limit: int | None = None) -> dict[str, list[Item]]:
140
+ return self._sorted(
141
+ item_key="S",
142
+ item_asc_key="a",
143
+ item_desc_key="b",
144
+ sort_key="p",
145
+ query=query,
146
+ limit=limit,
147
+ )
148
+
149
+ @property
150
+ def last_update(self) -> float:
151
+ return self._last_update
152
+
153
+
154
+ class Detail(DataStore):
155
+ """Bitmart 合约详情。"""
156
+
157
+ _KEYS = ["name"]
158
+
159
+ def _onresponse(self, data: Any) -> None:
160
+ payload = _maybe_to_dict(data) or {}
161
+ contracts = payload.get("data", {}).get("contracts") or []
162
+
163
+ records: list[dict[str, Any]] = []
164
+ for item in contracts:
165
+ if not isinstance(item, dict):
166
+ continue
167
+ record: dict[str, Any] = {}
168
+ contract = item.get("contract") or {}
169
+ if isinstance(contract, dict):
170
+ record.update(contract)
171
+ risk_limit = item.get("risk_limit") or {}
172
+ if isinstance(risk_limit, dict):
173
+ record.update({f"risk_{k}": v for k, v in risk_limit.items()})
174
+ fee_config = item.get("fee_config") or {}
175
+ if isinstance(fee_config, dict):
176
+ record.update({f"fee_{k}": v for k, v in fee_config.items()})
177
+ plan_order_config = item.get("plan_order_config") or {}
178
+ if isinstance(plan_order_config, dict):
179
+ record.update({f"plan_{k}": v for k, v in plan_order_config.items()})
180
+ tag_detail = item.get("contract_tag_detail") or {}
181
+ if isinstance(tag_detail, dict):
182
+ record.update({f"tag_{k}": v for k, v in tag_detail.items()})
183
+
184
+ contract_id = record.get("contract_id") or contract.get("contract_id")
185
+ if contract_id is None:
186
+ continue
187
+ record["contract_id"] = contract_id
188
+ record["tick_size"] = record.get("price_unit")
189
+ records.append(record)
190
+
191
+ self._clear()
192
+ if records:
193
+ self._insert(records)
194
+
195
+
196
+ class Ticker(DataStore):
197
+ """24h 数据信息。"""
198
+
199
+ _KEYS = ["contract_id"]
200
+
201
+ def _onresponse(self, data: Any) -> None:
202
+ payload = _maybe_to_dict(data) or {}
203
+ tickers = payload.get("data", {}).get("tickers") or []
204
+ items: list[dict[str, Any]] = []
205
+ for entry in tickers:
206
+ if not isinstance(entry, dict):
207
+ continue
208
+ contract_id = entry.get("contract_id")
209
+ if contract_id is None:
210
+ continue
211
+ record = dict(entry)
212
+ record["contract_id"] = contract_id
213
+ items.append(record)
214
+
215
+ self._clear()
216
+ if items:
217
+ self._insert(items)
218
+
219
+
220
+ class Orders(DataStore):
221
+ """订单列表。"""
222
+
223
+ _KEYS = ["order_id"]
224
+
225
+ @staticmethod
226
+ def _normalize(entry: dict[str, Any]) -> dict[str, Any] | None:
227
+ order_id = entry.get("order_id")
228
+ if order_id is None:
229
+ return None
230
+ normalized = dict(entry)
231
+ normalized["order_id"] = order_id
232
+ return normalized
233
+
234
+ def _onresponse(self, data: Any) -> None:
235
+ payload = _maybe_to_dict(data) or {}
236
+ orders = payload.get("data", {}).get("orders") or []
237
+ items: list[dict[str, Any]] = []
238
+ for entry in orders:
239
+ if not isinstance(entry, dict):
240
+ continue
241
+ normalized = self._normalize(entry)
242
+ if normalized:
243
+ items.append(normalized)
244
+ self._clear()
245
+ if items:
246
+ self._insert(items)
247
+
248
+
249
+ class Positions(DataStore):
250
+ """持仓信息。"""
251
+
252
+ _KEYS = ["position_id"]
253
+
254
+ @staticmethod
255
+ def _normalize(entry: dict[str, Any]) -> dict[str, Any] | None:
256
+ position_id = entry.get("position_id")
257
+ if position_id is None:
258
+ return None
259
+ normalized = dict(entry)
260
+ normalized["position_id"] = position_id
261
+ return normalized
262
+
263
+ def _onresponse(self, data: Any) -> None:
264
+ payload = _maybe_to_dict(data) or {}
265
+ positions = payload.get("data", {}).get("positions") or []
266
+ items: list[dict[str, Any]] = []
267
+ for entry in positions:
268
+ if not isinstance(entry, dict):
269
+ continue
270
+ normalized = self._normalize(entry)
271
+ if normalized:
272
+ items.append(normalized)
273
+ self._clear()
274
+ if items:
275
+ self._insert(items)
276
+
277
+
278
+ class Balances(DataStore):
279
+ """账户资产信息。"""
280
+
281
+ _KEYS = ["coin_code"]
282
+
283
+ @staticmethod
284
+ def _normalize(entry: dict[str, Any]) -> dict[str, Any] | None:
285
+ coin = entry.get("coin_code")
286
+ if coin is None:
287
+ return None
288
+ normalized = dict(entry)
289
+ normalized["coin_code"] = coin
290
+ return normalized
291
+
292
+ def _onresponse(self, data: Any) -> None:
293
+ payload = _maybe_to_dict(data) or {}
294
+ assets = payload.get("data", {}).get("assets") or []
295
+ items: list[dict[str, Any]] = []
296
+ for entry in assets:
297
+ if not isinstance(entry, dict):
298
+ continue
299
+ normalized = self._normalize(entry)
300
+ if normalized:
301
+ items.append(normalized)
302
+ self._clear()
303
+ if items:
304
+ self._insert(items)
305
+
306
+
307
+ class BitmartDataStore(DataStoreCollection):
308
+ """Bitmart 合约数据集合。"""
309
+
310
+ def _init(self) -> None:
311
+ self._create("book", datastore_class=Book)
312
+ self._create("detail", datastore_class=Detail)
313
+ self._create("orders", datastore_class=Orders)
314
+ self._create("positions", datastore_class=Positions)
315
+ self._create("balances", datastore_class=Balances)
316
+ self._create("ticker", datastore_class=Ticker)
317
+
318
+ def onmessage(self, msg: Item, ws: ClientWebSocketResponse | None = None) -> None:
319
+ if isinstance(msg, dict):
320
+ group = msg.get("group")
321
+
322
+ if isinstance(group, str):
323
+ if group.startswith("futures/depth"):
324
+ self.book._on_message_api(msg)
325
+ if group.startswith("Depth"):
326
+ self.book._on_message(msg)
327
+
328
+ @property
329
+ def book(self) -> Book:
330
+ """
331
+ .. code:: json
332
+
333
+ {
334
+ "s": "BTCUSDT",
335
+ "S": "a", # 卖单
336
+ "p": "95640.3",
337
+ "q": "0.807"
338
+ }
339
+ """
340
+ return self._get("book")
341
+
342
+ @property
343
+ def detail(self) -> Detail:
344
+ """`ifcontract/contracts_all` 返回的合约配置信息。
345
+
346
+ .. code:: json
347
+
348
+ {
349
+ "contract_id": 1,
350
+ "index_id": 1,
351
+ "name": "BTCUSDT",
352
+ "display_name": "BTCUSDT 永续合约",
353
+ "display_name_en": "BTCUSDT_SWAP",
354
+ "contract_type": 1,
355
+ "base_coin": "BTC",
356
+ "quote_coin": "USDT",
357
+ "price_coin": "BTC",
358
+ "exchange": "*",
359
+ "contract_size": "0.001",
360
+ "begin_at": "2022-02-27T16:00:00Z",
361
+ "end_at": "2020-01-01T00:00:00Z",
362
+ "delive_at": "2018-10-01T02:00:00Z",
363
+ "delivery_cycle": 28800,
364
+ "min_leverage": "1",
365
+ "max_leverage": "200",
366
+ "price_unit": "0.1",
367
+ "tick_size": "0.1",
368
+ "vol_unit": "1",
369
+ "value_unit": "0.1",
370
+ "min_vol": "1",
371
+ "max_vol": "500000",
372
+ "liquidation_warn_ratio": "0.85",
373
+ "fast_liquidation_ratio": "0.8",
374
+ "settle_type": 1,
375
+ "open_type": 3,
376
+ "compensate_type": 1,
377
+ "status": 3,
378
+ "block": 1,
379
+ "rank": 1,
380
+ "created_at": "2018-07-12T09:16:57Z",
381
+ "depth_bord": "0.0375",
382
+ "base_coin_zh": "",
383
+ "base_coin_en": "",
384
+ "max_rate": "0.0375",
385
+ "min_rate": "-0.0375",
386
+ "market_status": 0,
387
+ "hedge_name": "binance",
388
+ "icon_url": "/static-file/public/coin/BTC-20200604060942.png",
389
+ "robot_risk_threshold": "0",
390
+ "fund_rate_threshold": "0",
391
+ "fund_rate_switch": 0,
392
+ "fund_rate_config": "0",
393
+ "market_price_rate": "0.003",
394
+ "robot_fund_rate_offset": "0",
395
+ "credit_max_leverage": 20,
396
+ "limit_ratio": "0.05",
397
+ "max_order_num": 200,
398
+ "min_trade_val": "5",
399
+ "bind_order_flag": false,
400
+ "market_max_vol": "80000",
401
+ "quote_type": 1,
402
+ "risk_contract_id": 1,
403
+ "risk_base_limit": "1000000",
404
+ "risk_step": "1000000",
405
+ "risk_maintenance_margin": "0.0025",
406
+ "risk_initial_margin": "0.005",
407
+ "risk_status": 1,
408
+ "fee_contract_id": 1,
409
+ "fee_maker_fee": "0.0002",
410
+ "fee_taker_fee": "0.0006",
411
+ "fee_settlement_fee": "0",
412
+ "fee_created_at": "2018-07-12T20:47:22Z",
413
+ "plan_contract_id": 0,
414
+ "plan_min_scope": "0.001",
415
+ "plan_max_scope": "2",
416
+ "plan_max_count": 100,
417
+ "plan_min_life_cycle": 24,
418
+ "plan_max_life_cycle": 438000,
419
+ "tag_tag_id": 1,
420
+ "tag_tag_name": "hot"
421
+ }
422
+ """
423
+ return self._get("detail")
424
+
425
+ @property
426
+ def orders(self) -> Orders:
427
+ """用户订单 (`userAllOrders`)。
428
+ key: order_id
429
+ .. code:: json
430
+
431
+ [
432
+ {
433
+ "order_id": 3000236525013551,
434
+ "contract_id": 72,
435
+ "position_id": 0,
436
+ "account_id": 2008001004625862,
437
+ "price": "0.25",
438
+ "vol": "1",
439
+ "done_vol": "0",
440
+ "done_avg_price": "0",
441
+ "way": 1,
442
+ "category": 1,
443
+ "make_fee": "0",
444
+ "take_fee": "0",
445
+ "origin": "web",
446
+ "created_at": "2025-10-29T08:23:20.745717Z",
447
+ "updated_at": "2025-10-29T08:23:20.753482Z",
448
+ "finished_at": "",
449
+ "status": 2,
450
+ "errno": 0,
451
+ "mode": 1,
452
+ "leverage": "10",
453
+ "open_type": 2,
454
+ "order_type": 0,
455
+ "extends": {
456
+ "remark": "default",
457
+ "broker_id": "",
458
+ "order_type": 0,
459
+ "bonus_only": false,
460
+ "request_trace_id": "",
461
+ "trigger_ratio_type": 0,
462
+ "is_guaranteed_sl_or_tp": false,
463
+ "is_market_zero_slippage": false,
464
+ "zero_slippage_ratio": ""
465
+ },
466
+ "client_order_id": "",
467
+ "executive_price": "",
468
+ "life_cycle": 0,
469
+ "price_type": 0,
470
+ "price_way": 0,
471
+ "plan_category": 0,
472
+ "activation_price": "",
473
+ "callback_rate": "",
474
+ "executive_order_id": 0,
475
+ "bind_leverage": "",
476
+ "pre_plan_order_id": 0,
477
+ "stop_profit_executive_price": "",
478
+ "stop_profit_price_type": 0,
479
+ "stop_loss_executive_price": "",
480
+ "stop_loss_price_type": 0,
481
+ "liquidation_fee": "",
482
+ "account_type": 0,
483
+ "pnl": "",
484
+ "data_type": "",
485
+ "position_mode": 1,
486
+ "pnl_rate": "",
487
+ "preset_is_guaranteed_sl": false,
488
+ "preset_is_guaranteed_tp": false
489
+ }
490
+ ]
491
+ """
492
+ return self._get("orders")
493
+
494
+ @property
495
+ def positions(self) -> Positions:
496
+ """用户持仓 (`userPositions`)。
497
+
498
+ .. code:: json
499
+
500
+ [
501
+ {
502
+ "position_id": 3000236533088511,
503
+ "account_id": 2008001004625862,
504
+ "contract_id": 72,
505
+ "hold_vol": "1",
506
+ "freeze_vol": "0",
507
+ "close_vol": "0",
508
+ "hold_avg_price": "0.2964901",
509
+ "open_avg_price": "0.2964901",
510
+ "close_avg_price": "0",
511
+ "oim": "0.02982690406",
512
+ "im": "0.02982690406",
513
+ "mm": "0.000741261625",
514
+ "realised_profit": "-0.00017789406",
515
+ "earnings": "-0.00017789406",
516
+ "hold_fee": "0",
517
+ "open_type": 2,
518
+ "position_type": 1,
519
+ "status": 1,
520
+ "errno": 0,
521
+ "created_at": "2025-10-29T11:16:37.63704Z",
522
+ "updated_at": "2025-10-29T11:16:37.63704Z",
523
+ "notional_value": "0.2964901",
524
+ "fair_value": "0.29650465",
525
+ "current_value": "0.2965151",
526
+ "liquidation_value": "-10.702412850255",
527
+ "bankruptcy_value": "0",
528
+ "close_able_vol": "1",
529
+ "bankruptcy_fee": "0.00017789406",
530
+ "current_un_earnings": "0.000025",
531
+ "fair_un_earnings": "0.00001455",
532
+ "liquidate_price": "0",
533
+ "current_roe": "0.0008431570971989815",
534
+ "fair_roe": "0.0004907174305698073",
535
+ "current_notional_roe": "0.0008431984744178642",
536
+ "fair_notional_roe": "0.000490741512111197",
537
+ "leverage": "0.0269540457075690273",
538
+ "bind_leverage": "10",
539
+ "account_type": 0,
540
+ "position_mode": 0,
541
+ "fee": "-0.00017789406"
542
+ }
543
+ ]
544
+ """
545
+ return self._get("positions")
546
+
547
+ @property
548
+ def balances(self) -> Balances:
549
+ """账户资产 (`copy/trade/user/info`)。
550
+
551
+ .. code:: json
552
+
553
+ [
554
+ {
555
+ "account_id": 14794011,
556
+ "coin_code": "USDT",
557
+ "available_vol": "10.970977797397999999",
558
+ "cash_vol": "11.000536099457999999",
559
+ "freeze_vol": "0",
560
+ "realised_vol": "0.000536099457999999",
561
+ "un_realised_vol": "-0.00001502",
562
+ "earnings_vol": "0.000536099457999999",
563
+ "total_im": "",
564
+ "margin_balance": "",
565
+ "available_balance": "",
566
+ "trans_out_balance": "",
567
+ "status": 0,
568
+ "total_balance": "",
569
+ "account_rights": "11.000521079457999999",
570
+ "bonus_voucher_vol": "",
571
+ "freeze_bonus_voucher_vol": ""
572
+ }
573
+ ]
574
+ """
575
+ return self._get("balances")
576
+
577
+ @property
578
+ def ticker(self) -> Ticker:
579
+ """Bitmart 合约行情数据(`/v1/ifcontract/tickers` 返回)。
580
+
581
+ 表示 Bitmart 合约行情接口 `/v1/ifcontract/tickers` 返回的数据,包含合约的最新价格、成交量、指数价格、公允价格、资金费率等信息。
582
+
583
+ .. code:: json
584
+
585
+ [
586
+ {
587
+ "last_price": "0.002296",
588
+ "open": "0.002347",
589
+ "close": "0.002296",
590
+ "low": "0.00224",
591
+ "high": "0.002394",
592
+ "avg_price": "0.0023197328648874",
593
+ "volume": "6",
594
+ "total_volume": "200110472",
595
+ "timestamp": 1761812348,
596
+ "rise_fall_rate": "-0.0217298679164891",
597
+ "rise_fall_value": "-0.000051",
598
+ "contract_id": 33125,
599
+ "contract_name": "IOSTUSDT",
600
+ "position_size": "",
601
+ "volume24": "229630336",
602
+ "amount24": "533620.3631860018137124",
603
+ "high_price_24": "0.002394",
604
+ "low_price_24": "0.00224",
605
+ "base_coin_volume": "200110472",
606
+ "quote_coin_volume": "464202.8385065298408528",
607
+ "ask_price": "0.002302",
608
+ "ask_vol": "6396074",
609
+ "bid_price": "0.002289",
610
+ "bid_vol": "3214783",
611
+ "index_price": "0.00229906",
612
+ "fair_price": "0.002296",
613
+ "depth_price": {
614
+ "bid_price": "0",
615
+ "ask_price": "0",
616
+ "mid_price": "0"
617
+ },
618
+ "fair_basis": "",
619
+ "fair_value": "",
620
+ "rate": {
621
+ "quote_rate": "0",
622
+ "base_rate": "0",
623
+ "interest_rate": "0"
624
+ },
625
+ "premium_index": "",
626
+ "funding_rate": "-0.0000601",
627
+ "next_funding_rate": "",
628
+ "next_funding_at": "2025-10-30T16:00:00Z",
629
+ "pps": "0",
630
+ "quote_coin": "USDT",
631
+ "base_coin": "IOST"
632
+
633
+ ]
634
+ """
635
+ return self._get("ticker")