Skip to content

Commit ea1b7b1

Browse files
author
方佳
committed
Merge branch 'main_merge_260613_001' into 'main'
feat: Add support for Webull ZA、EU,Update proeprty trailing_limit_price See merge request webull/webull-openapi-python-sdk!33
2 parents 8533581 + d9db228 commit ea1b7b1

14 files changed

Lines changed: 75 additions & 53 deletions

File tree

‎README.md‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Webull OpenAPI Python SDK
22

3-
Note: This is the new version of the Webull SDK, currently applicable only to Webull Hong Kong, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK, Webull BR, or Webull MX customers.
3+
Note: This is the new version of the Webull SDK, currently applicable only to Webull Hong Kong, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK, Webull BR, Webull MX, Webull ZA, or Webull EU customers.
44

55
Webull OpenAPI aims to provide quantitative trading investors with convenient, fast and secure services. Webull aims to help every quant traders achieve flexible and changeable trading or market strategies.
66

@@ -30,7 +30,9 @@ Subscription to real-time information: Subscribe to order status changes, market
3030
| Webull UK | https://www.webull-uk.com/open-api-management |
3131
| Webull BR | https://www.webull.com.br/open-api-management |
3232
| Webull MX | https://www.webull.com.mx/open-api-management |
33-
- Requires Python 3.7 through 3.11.
33+
| Webull ZA | https://www.webull.co.za/open-api-management |
34+
| Webull EU | https://www.webull.eu/open-api-management |
35+
- Requires Python 3.7 through 3.13.
3436

3537
## Interface Protocol
3638

@@ -54,5 +56,7 @@ The bottom layer of Webull OpenAPI provides three protocols, HTTP / GRPC / MQTT,
5456
| Webull AU | https://developer.webull.com.au/apis/docs |
5557
| Webull MY | https://developer.webull.com.my/apis/docs |
5658
| Webull UK | https://developer.webull-uk.com/apis/docs |
57-
| Webull BR | https://developer.webull.com.br/apis/docs/ |
58-
| Webull MX | https://developer.webull.com.mx/apis/docs/ |
59+
| Webull BR | https://developer.webull.com.br/apis/docs |
60+
| Webull MX | https://developer.webull.com.mx/apis/docs |
61+
| Webull ZA | https://developer.webull.co.za/apis/docs |
62+
| Webull EU | https://developer.webull.eu/apis/docs |

‎samples/__init__.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '2.0.10'
1+
__version__ = '2.0.11'

‎samples/trade/trade_client_v3.py‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,8 @@
815815
"order_type": "TRAILING_STOP_LOSS_LIMIT",
816816
"quantity": "200",
817817
"trailing_stop_step": "0.1",
818-
"trailing_limit_price": "580",
818+
# also supports the legacy field name "trailing_limit_price"
819+
"trailing_limit_price_offset": "580",
819820
"trailing_type": "PERCENTAGE",
820821
"support_trading_session": "CORE",
821822
"side": "BUY",
@@ -836,7 +837,8 @@
836837
"stop_price": "560.77",
837838
"quantity": "200",
838839
"trailing_stop_step": "0.15",
839-
"trailing_limit_price": "581",
840+
# also supports the legacy field name "trailing_limit_price"
841+
"trailing_limit_price_offset": "581",
840842
"trailing_type": "PERCENTAGE",
841843
"trigger_price_type": "PRICE"
842844
}

‎tests/core/endpoint/test_endpoint.py‎

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ def test_quotes_endpoint(self):
9494
endpoint_request = ResolveEndpointRequest(_region_id, api_type.QUOTES)
9595
endpoint = resolver.resolve(endpoint_request)
9696
self.assertEqual(endpoint, 'data-api.webull.com')
97+
98+
_region_id = 'za'
99+
endpoint_request = ResolveEndpointRequest(_region_id, api_type.QUOTES)
100+
endpoint = resolver.resolve(endpoint_request)
101+
self.assertEqual(endpoint, 'data-api.webull.com.au')
102+
103+
_region_id = 'eu'
104+
endpoint_request = ResolveEndpointRequest(_region_id, api_type.QUOTES)
105+
endpoint = resolver.resolve(endpoint_request)
106+
self.assertEqual(endpoint, 'data-api.webull.eu')
97107
def test_api_endpoint(self):
98108
"""
99109
Set by Request, and it only takes effect for the current Request. The sample code is as follows.
@@ -148,6 +158,16 @@ def test_api_endpoint(self):
148158
endpoint_request = ResolveEndpointRequest(_region_id)
149159
endpoint = resolver.resolve(endpoint_request)
150160
self.assertEqual(endpoint, 'api.webull.com')
161+
162+
_region_id = 'za'
163+
endpoint_request = ResolveEndpointRequest(_region_id)
164+
endpoint = resolver.resolve(endpoint_request)
165+
self.assertEqual(endpoint, 'api.webull.com.au')
166+
167+
_region_id = 'eu'
168+
endpoint_request = ResolveEndpointRequest(_region_id)
169+
endpoint = resolver.resolve(endpoint_request)
170+
self.assertEqual(endpoint, 'api.webull.eu')
151171
def test_event_endpoint(self):
152172
resolver = DefaultEndpointResolver(self)
153173
_region_id = 'us'
@@ -198,4 +218,14 @@ def test_event_endpoint(self):
198218
_region_id = 'mx'
199219
endpoint_request = ResolveEndpointRequest(_region_id, api_type.EVENTS)
200220
endpoint = resolver.resolve(endpoint_request)
201-
self.assertEqual(endpoint, 'events-api.webull.com')
221+
self.assertEqual(endpoint, 'events-api.webull.com')
222+
223+
_region_id = 'za'
224+
endpoint_request = ResolveEndpointRequest(_region_id, api_type.EVENTS)
225+
endpoint = resolver.resolve(endpoint_request)
226+
self.assertEqual(endpoint, 'events-api.webull.com.au')
227+
228+
_region_id = 'eu'
229+
endpoint_request = ResolveEndpointRequest(_region_id, api_type.EVENTS)
230+
endpoint = resolver.resolve(endpoint_request)
231+
self.assertEqual(endpoint, 'events-api.webull.eu')

‎webull/__init__.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '2.0.10'
1+
__version__ = '2.0.11'

‎webull/core/__init__.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = '2.0.10'
1+
__version__ = '2.0.11'
22

33
import logging
44

‎webull/core/common/region.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,5 @@ class Region(Enum):
1212
UK = 'uk'
1313
BR = 'br'
1414
MX = 'mx'
15+
ZA = 'za'
16+
EU = 'eu'

‎webull/core/data/endpoints.json‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"default_region": "us",
3-
"regions": ["us", "hk", "jp", "sg", "th", "au", "my", "uk", "br", "mx"],
3+
"regions": ["us", "hk", "jp", "sg", "th", "au", "my", "uk", "br", "mx", "za", "eu"],
44
"region_mapping": {
55
"us": {
66
"api": "api.webull.com",
@@ -51,6 +51,16 @@
5151
"api": "api.webull.com",
5252
"quotes-api": "data-api.webull.com",
5353
"events-api": "events-api.webull.com"
54+
},
55+
"za": {
56+
"api": "api.webull.com.au",
57+
"quotes-api": "data-api.webull.com.au",
58+
"events-api": "events-api.webull.com.au"
59+
},
60+
"eu": {
61+
"api": "api.webull.eu",
62+
"quotes-api": "data-api.webull.eu",
63+
"events-api": "events-api.webull.eu"
5464
}
5565
}
5666
}

‎webull/core/http/initializer/client_initializer.py‎

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -54,38 +54,12 @@ def initializer(api_client):
5454
@staticmethod
5555
def init_token(api_client):
5656
"""Initialize token"""
57-
disable_config_region_ids = ["hk"]
58-
if api_client.get_region_id() in disable_config_region_ids:
59-
if not ClientInitializer._check_region_token_enable(api_client):
60-
return
61-
else:
62-
if not ClientInitializer._check_token_enable(api_client):
63-
return
57+
if not ClientInitializer._check_token_enable(api_client):
58+
return
6459

6560
token_manager = TokenManager(api_client.get_token_dir())
6661
token_manager.init_token(api_client)
6762

68-
@staticmethod
69-
def _check_region_token_enable(api_client):
70-
"""
71-
Check whether token checking is enabled in the specified region
72-
"""
73-
if api_client is None:
74-
logger.warning("_check_region_token_enable api_client is null, return False")
75-
return False
76-
77-
if not api_client.get_region_id():
78-
logger.warning("_check_region_token_enable region_id is null, return False")
79-
return False
80-
81-
enable_region_ids = ["hk"]
82-
result = api_client.get_region_id() in enable_region_ids
83-
logger.info(
84-
"_check_region_token_enable result is %s, enable regionIds is %s.",
85-
result, enable_region_ids
86-
)
87-
return result
88-
8963
@staticmethod
9064
def _check_token_enable(api_client):
9165
"""

‎webull/data/__init__.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# coding=utf-8
22

3-
__version__ = '2.0.10'
3+
__version__ = '2.0.11'

0 commit comments

Comments
 (0)