webull-openapi-python-sdk 2.0.3__py3-none-any.whl → 2.0.4__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.
samples/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '2.0.3'
1
+ __version__ = '2.0.4'
@@ -49,6 +49,12 @@ if __name__ == '__main__':
49
49
  if res.status_code == 200:
50
50
  print('get account position res:', res.json())
51
51
 
52
+ # Currently, only Webull JP is supported.
53
+ # instrument_id = None # Get the instrument_id from the position list.
54
+ # res = trade_client.account_v2.get_account_position_details(account_id, instrument_id)
55
+ # if res.status_code == 200:
56
+ # print('get account position details res:', res.json())
57
+
52
58
  # ============================================================
53
59
  # Equity Order Example
54
60
  # ============================================================
@@ -66,10 +72,13 @@ if __name__ == '__main__':
66
72
  "order_type": "LIMIT",
67
73
  "limit_price": "188",
68
74
  "quantity": "1",
69
- "support_trading_session": "N",
75
+ "support_trading_session": "CORE",
70
76
  "side": "BUY",
71
77
  "time_in_force": "DAY",
72
- "entrust_type": "QTY"
78
+ "entrust_type": "QTY",
79
+ # Currently, only Webull JP is supported.
80
+ # "account_tax_type":"GENERAL",
81
+ # "margin_type": "ONE_DAY"
73
82
  }
74
83
  ]
75
84
 
webull/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '2.0.3'
1
+ __version__ = '2.0.4'
webull/core/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = '2.0.3'
1
+ __version__ = '2.0.4'
2
2
 
3
3
  import logging
4
4
 
@@ -0,0 +1,64 @@
1
+ # Copyright 2022 Webull
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # Licensed to the Apache Software Foundation (ASF) under one
16
+ # or more contributor license agreements. See the NOTICE file
17
+ # distributed with this work for additional information
18
+ # regarding copyright ownership. The ASF licenses this file
19
+ # to you under the Apache License, Version 2.0 (the
20
+ # "License"); you may not use this file except in compliance
21
+ # with the License. You may obtain a copy of the License at
22
+ #
23
+ # http://www.apache.org/licenses/LICENSE-2.0
24
+ #
25
+ # Unless required by applicable law or agreed to in writing,
26
+ # software distributed under the License is distributed on an
27
+ # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
28
+ # KIND, either express or implied. See the License for the
29
+ # specific language governing permissions and limitations
30
+ # under the License.
31
+
32
+ # coding=utf-8
33
+
34
+ """
35
+ This file borrowed some of its methods from a modified fork of the
36
+ https://github.com/aliyun/aliyun-openapi-python-sdk/blob/master/aliyun-python-sdk-core/aliyunsdkcore/auth/algorithm/sha_hmac256.py
37
+ which was part of Alibaba Group.
38
+ """
39
+ import hashlib
40
+ import hmac
41
+
42
+ from webull.core.compat import ensure_string
43
+ from webull.core.compat import ensure_bytes
44
+ from webull.core.compat import b64_encode_bytes
45
+
46
+
47
+ def get_sign_string(source, secret):
48
+ source = ensure_bytes(source)
49
+ secret = ensure_bytes(secret)
50
+ h = hmac.new(secret, source, hashlib.sha256)
51
+ signature = ensure_string(b64_encode_bytes(h.digest()).strip())
52
+ return signature
53
+
54
+
55
+ def get_signer_name():
56
+ return "HMAC-SHA256"
57
+
58
+
59
+ def get_signer_version():
60
+ return "1.0"
61
+
62
+
63
+ def get_signer_type():
64
+ return ""
@@ -38,6 +38,7 @@ which was part of Alibaba Group.
38
38
  """
39
39
 
40
40
  from webull.core.auth.algorithm import sha_hmac1
41
+ from webull.core.auth.algorithm import sha_hmac256_new
41
42
  from webull.core.exception import error_code
42
43
  from webull.core.exception.exceptions import ClientException
43
44
  from webull.core.utils import common
@@ -51,27 +52,36 @@ PARAM_KV_JOIN = "="
51
52
  PARAMS_JOIN = "&"
52
53
  SECRET_TAILER = "&"
53
54
 
54
- def _refresh_sign_headers(host, headers, app_key_id, signer_spec=sha_hmac1):
55
+ def _refresh_sign_headers(host, headers, app_key_id, signer_spec):
55
56
  if not host:
56
57
  raise ClientException(error_code.SDK_INVALID_PARAMETER)
57
58
  sign_headers = {}
58
59
  sign_headers[hd.APP_KEY] = app_key_id
59
60
  sign_headers[hd.TIMESTAMP] = common.get_iso_8601_date()
61
+
62
+ if common.is_not_upgrade_api_host(host):
63
+ signer_spec = sha_hmac256_new
64
+ else:
65
+ signer_spec = sha_hmac1
66
+
60
67
  sign_headers[hd.SIGN_VERSION] = signer_spec.get_signer_version()
61
68
  sign_headers[hd.SIGN_ALGORITHM] = signer_spec.get_signer_name()
62
69
  sign_headers[hd.NONCE] = common.get_uuid()
63
70
  headers.update(sign_headers)
64
71
  # DO NOT PUT Host Header in headers object, just put into sign_headers
65
72
  sign_headers[hd.NATIVE_HOST] = host
66
- return sign_headers
73
+ return sign_headers,signer_spec
67
74
 
68
- def _gen_signature(string_to_sign, secret, signer_spec=sha_hmac1):
75
+ def _gen_signature(string_to_sign, secret, signer_spec):
69
76
  return signer_spec.get_sign_string(string_to_sign, secret + SECRET_TAILER)
70
77
 
71
- def _get_body_string(body_params):
78
+ def _get_body_string(body_params, signer_spec):
72
79
  if body_params is not None:
73
80
  raw_str = common.json_dumps_compact(body_params)
74
- hex_digest = common.md5_hex(raw_str)
81
+ if signer_spec == sha_hmac256_new:
82
+ hex_digest = common.sha256_hex(raw_str)
83
+ else:
84
+ hex_digest = common.md5_hex(raw_str)
75
85
  return hex_digest.upper()
76
86
  else:
77
87
  return None
@@ -100,8 +110,8 @@ def _lower_key_dict(od):
100
110
  lower_key_dict[k.lower()] = v
101
111
  return lower_key_dict
102
112
 
103
- def calc_signature(headers, host, uri, queries, body_params, app_key_id, app_key_secret, signer_spec=sha_hmac1):
104
- sign_headers = _refresh_sign_headers(host, headers, app_key_id, signer_spec)
113
+ def calc_signature(headers, host, uri, queries, body_params, app_key_id, app_key_secret, signer_spec):
114
+ sign_headers,signer_spec = _refresh_sign_headers(host, headers, app_key_id, signer_spec)
105
115
  logger.debug("sign_headers:%s", sign_headers)
106
116
  sign_params = _lower_key_dict(sign_headers)
107
117
  logger.debug("sign_queries:%s", queries)
@@ -114,12 +124,11 @@ def calc_signature(headers, host, uri, queries, body_params, app_key_id, app_key
114
124
  cv = str(v)
115
125
  sign_params[k] = cv
116
126
  logger.debug("body:%s", body_params)
117
- body_string = _get_body_string(body_params)
127
+ body_string = _get_body_string(body_params, signer_spec)
118
128
  logger.debug("body_string:%s" % body_string)
119
129
  string_to_sign = _build_sign_string(sign_params, uri, body_string)
120
130
  logger.debug("string_to_sign:%s" % string_to_sign)
121
131
  signature = _gen_signature(string_to_sign, app_key_secret, signer_spec)
122
132
  headers[hd.SIGNATURE] = signature
123
133
  logger.debug("signature:%s", signature)
124
- return signature
125
-
134
+ return signature
@@ -58,5 +58,20 @@ def md5_hex(content):
58
58
  content_bytes = ensure_bytes(content)
59
59
  return hashlib.md5(content_bytes).hexdigest()
60
60
 
61
+ def sha256_hex(content):
62
+ content_bytes = ensure_bytes(content)
63
+ return hashlib.sha256(content_bytes).hexdigest()
64
+
61
65
  def json_dumps_compact(content):
62
- return json.dumps(content, ensure_ascii=False, separators=(',', ':'))
66
+ return json.dumps(content, ensure_ascii=False, separators=(',', ':'))
67
+
68
+ def is_not_upgrade_api_host(host):
69
+ upgrade_hosts = {
70
+ "api.webull.com","events-api.webull.com",
71
+ "api.webull.hk","events-api.webull.hk",
72
+ "pre-openapi-us-alb.webullbroker.com","pre-openapi-us-events.webullbroker.com",
73
+ "pre-openapi-alb.webullbroker.com","pre-openapi-events.webullbroker.com",
74
+ "us-openapi-alb.uat.webullbroker.com","us-openapi-events.uat.webullbroker.com",
75
+ "hk-openapi.uat.webullbroker.com", "hk-openapi-events-api.uat.webullbroker.com"
76
+ }
77
+ return host not in upgrade_hosts
webull/data/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  # coding=utf-8
2
2
 
3
- __version__ = '2.0.3'
3
+ __version__ = '2.0.4'
@@ -26,3 +26,4 @@ class Category(EasyEnum):
26
26
  US_CRYPTO = (8, "US CRYPTO")
27
27
  US_FUTURES = (12, "US FUTURES")
28
28
  US_EVENT = (13, "US EVENT")
29
+ HK_FUTURES = (13, "HK FUTURES")
webull/trade/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '2.0.3'
1
+ __version__ = '2.0.4'
@@ -26,3 +26,4 @@ class Category(EasyEnum):
26
26
  CN_STOCK = (7, "CN STOCK")
27
27
  US_CRYPTO = (8, "US CRYPTO")
28
28
  US_FUTURES = (12, "US FUTURES")
29
+ HK_FUTURES = (13, "HK FUTURES")
@@ -14,14 +14,14 @@
14
14
 
15
15
  # coding=utf-8
16
16
  from asyncio.log import logger
17
- from webull.core.auth.algorithm import sha_hmac1
17
+ from webull.core.auth.algorithm import sha_hmac1, sha_hmac256_new
18
18
  from webull.core.auth.composer import default_signature_composer
19
19
  import webull.core.headers as hd
20
20
  import webull.core.utils.common as core_common
21
21
  import logging
22
22
  logger = logging.getLogger(__name__)
23
23
 
24
- def _build_sign_metadata(app_key_id, signer_spec=sha_hmac1):
24
+ def _build_sign_metadata(app_key_id, signer_spec):
25
25
  sign_params = {}
26
26
  sign_algorithm = signer_spec.get_signer_name()
27
27
  sign_version = signer_spec.get_signer_version()
@@ -41,17 +41,21 @@ def _build_sign_metadata(app_key_id, signer_spec=sha_hmac1):
41
41
  sign_params[hd.TIMESTAMP] = ts
42
42
  return metadata, sign_params
43
43
 
44
- def _get_body_string(pb_object):
44
+ def _get_body_string(pb_object, signer_spec):
45
45
  if pb_object:
46
46
  pb_object_bytes = pb_object.SerializeToString()
47
- return core_common.md5_hex(pb_object_bytes)
47
+
48
+ if signer_spec == sha_hmac256_new:
49
+ return core_common.sha256_hex(pb_object_bytes)
50
+ else:
51
+ return core_common.md5_hex(pb_object_bytes)
48
52
  return None
49
53
 
50
- def calc_signature(app_key_id, app_key_secret, pb_object, signer_spec=sha_hmac1):
54
+ def calc_signature(app_key_id, app_key_secret, pb_object, signer_spec):
51
55
  metadata, sign_params = _build_sign_metadata(app_key_id, signer_spec)
52
56
  sign_params = default_signature_composer._lower_key_dict(sign_params)
53
57
  logger.debug("sign_params:%s", sign_params)
54
- body_string = _get_body_string(pb_object)
58
+ body_string = _get_body_string(pb_object,signer_spec)
55
59
  logger.debug("body_string:%s" % body_string)
56
60
  string_to_sign = default_signature_composer._build_sign_string(sign_params, None, body_string)
57
61
  logger.debug("string_to_sign:%s" % string_to_sign)
@@ -0,0 +1,35 @@
1
+ # Copyright 2022 Webull
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # coding=utf-8
16
+ from webull.core.request import ApiRequest
17
+
18
+
19
+ class AccountPositionDetailsRequest(ApiRequest):
20
+ def __init__(self):
21
+ ApiRequest.__init__(self, "/openapi/assets/position/details", version='v2', method="GET", query_params={})
22
+
23
+ def set_account_id(self, account_id):
24
+ self.add_query_param("account_id", account_id)
25
+
26
+ def set_instrument_id(self, instrument_id):
27
+ self.add_query_param("instrument_id", instrument_id)
28
+
29
+ def set_page_size(self, page_size):
30
+ if page_size:
31
+ self.add_query_param("page_size", page_size)
32
+
33
+ def set_last_id(self, last_id):
34
+ if last_id:
35
+ self.add_query_param("last_id", last_id)
@@ -15,6 +15,7 @@
15
15
 
16
16
  from webull.trade.request.v2.get_account_balance_request import AccountBalanceRequest
17
17
  from webull.trade.request.v2.get_account_list_request import GetAccountListRequest
18
+ from webull.trade.request.v2.get_account_position_details_request import AccountPositionDetailsRequest
18
19
  from webull.trade.request.v2.get_account_positions_request import AccountPositionsRequest
19
20
 
20
21
 
@@ -24,7 +25,7 @@ class AccountV2:
24
25
 
25
26
  def get_account_list(self):
26
27
  """
27
- This interface is currently supported only for Webull HK and Webull US.
28
+ This interface is currently supported only for Webull HK, Webull US, and Webull JP.
28
29
  Support for other regions will be available in future updates.
29
30
  """
30
31
  account_list = GetAccountListRequest()
@@ -33,7 +34,7 @@ class AccountV2:
33
34
 
34
35
  def get_account_balance(self, account_id):
35
36
  """
36
- This interface is currently supported only for Webull HK and Webull US.
37
+ This interface is currently supported only for Webull HK, Webull US, and Webull JP.
37
38
  Support for other regions will be available in future updates.
38
39
  """
39
40
  account_balance_request = AccountBalanceRequest()
@@ -43,10 +44,23 @@ class AccountV2:
43
44
 
44
45
  def get_account_position(self, account_id):
45
46
  """
46
- This interface is currently supported only for Webull HK and Webull US.
47
+ This interface is currently supported only for Webull HK, Webull US, and Webull JP.
47
48
  Support for other regions will be available in future updates.
48
49
  """
49
50
  account_positions_request = AccountPositionsRequest()
50
51
  account_positions_request.set_account_id(account_id)
51
52
  response = self.client.get_response(account_positions_request)
52
53
  return response
54
+
55
+ def get_account_position_details(self, account_id, instrument_id, page_size=None, last_id=None):
56
+ """
57
+ This interface is currently supported only for Webull JP.
58
+ Support for other regions will be available in future updates.
59
+ """
60
+ account_position_details_request = AccountPositionDetailsRequest()
61
+ account_position_details_request.set_account_id(account_id)
62
+ account_position_details_request.set_instrument_id(instrument_id)
63
+ account_position_details_request.set_page_size(page_size)
64
+ account_position_details_request.set_last_id(last_id)
65
+ response = self.client.get_response(account_position_details_request)
66
+ return response
@@ -28,7 +28,7 @@ class OrderOperationV3:
28
28
 
29
29
  def preview_order(self, account_id, preview_orders, client_combo_order_id=None):
30
30
  """
31
- This interface is currently supported only for Webull US.
31
+ This interface is currently supported only for Webull HK, Webull US, and Webull JP.
32
32
  Support for other regions will be available in future updates.
33
33
  """
34
34
  preview_order_request = PreviewOrderRequest()
@@ -40,7 +40,7 @@ class OrderOperationV3:
40
40
 
41
41
  def place_order(self, account_id, new_orders, client_combo_order_id=None):
42
42
  """
43
- This interface is currently supported only for Webull US.
43
+ This interface is currently supported only for Webull HK, Webull US, and Webull JP.
44
44
  Support for other regions will be available in future updates.
45
45
  """
46
46
  place_order_request = PlaceOrderRequest()
@@ -65,7 +65,7 @@ class OrderOperationV3:
65
65
 
66
66
  def replace_order(self, account_id, modify_orders, client_combo_order_id=None):
67
67
  """
68
- This interface is currently supported only for Webull US.
68
+ This interface is currently supported only for Webull HK, Webull US, and Webull JP.
69
69
  Support for other regions will be available in future updates.
70
70
  """
71
71
  replace_order_request = ReplaceOrderRequest()
@@ -77,7 +77,7 @@ class OrderOperationV3:
77
77
 
78
78
  def cancel_order(self, account_id, client_order_id):
79
79
  """
80
- This interface is currently supported only for Webull US.
80
+ This interface is currently supported only for Webull HK, Webull US, and Webull JP.
81
81
  Support for other regions will be available in future updates.
82
82
  """
83
83
  cancel_order_request = CancelOrderRequest()
@@ -88,7 +88,7 @@ class OrderOperationV3:
88
88
 
89
89
  def get_order_detail(self, account_id, client_order_id):
90
90
  """
91
- This interface is currently supported only for Webull US.
91
+ This interface is currently supported only for Webull HK, Webull US, and Webull JP.
92
92
  Support for other regions will be available in future updates.
93
93
  """
94
94
  order_detail_request = OrderDetailRequest()
@@ -99,7 +99,7 @@ class OrderOperationV3:
99
99
 
100
100
  def get_order_history(self, account_id, page_size=None, start_date=None, end_date=None, last_client_order_id=None):
101
101
  """
102
- This interface is currently supported only for Webull US.
102
+ This interface is currently supported only for Webull HK, Webull US, and Webull JP.
103
103
  Support for other regions will be available in future updates.
104
104
 
105
105
  Historical orders. If they are group orders, will be returned together,
@@ -127,7 +127,7 @@ class OrderOperationV3:
127
127
 
128
128
  def get_order_open(self, account_id, page_size=None, last_client_order_id=None):
129
129
  """
130
- This interface is currently supported only for Webull US.
130
+ This interface is currently supported only for Webull HK, Webull US, and Webull JP.
131
131
  Support for other regions will be available in future updates.
132
132
 
133
133
  Paging query pending orders.
@@ -19,7 +19,10 @@ import threading
19
19
  import time
20
20
 
21
21
  import grpc
22
+
23
+ from webull.core.auth.algorithm import sha_hmac256_new, sha_hmac1
22
24
  from webull.core.common import api_type
25
+ from webull.core.utils import common
23
26
  from webull.core.endpoint.default_endpoint_resolver import \
24
27
  DefaultEndpointResolver
25
28
  from webull.core.endpoint.resolver_endpoint_request import \
@@ -77,7 +80,21 @@ class TradeEventsClient():
77
80
  timestamp=int(time.time() * 1000), # millis
78
81
  accounts=accounts,
79
82
  )
80
- signature, metadata = calc_signature(app_key, app_secret, request)
83
+ if common.is_not_upgrade_api_host(self._host):
84
+ signer_spec = sha_hmac256_new
85
+ else:
86
+ signer_spec = sha_hmac1
87
+
88
+ signature, metadata = calc_signature(app_key, app_secret, request, signer_spec)
89
+
90
+ # Print detailed request parameters
91
+ print("\n=== gRPC Request Details ===")
92
+ print(f"Request: {request}")
93
+ print(f"Signature: {signature}")
94
+ print(f"Metadata: {metadata}")
95
+ print(f"Signer Spec: {signer_spec.__name__ if hasattr(signer_spec, '__name__') else signer_spec}")
96
+ print("=============================\n")
97
+
81
98
  return request, metadata
82
99
 
83
100
  def _stream_processing(self, stub, accounts):
@@ -226,6 +243,14 @@ class TradeEventsClient():
226
243
 
227
244
  def do_subscribe(self, accounts):
228
245
  target = self._host + ":" + str(self._port)
246
+ # Print gRPC connection parameters
247
+ print("\n=== gRPC Connection Parameters ===")
248
+ print(f"Host: {self._host}")
249
+ print(f"Port: {self._port}")
250
+ print(f"Target: {target}")
251
+ print(f"TLS Enabled: {self._tls_enable}")
252
+ print("==================================\n")
253
+
229
254
  if self._tls_enable:
230
255
  ssl_channel_credentials = grpc.ssl_channel_credentials()
231
256
  with grpc.secure_channel(target, ssl_channel_credentials) as channel:
@@ -234,4 +259,4 @@ class TradeEventsClient():
234
259
  else:
235
260
  with grpc.insecure_channel(target) as channel:
236
261
  stub = pb_grpc.EventServiceStub(channel)
237
- self._stream_processing(stub, accounts)
262
+ self._stream_processing(stub, accounts)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webull-openapi-python-sdk
3
- Version: 2.0.3
3
+ Version: 2.0.4
4
4
  Summary: Webull Python SDK.
5
5
  Home-page:
6
6
  Author: Webull
@@ -1,4 +1,4 @@
1
- samples/__init__.py,sha256=fcRMgwI40iVFwre_3iKQA-N6sHUo3pAErXcKJS63DRg,22
1
+ samples/__init__.py,sha256=YuAuFLBrpl-SUl_UsvW1U1NTjqnldfuD1xUmSLmtaRw,22
2
2
  samples/account/__init__.py,sha256=eoZ6GfifbqhMLNzjlqRDVil-yyBkOmVN9ujSgJWNBlY,15
3
3
  samples/account/account_client.py,sha256=vwh-nI_JnjwcIeOr1sQPMzG8pAqZwliUusE49ZmYE3s,1796
4
4
  samples/assets/__init__.py,sha256=eoZ6GfifbqhMLNzjlqRDVil-yyBkOmVN9ujSgJWNBlY,15
@@ -15,11 +15,11 @@ samples/order/order_stock_client.py,sha256=hYwVwVFVERk-YS7gRcW-LuGfAvcF8VJHZs1qw
15
15
  samples/trade/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  samples/trade/trade_client.py,sha256=LyWSvZJH4ByCkRORqP9WdkXfx65A2b6fhc9_GzL8DOM,6258
17
17
  samples/trade/trade_client_v2.py,sha256=IO-zmRiUnCmIetTdiYunPh8jVK2VaPrOR77Dwvz1auY,10771
18
- samples/trade/trade_client_v3.py,sha256=0PPa8Ws8xquKkoxLNI9kdpHqbmIDvjrX449NCW-dwYs,18933
18
+ samples/trade/trade_client_v3.py,sha256=WYGL3f0V-bDqeT0z5Qg0xbzCQtCdiHn7dM589DiEhfc,19386
19
19
  samples/trade/trade_client_v3_event.py,sha256=91HlT04KlK8Q5gUnsB8F5ErCFdJRnpDABKkBfYRc-YE,3932
20
20
  samples/trade/trade_event_client.py,sha256=BWdD1L41LXmDlaig6ku9T3t3fSCCZEdj5nxH1xI1AZA,2653
21
- webull/__init__.py,sha256=fcRMgwI40iVFwre_3iKQA-N6sHUo3pAErXcKJS63DRg,22
22
- webull/core/__init__.py,sha256=FcVKsgDnL3EbPKiGrfc1WhD0vfJeIKh81XVz9Zkt7Iw,225
21
+ webull/__init__.py,sha256=YuAuFLBrpl-SUl_UsvW1U1NTjqnldfuD1xUmSLmtaRw,22
22
+ webull/core/__init__.py,sha256=WKlbKb6oJxRdbtIgprpjwW9LCFGmoFyRipen8IS24Dc,225
23
23
  webull/core/client.py,sha256=zxSBiII9KDxc5tHpTerJfV_PKPt8E9e3oTOpiakAtJw,16758
24
24
  webull/core/compat.py,sha256=_r6Y_f3vTo_DoxOaCvLjnvOo1KRkD2Z9kXSh8OijEIA,3088
25
25
  webull/core/headers.py,sha256=Wj2zev1XYyYsy2b9YKnoK3GqjVsXZO_o2WziMmuVBTw,2061
@@ -29,8 +29,9 @@ webull/core/auth/credentials.py,sha256=n9rjS7VKxwZ1VPNQhENNil5QBO3ApKrYrSxC3eaEE
29
29
  webull/core/auth/algorithm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  webull/core/auth/algorithm/sha_hmac1.py,sha256=oYHpbwwOK2w9dtSnaOMwGLaw-opBwOxJWpMmA_hLqUs,2150
31
31
  webull/core/auth/algorithm/sha_hmac256.py,sha256=jkkWDQOYuJI6nrKVx89KnLI4sTAFi_zmxNc5bPGX0cw,2638
32
+ webull/core/auth/algorithm/sha_hmac256_new.py,sha256=t8s_YegLV5_qtLLp2CQHKY66OTu_eZyUbGjsHWuSpt8,2155
32
33
  webull/core/auth/composer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- webull/core/auth/composer/default_signature_composer.py,sha256=BudVIzMVAH3wPjd0Ss4ztRa2uRRO0tWhheGTkPqifPs,5010
34
+ webull/core/auth/composer/default_signature_composer.py,sha256=QQrbdsCX50MHGJMhMnIOy_ox0LB7QYUsDeJAPc6XSBU,5323
34
35
  webull/core/auth/signers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
36
  webull/core/auth/signers/app_key_signer.py,sha256=ojdG3yFefU7olqnQbRElCuJf9VD7UqueFE39-IP_Bfk,2841
36
37
  webull/core/auth/signers/signer.py,sha256=4fo94UqLcwUAYziAlCd9GAqNLM8PbLLVHChdjvcfvhY,1790
@@ -80,15 +81,15 @@ webull/core/retry/retry_condition.py,sha256=Hel380uhtcgmrK0NZiuY015vyBQWzM2dv4np
80
81
  webull/core/retry/retry_policy.py,sha256=y1Kwc7lw1N4sgvR71AcUbsv8cYYLAJRdDMx7VWO6ubs,2549
81
82
  webull/core/retry/retry_policy_context.py,sha256=rVAqF6NE6Aw-OUJY1TaxEhSLLCuYe8Kfs6Poqol0WOk,2036
82
83
  webull/core/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
- webull/core/utils/common.py,sha256=iQ-HWNhpg8EhtIKS7Iqp2xHrQmwEwcK9PrMwlTmu1C4,1993
84
+ webull/core/utils/common.py,sha256=3sx7_LH0yNbEsdd7HMXc5YGV0GGsDxpFljWMgcIaJm8,2659
84
85
  webull/core/utils/data.py,sha256=YUyoWY68_2RkKanh3jsDscgGx__FIPh5VNEGXr1Qotc,852
85
86
  webull/core/utils/desensitize.py,sha256=f8_ps9BrG3WfXD8ZAw873-_YoGeke1Q55CeDwRmYkqA,1104
86
87
  webull/core/utils/validation.py,sha256=gJcIrHYtgo48yVJ0q6O-f5buTYWOcr6ShhDIBhTp-Yg,1957
87
- webull/data/__init__.py,sha256=4Y-EchMuHL8JNhKybjRY2_ubZGPiUmp7PaLUBuPehss,38
88
+ webull/data/__init__.py,sha256=QBXnSzdws7AWS9FIIB-BMCYJSEP2B_A9Y7t8fR1bWqU,38
88
89
  webull/data/data_client.py,sha256=1_jrNHrqes7vygUkA1GRI_CIMJp4zcv_Ny8XUDyck1E,1997
89
90
  webull/data/data_streaming_client.py,sha256=TQBAilvOLCbcMqacByrniXGr9VjSwjym-4-LUOiqKx8,4456
90
91
  webull/data/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
- webull/data/common/category.py,sha256=7zp-C6ex1eBHw4jTKgeg4X_JASjAM619pLpzQK9XTbc,942
92
+ webull/data/common/category.py,sha256=8mtq9J9aiNan1CkwgfqRnggdH0tENyhJBJ2HI3EkUHE,978
92
93
  webull/data/common/connect_ack.py,sha256=PGhtTzb1hAciHRvMSqMUasyEMC6vdV52taP8RbTB8t8,1209
93
94
  webull/data/common/contract_type.py,sha256=dQZMIC1kMDbz0TM34ElfsMRI_k2SXsRYyXX6UcI9JG8,715
94
95
  webull/data/common/direction.py,sha256=N0Me8CJD3oQDmx2EpNzlvFQDjmmhxa4qKorpV11OLM0,987
@@ -163,12 +164,12 @@ webull/data/request/get_snapshot_request.py,sha256=OD2PiaxmBCboFDaU8DFTwvfNd2zOb
163
164
  webull/data/request/get_tick_request.py,sha256=rUHhQgC8Z_6ensLyCkg3DDK55SlEi0Bc_dhpCIIspDs,1366
164
165
  webull/data/request/subscribe_request.py,sha256=dm93Q5Q4gigAMqAobolaYYSs3wM6QddPUZOjEtJsX-8,1471
165
166
  webull/data/request/unsubscribe_request.py,sha256=hQA4mYM64PgmQEA2otl47-3nCXqjsSY_weFA3_wNbMM,1446
166
- webull/trade/__init__.py,sha256=U8BEyItnCRffb5NQFYKwkJf1OI4ctsrASQHqqSyNC4k,21
167
+ webull/trade/__init__.py,sha256=jqC1bY-kWG8sFN8e9uXLMX7-JLItJoVYGK55Mm3rfLM,21
167
168
  webull/trade/trade_client.py,sha256=_6lH4KO-jKgKWU28fWNsc9-KEHto-WvaP0gT96BJ_dw,2184
168
- webull/trade/trade_events_client.py,sha256=Vl4qsIEuDagjI7csqKr7K0fqHXbu-iN-5Ti28HBcub4,9017
169
+ webull/trade/trade_events_client.py,sha256=G9ovuxrnQh8iA1so2Ar-41jWRzDCYQYSHTkQLGlwhhA,9983
169
170
  webull/trade/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
170
171
  webull/trade/common/account_type.py,sha256=haVAB33MERN6XyPsbrfVQhK9_CpU90VltI6_KDkxzlE,715
171
- webull/trade/common/category.py,sha256=GJ9pDCMkwq7062o9L9o5aPvqHoYxuMqEbInlkfxD65U,911
172
+ webull/trade/common/category.py,sha256=lrSKMO11wMpw9iWWeefTdWXedJAFfWRlJ76swfqVP0c,947
172
173
  webull/trade/common/combo_ticker_type.py,sha256=lvyH9Pk3QTBKSwY4N_bpWFdwAeOBPKH2ZEsCF6lfkzg,748
173
174
  webull/trade/common/combo_type.py,sha256=yC7KKF-xjtw9YzD49ijph-sq8W98HRBRefGK7ovJaDM,1084
174
175
  webull/trade/common/currency.py,sha256=5y3vPnvV2K-1Xlg9WDJ6QtokL4-glytXsypvyjG2ArY,746
@@ -188,7 +189,7 @@ webull/trade/events/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
188
189
  webull/trade/events/default_retry_policy.py,sha256=zWoaJFJSUTtHw_qLj9_AIPBzFW6UHX295IfcuBHzYaI,2748
189
190
  webull/trade/events/events_pb2.py,sha256=NLolj5VOws1LJT5YIvnuZab9YYhR4lm2-iCkztaARPo,2440
190
191
  webull/trade/events/events_pb2_grpc.py,sha256=ebxp_VCJHBQFCKvxBKRUMhW67TZoUn6NwCBvKpiTEpg,2482
191
- webull/trade/events/signature_composer.py,sha256=zcfBgwQ6XpoEOmeqSnKlgl0j0oDQ0x80_KS_11W3gwA,2496
192
+ webull/trade/events/signature_composer.py,sha256=GL7_lC3zHyyVy0IcxYdavtJNFWCnQZ6m5nLfC--_eG4,2639
192
193
  webull/trade/events/types.py,sha256=NkBeC3mQPflcg7NDTChVS-DAtDPX_G-od9YJt_FLZTc,689
193
194
  webull/trade/request/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
194
195
  webull/trade/request/cancel_order_request.py,sha256=JbyeVNOVu9xvwzba7Ntw2Sh4BrNVUbBTkYLTKgXIU5U,1016
@@ -214,6 +215,7 @@ webull/trade/request/v2/cancel_order_request.py,sha256=M2XQgnGbhu6s2BOhjKfqW2C1O
214
215
  webull/trade/request/v2/get_account_balance_request.py,sha256=o-Vi60Tw7MdZ7oGm_8HuWa34BWk_n4hY4JX9q9i3OhM,1049
215
216
  webull/trade/request/v2/get_account_list.py,sha256=hQExCKQJeIWw-m1n9kp6zWS5YJdjMgYdBS_7A2-lLHE,877
216
217
  webull/trade/request/v2/get_account_list_request.py,sha256=Va6Q3eF2xX5KwsQ_0KPBiH--73HWS1uTl1jjXYIb3s4,806
218
+ webull/trade/request/v2/get_account_position_details_request.py,sha256=QxOwEQ-oySwy1EXH5ubvQVi8jN_spl5nQeKNIC8cHUM,1253
217
219
  webull/trade/request/v2/get_account_positions_request.py,sha256=BPmPStB3h05GlajtcuhEwOFrjViWeqdarRXCR9ay_sQ,900
218
220
  webull/trade/request/v2/get_order_detail_request.py,sha256=jYuU8vHdE0fkXZdHqyuZ-rnhHUlQ9Qo5r7FvzmCfEKE,1000
219
221
  webull/trade/request/v2/get_order_history_request.py,sha256=pLKnSyGuS_H6Fce4UcKE_s6Ha3yXB7e3ZvL-yXodkLY,1414
@@ -240,13 +242,13 @@ webull/trade/trade/order_operation.py,sha256=QrL4Da87RTOSupiAbuXtZigo9602Byp14DQ
240
242
  webull/trade/trade/trade_calendar.py,sha256=rGSiR5GZggQnZOmmpbC-06trgPQgFTvdpUzGMpw2ycw,1415
241
243
  webull/trade/trade/trade_instrument.py,sha256=293IaiLnhw0mAc1IuF3LSgwgve_XZ1Dyf1VeFtmClc8,3474
242
244
  webull/trade/trade/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
243
- webull/trade/trade/v2/account_info_v2.py,sha256=IGY_BGTrZ0h7yQ_nDodNtmKen9gXW6heUFb7VLRQ9bY,2142
245
+ webull/trade/trade/v2/account_info_v2.py,sha256=GgYYxPw3ULZgK1giP6yjxt9JRdtyQVzuc60Kv-D0wqQ,2991
244
246
  webull/trade/trade/v2/order_operation_v2.py,sha256=m54RH2j45CBBWEnqe4KxrsltAF44XKtPMT4kv8t7djQ,12745
245
247
  webull/trade/trade/v3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
246
- webull/trade/trade/v3/order_opration_v3.py,sha256=_L10--m_XhoMe8YeYjQXVvRoTAWoRRzLU59UeneyMrU,7428
247
- webull_openapi_python_sdk-2.0.3.dist-info/licenses/LICENSE,sha256=ALOnsLtb1aHxmDJg3-oMi0BO-i-cjfyZaOBfnnavKMc,11359
248
- webull_openapi_python_sdk-2.0.3.dist-info/licenses/NOTICE,sha256=X5TApte6CPV10b96Cb70IRLusXmiRmK_R-dB-1tQM_I,2018
249
- webull_openapi_python_sdk-2.0.3.dist-info/METADATA,sha256=ss5J4i660Gr9NnkRVjQv_2teC3DVyvOvw9JFrpGkVGE,1032
250
- webull_openapi_python_sdk-2.0.3.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
251
- webull_openapi_python_sdk-2.0.3.dist-info/top_level.txt,sha256=h8pEjNDGWS2ZUZ2vYFpUShoMQT0ZRIQaD57QJWD8_aI,15
252
- webull_openapi_python_sdk-2.0.3.dist-info/RECORD,,
248
+ webull/trade/trade/v3/order_opration_v3.py,sha256=ULLrgI1BaAmLdVytwSukPNYfDoZaaReys6gorvA86bo,7610
249
+ webull_openapi_python_sdk-2.0.4.dist-info/licenses/LICENSE,sha256=ALOnsLtb1aHxmDJg3-oMi0BO-i-cjfyZaOBfnnavKMc,11359
250
+ webull_openapi_python_sdk-2.0.4.dist-info/licenses/NOTICE,sha256=X5TApte6CPV10b96Cb70IRLusXmiRmK_R-dB-1tQM_I,2018
251
+ webull_openapi_python_sdk-2.0.4.dist-info/METADATA,sha256=h36hJ1LDNSP2zkADu2fOZ9wswMCHHuDn1-nlg-sdWpA,1032
252
+ webull_openapi_python_sdk-2.0.4.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
253
+ webull_openapi_python_sdk-2.0.4.dist-info/top_level.txt,sha256=h8pEjNDGWS2ZUZ2vYFpUShoMQT0ZRIQaD57QJWD8_aI,15
254
+ webull_openapi_python_sdk-2.0.4.dist-info/RECORD,,