webull-openapi-python-sdk 2.0.2__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 +1 -1
- samples/trade/trade_client_v3.py +11 -2
- webull/__init__.py +1 -1
- webull/core/__init__.py +1 -1
- webull/core/auth/algorithm/sha_hmac256_new.py +64 -0
- webull/core/auth/composer/default_signature_composer.py +19 -10
- webull/core/client.py +13 -0
- webull/core/headers.py +2 -1
- webull/core/utils/common.py +16 -1
- webull/data/__init__.py +1 -1
- webull/data/common/category.py +1 -0
- webull/trade/__init__.py +1 -1
- webull/trade/common/category.py +1 -0
- webull/trade/events/signature_composer.py +10 -6
- webull/trade/request/v2/get_account_position_details_request.py +35 -0
- webull/trade/trade/v2/account_info_v2.py +17 -3
- webull/trade/trade/v3/order_opration_v3.py +7 -7
- webull/trade/trade_events_client.py +27 -2
- {webull_openapi_python_sdk-2.0.2.dist-info → webull_openapi_python_sdk-2.0.4.dist-info}/METADATA +1 -1
- {webull_openapi_python_sdk-2.0.2.dist-info → webull_openapi_python_sdk-2.0.4.dist-info}/RECORD +24 -22
- {webull_openapi_python_sdk-2.0.2.dist-info → webull_openapi_python_sdk-2.0.4.dist-info}/WHEEL +0 -0
- {webull_openapi_python_sdk-2.0.2.dist-info → webull_openapi_python_sdk-2.0.4.dist-info}/licenses/LICENSE +0 -0
- {webull_openapi_python_sdk-2.0.2.dist-info → webull_openapi_python_sdk-2.0.4.dist-info}/licenses/NOTICE +0 -0
- {webull_openapi_python_sdk-2.0.2.dist-info → webull_openapi_python_sdk-2.0.4.dist-info}/top_level.txt +0 -0
samples/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = '2.0.
|
|
1
|
+
__version__ = '2.0.4'
|
samples/trade/trade_client_v3.py
CHANGED
|
@@ -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": "
|
|
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.
|
|
1
|
+
__version__ = '2.0.4'
|
webull/core/__init__.py
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
webull/core/client.py
CHANGED
|
@@ -41,6 +41,7 @@ which was part of Alibaba Group.
|
|
|
41
41
|
|
|
42
42
|
import json
|
|
43
43
|
import logging
|
|
44
|
+
import os
|
|
44
45
|
import platform
|
|
45
46
|
import time
|
|
46
47
|
from logging.handlers import TimedRotatingFileHandler
|
|
@@ -69,6 +70,8 @@ DEFAULT_READ_TIMEOUT = 10
|
|
|
69
70
|
DEFAULT_CONNECTION_TIMEOUT = 5
|
|
70
71
|
DEFAULT_PORT = 443
|
|
71
72
|
DEFAULT_REGION_ID = "us"
|
|
73
|
+
DEFAULT_CLIENT_SOURCE = "sdk"
|
|
74
|
+
CLIENT_SOURCE_ENV = "WEBULL_CLIENT_SOURCE"
|
|
72
75
|
|
|
73
76
|
logger = logging.getLogger(__name__)
|
|
74
77
|
|
|
@@ -254,6 +257,7 @@ class ApiClient:
|
|
|
254
257
|
headers['User-Agent'] = self._compose_ua(request)
|
|
255
258
|
if self.get_token():
|
|
256
259
|
headers['x-access-token'] = self.get_token()
|
|
260
|
+
headers[hd.CLIENT_SOURCE] = self._get_client_source()
|
|
257
261
|
|
|
258
262
|
protocol = request.get_protocol_type()
|
|
259
263
|
url = request.get_url()
|
|
@@ -270,6 +274,15 @@ class ApiClient:
|
|
|
270
274
|
verify=self.get_verify())
|
|
271
275
|
response.set_content(body, "utf-8")
|
|
272
276
|
return response
|
|
277
|
+
|
|
278
|
+
@staticmethod
|
|
279
|
+
def _get_client_source():
|
|
280
|
+
client_source = os.environ.get(CLIENT_SOURCE_ENV)
|
|
281
|
+
if client_source is not None:
|
|
282
|
+
client_source = client_source.strip()
|
|
283
|
+
if client_source:
|
|
284
|
+
return client_source
|
|
285
|
+
return DEFAULT_CLIENT_SOURCE
|
|
273
286
|
|
|
274
287
|
def _implementation_of_do_action(self, request, signer=None):
|
|
275
288
|
if not isinstance(request, BaseRequest):
|
webull/core/headers.py
CHANGED
|
@@ -40,6 +40,7 @@ which was part of Alibaba Group.
|
|
|
40
40
|
"""
|
|
41
41
|
|
|
42
42
|
REQUEST_ID = "X-Request-Id"
|
|
43
|
+
CLIENT_SOURCE = "x-webull-client-source"
|
|
43
44
|
APP_KEY = "x-app-key"
|
|
44
45
|
SIGNATURE = "x-signature"
|
|
45
46
|
SIGN_ALGORITHM = "x-signature-algorithm"
|
|
@@ -54,4 +55,4 @@ ACCESS_TOKEN = "x-access-token"
|
|
|
54
55
|
NATIVE_HOST = "Host"
|
|
55
56
|
NATIVE_CONTENT_TYPE = "Content-Type"
|
|
56
57
|
NATIVE_CONTENT_LENGTH = "Content-Length"
|
|
57
|
-
NATIVE_USER_AGENT = "User-Agent"
|
|
58
|
+
NATIVE_USER_AGENT = "User-Agent"
|
webull/core/utils/common.py
CHANGED
|
@@ -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
webull/data/common/category.py
CHANGED
webull/trade/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = '2.0.
|
|
1
|
+
__version__ = '2.0.4'
|
webull/trade/common/category.py
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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)
|
{webull_openapi_python_sdk-2.0.2.dist-info → webull_openapi_python_sdk-2.0.4.dist-info}/RECORD
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
samples/__init__.py,sha256=
|
|
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,22 +15,23 @@ 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=
|
|
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=
|
|
22
|
-
webull/core/__init__.py,sha256=
|
|
23
|
-
webull/core/client.py,sha256=
|
|
21
|
+
webull/__init__.py,sha256=YuAuFLBrpl-SUl_UsvW1U1NTjqnldfuD1xUmSLmtaRw,22
|
|
22
|
+
webull/core/__init__.py,sha256=WKlbKb6oJxRdbtIgprpjwW9LCFGmoFyRipen8IS24Dc,225
|
|
23
|
+
webull/core/client.py,sha256=zxSBiII9KDxc5tHpTerJfV_PKPt8E9e3oTOpiakAtJw,16758
|
|
24
24
|
webull/core/compat.py,sha256=_r6Y_f3vTo_DoxOaCvLjnvOo1KRkD2Z9kXSh8OijEIA,3088
|
|
25
|
-
webull/core/headers.py,sha256=
|
|
25
|
+
webull/core/headers.py,sha256=Wj2zev1XYyYsy2b9YKnoK3GqjVsXZO_o2WziMmuVBTw,2061
|
|
26
26
|
webull/core/request.py,sha256=y8l_GwWdRLPr8x-0Qm7xUNg2AEQ8g67vGJZSCbTbMQE,8184
|
|
27
27
|
webull/core/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
28
28
|
webull/core/auth/credentials.py,sha256=n9rjS7VKxwZ1VPNQhENNil5QBO3ApKrYrSxC3eaEEuA,1766
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
247
|
-
webull_openapi_python_sdk-2.0.
|
|
248
|
-
webull_openapi_python_sdk-2.0.
|
|
249
|
-
webull_openapi_python_sdk-2.0.
|
|
250
|
-
webull_openapi_python_sdk-2.0.
|
|
251
|
-
webull_openapi_python_sdk-2.0.
|
|
252
|
-
webull_openapi_python_sdk-2.0.
|
|
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,,
|
{webull_openapi_python_sdk-2.0.2.dist-info → webull_openapi_python_sdk-2.0.4.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|