webull-openapi-python-sdk 2.0.0__py3-none-any.whl → 2.0.2__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/data/data_client_event.py +19 -2
- samples/data/data_streaming_client_event.py +1 -1
- samples/trade/trade_client_v3.py +2 -0
- webull/__init__.py +1 -1
- webull/core/__init__.py +1 -1
- webull/data/__init__.py +1 -1
- webull/data/data_streaming_client.py +3 -1
- webull/data/quotes/event_market_data.py +42 -0
- webull/data/quotes/instrument.py +44 -7
- webull/data/quotes/subscribe/event_tick_decoder.py +30 -0
- webull/data/quotes/subscribe/event_tick_result.py +56 -0
- webull/data/quotes/subscribe/message_pb2.py +3 -1
- webull/data/quotes/subscribe/payload_type.py +2 -1
- webull/data/request/get_event_bars_request.py +43 -0
- webull/data/request/get_event_events_request.py +33 -0
- webull/data/request/get_event_instrument_request.py +9 -0
- webull/data/request/get_event_series_categories.py +21 -0
- webull/data/request/get_event_series_request.py +8 -2
- webull/data/request/get_event_tick_request.py +32 -0
- webull/trade/__init__.py +1 -1
- webull/trade/common/position_intent.py +24 -0
- webull/trade/trade_events_client.py +5 -1
- {webull_openapi_python_sdk-2.0.0.dist-info → webull_openapi_python_sdk-2.0.2.dist-info}/METADATA +1 -1
- {webull_openapi_python_sdk-2.0.0.dist-info → webull_openapi_python_sdk-2.0.2.dist-info}/RECORD +29 -22
- {webull_openapi_python_sdk-2.0.0.dist-info → webull_openapi_python_sdk-2.0.2.dist-info}/WHEEL +1 -1
- {webull_openapi_python_sdk-2.0.0.dist-info → webull_openapi_python_sdk-2.0.2.dist-info}/licenses/LICENSE +0 -0
- {webull_openapi_python_sdk-2.0.0.dist-info → webull_openapi_python_sdk-2.0.2.dist-info}/licenses/NOTICE +0 -0
- {webull_openapi_python_sdk-2.0.0.dist-info → webull_openapi_python_sdk-2.0.2.dist-info}/top_level.txt +0 -0
samples/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = '2.0.
|
|
1
|
+
__version__ = '2.0.2'
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
+
from webull.data.common.timespan import Timespan
|
|
14
15
|
|
|
15
16
|
# coding=utf-8
|
|
16
17
|
|
|
@@ -35,11 +36,19 @@ api_client.add_endpoint(region_id, optional_api_endpoint)
|
|
|
35
36
|
if __name__ == '__main__':
|
|
36
37
|
data_client = DataClient(api_client)
|
|
37
38
|
|
|
39
|
+
res = data_client.instrument.get_event_categories()
|
|
40
|
+
if res.status_code == 200:
|
|
41
|
+
print('get_event_categories:', res.json())
|
|
42
|
+
|
|
38
43
|
res = data_client.instrument.get_event_series("ECONOMICS")
|
|
39
44
|
if res.status_code == 200:
|
|
40
45
|
print('get_event_series:', res.json())
|
|
41
46
|
|
|
42
|
-
res = data_client.instrument.
|
|
47
|
+
res = data_client.instrument.get_event_events("KXRATECUTCOUNT")
|
|
48
|
+
if res.status_code == 200:
|
|
49
|
+
print('get_event_events:', res.json())
|
|
50
|
+
|
|
51
|
+
res = data_client.instrument.get_event_instrument("KXRATECUTCOUNT")
|
|
43
52
|
if res.status_code == 200:
|
|
44
53
|
print('get_event_instrument:', res.json())
|
|
45
54
|
|
|
@@ -49,4 +58,12 @@ if __name__ == '__main__':
|
|
|
49
58
|
|
|
50
59
|
res = data_client.event_market_data.get_event_depth("KXRATECUTCOUNT-25DEC31-T10", Category.US_EVENT.name)
|
|
51
60
|
if res.status_code == 200:
|
|
52
|
-
print('get_event_depth:', res.json())
|
|
61
|
+
print('get_event_depth:', res.json())
|
|
62
|
+
|
|
63
|
+
res = data_client.event_market_data.get_event_bars("KXRATECUTCOUNT-25DEC31-T10", Timespan.M1, Category.US_EVENT.name, 200, False)
|
|
64
|
+
if res.status_code == 200:
|
|
65
|
+
print('get_event_bars:', res.json())
|
|
66
|
+
|
|
67
|
+
res = data_client.event_market_data.get_event_tick("KXRATECUTCOUNT-25DEC31-T10", Category.US_EVENT.name, 30)
|
|
68
|
+
if res.status_code == 200:
|
|
69
|
+
print('get_event_tick:', res.json())
|
|
@@ -43,7 +43,7 @@ if __name__ == '__main__':
|
|
|
43
43
|
print("connect success with session_id:%s" % quotes_session_id)
|
|
44
44
|
# subscribe
|
|
45
45
|
symbols = ['KXNHLGAME-26JAN21ANACOL-ANA', 'KXNBAGAME-26JAN20LACCHI-LAC']
|
|
46
|
-
sub_types = [SubscribeType.QUOTE.name, SubscribeType.SNAPSHOT.name]
|
|
46
|
+
sub_types = [SubscribeType.QUOTE.name, SubscribeType.SNAPSHOT.name, SubscribeType.TICK.name]
|
|
47
47
|
client.subscribe(symbols, Category.US_EVENT.name, sub_types)
|
|
48
48
|
|
|
49
49
|
def my_quotes_message_func(client, topic, quotes):
|
samples/trade/trade_client_v3.py
CHANGED
|
@@ -247,6 +247,7 @@ if __name__ == '__main__':
|
|
|
247
247
|
# ============================================================
|
|
248
248
|
|
|
249
249
|
# normal option order
|
|
250
|
+
# position_intent: Currently, only the US market is supported, and only options orders are allowed.
|
|
250
251
|
normal_option_client_order_id = uuid.uuid4().hex
|
|
251
252
|
new_normal_option_orders = [
|
|
252
253
|
{
|
|
@@ -259,6 +260,7 @@ if __name__ == '__main__':
|
|
|
259
260
|
"side": "BUY",
|
|
260
261
|
"time_in_force": "GTC",
|
|
261
262
|
"entrust_type": "QTY",
|
|
263
|
+
"position_intent": "BUY_TO_OPEN",
|
|
262
264
|
"legs": [
|
|
263
265
|
{
|
|
264
266
|
"side": "BUY",
|
webull/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = '2.0.
|
|
1
|
+
__version__ = '2.0.2'
|
webull/core/__init__.py
CHANGED
webull/data/__init__.py
CHANGED
|
@@ -18,8 +18,9 @@ from webull.data.internal.quotes_client import QuotesClient, LOG_ERR
|
|
|
18
18
|
from webull.data.quotes.market_streaming_data import MarketDataStreaming
|
|
19
19
|
from webull.data.quotes.subscribe.event_depth_decoder import EventDepthDecoder
|
|
20
20
|
from webull.data.quotes.subscribe.event_snapshot_decoder import EventSnapshotDecoder
|
|
21
|
+
from webull.data.quotes.subscribe.event_tick_decoder import EventTickDecoder
|
|
21
22
|
from webull.data.quotes.subscribe.payload_type import PAYLOAD_TYPE_QUOTE, PAYLOAD_TYPE_SHAPSHOT, PAYLOAD_TYPE_TICK, \
|
|
22
|
-
PAYLOAD_TYPE_EVENT_SHAPSHOT, PAYLOAD_TYPE_EVENT_DEPTH
|
|
23
|
+
PAYLOAD_TYPE_EVENT_SHAPSHOT, PAYLOAD_TYPE_EVENT_DEPTH, PAYLOAD_TYPE_EVENT_TICK
|
|
23
24
|
from webull.data.quotes.subscribe.quote_decoder import QuoteDecoder
|
|
24
25
|
from webull.data.quotes.subscribe.snapshot_decoder import SnapshotDecoder
|
|
25
26
|
from webull.data.quotes.subscribe.tick_decoder import TickDecoder
|
|
@@ -44,6 +45,7 @@ class DataStreamingClient(QuotesClient):
|
|
|
44
45
|
self.register_payload_decoder(PAYLOAD_TYPE_TICK, TickDecoder())
|
|
45
46
|
self.register_payload_decoder(PAYLOAD_TYPE_EVENT_DEPTH, EventDepthDecoder())
|
|
46
47
|
self.register_payload_decoder(PAYLOAD_TYPE_EVENT_SHAPSHOT, EventSnapshotDecoder())
|
|
48
|
+
self.register_payload_decoder(PAYLOAD_TYPE_EVENT_TICK, EventTickDecoder())
|
|
47
49
|
|
|
48
50
|
@property
|
|
49
51
|
def on_connect_success(self):
|
|
@@ -12,8 +12,11 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
from webull.data.common.category import Category
|
|
15
|
+
from webull.data.request.get_event_bars_request import GetEventBarsRequest
|
|
15
16
|
from webull.data.request.get_event_depth_request import GetEventDepthRequest
|
|
16
17
|
from webull.data.request.get_event_snapshot_request import GetEventSnapshotRequest
|
|
18
|
+
from webull.data.request.get_event_tick_request import GetEventTickRequest
|
|
19
|
+
|
|
17
20
|
|
|
18
21
|
class EventMarketData:
|
|
19
22
|
def __init__(self, api_client):
|
|
@@ -47,4 +50,43 @@ class EventMarketData:
|
|
|
47
50
|
quote_request.set_category(category)
|
|
48
51
|
quote_request.set_depth(depth)
|
|
49
52
|
response = self.client.get_response(quote_request)
|
|
53
|
+
return response
|
|
54
|
+
|
|
55
|
+
def get_event_bars(self, symbols, timespan, category=Category.US_EVENT.name, count=200, real_time_required=False):
|
|
56
|
+
"""
|
|
57
|
+
Get the current order book for a specific event instrument.
|
|
58
|
+
The order book shows all active bid orders for both yes and no sides of a binary market.
|
|
59
|
+
It returns yes bids and no bids only (no asks are returned). Price unit is based on usd_cent.
|
|
60
|
+
|
|
61
|
+
:param symbols: Symbol of the event market, supports JSON array format, multiple symbols separated by commas; maximum 100 symbols per query.
|
|
62
|
+
:param timespan:K-line time granularity.
|
|
63
|
+
:param category: default is US_EVENT, currently only US_EVENT is supported.
|
|
64
|
+
:param count: Number of entries, default 200 entries, maximum 1200 entries.
|
|
65
|
+
:param real_time_required: Does it include the latest data? The k-line that has not been finalized is not included by default. It is false and only used for minutes.
|
|
66
|
+
"""
|
|
67
|
+
quote_request = GetEventBarsRequest()
|
|
68
|
+
quote_request.set_symbols(symbols)
|
|
69
|
+
quote_request.set_category(category)
|
|
70
|
+
quote_request.set_timespan(timespan)
|
|
71
|
+
quote_request.set_count(count)
|
|
72
|
+
quote_request.set_real_time_required(real_time_required)
|
|
73
|
+
response = self.client.get_response(quote_request)
|
|
74
|
+
return response
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def get_event_tick(self, symbol, category=Category.US_EVENT.name, count=30):
|
|
78
|
+
"""
|
|
79
|
+
Detailed transaction records, including transaction time, price, quantity,
|
|
80
|
+
and transaction direction. Data is sorted in reverse chronological order,
|
|
81
|
+
with the most recent transaction record first.
|
|
82
|
+
|
|
83
|
+
:param symbol:Symbol of the event market.
|
|
84
|
+
:param category: default is US_EVENT, currently only US_EVENT is supported.
|
|
85
|
+
:param count: Number of entries, default 30 entries, maximum 1200 entries.
|
|
86
|
+
"""
|
|
87
|
+
quote_request = GetEventTickRequest()
|
|
88
|
+
quote_request.set_symbol(symbol)
|
|
89
|
+
quote_request.set_category(category)
|
|
90
|
+
quote_request.set_count(count)
|
|
91
|
+
response = self.client.get_response(quote_request)
|
|
50
92
|
return response
|
webull/data/quotes/instrument.py
CHANGED
|
@@ -12,7 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
from webull.data.common.category import Category
|
|
15
|
+
from webull.data.request.get_event_events_request import GetEventEventsRequest
|
|
15
16
|
from webull.data.request.get_event_instrument_request import GetEventInstrumentRequest
|
|
17
|
+
from webull.data.request.get_event_series_categories import GetEventCategoriesRequest
|
|
16
18
|
from webull.data.request.get_event_series_request import GetEventSeriesRequest
|
|
17
19
|
from webull.data.request.get_instruments_request import GetInstrumentsRequest
|
|
18
20
|
from webull.data.request.get_crypto_instruments_request import GetCryptoInstrumentsRequest
|
|
@@ -111,7 +113,15 @@ class Instrument:
|
|
|
111
113
|
response = self.client.get_response(futures_instrument_request)
|
|
112
114
|
return response
|
|
113
115
|
|
|
114
|
-
def
|
|
116
|
+
def get_event_categories(self):
|
|
117
|
+
"""
|
|
118
|
+
Query event contract categories
|
|
119
|
+
"""
|
|
120
|
+
event_categories_request = GetEventCategoriesRequest()
|
|
121
|
+
response = self.client.get_response(event_categories_request)
|
|
122
|
+
return response
|
|
123
|
+
|
|
124
|
+
def get_event_series(self, category=None, symbols=None, last_series_id=None, page_size=500):
|
|
115
125
|
"""
|
|
116
126
|
Retrieve multiple series with specified filters.
|
|
117
127
|
A series represents a template for recurring events that follow the same format and rules (e.g., “Monthly Jobs Report” ).
|
|
@@ -120,30 +130,57 @@ class Instrument:
|
|
|
120
130
|
:param category: The category which this series belongs to.Allowed values:
|
|
121
131
|
ECONOMICS, FINANCIALS, POLITICS, ENTERTAINMENT, SCIENCE_TECHNOLOGY,
|
|
122
132
|
CLIMATE_WEATHER, TRANSPORTATION, CRYPTO, SPORTS
|
|
123
|
-
:param
|
|
133
|
+
:param symbols: Symbol of the event series, supports JSON array format, multiple symbols separated by commas; maximum 100 symbols per query.
|
|
134
|
+
:param last_series_id: Last series id for pagination.
|
|
124
135
|
:param page_size: Page size, default 500.
|
|
125
136
|
"""
|
|
126
137
|
|
|
127
138
|
event_series_request = GetEventSeriesRequest()
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
139
|
+
if category:
|
|
140
|
+
event_series_request.set_category(category)
|
|
141
|
+
if symbols:
|
|
142
|
+
event_series_request.set_symbols(symbols)
|
|
143
|
+
if last_series_id:
|
|
144
|
+
event_series_request.set_last_series_id(last_series_id)
|
|
131
145
|
event_series_request.set_page_size(page_size)
|
|
132
146
|
response = self.client.get_response(event_series_request)
|
|
133
147
|
return response
|
|
134
148
|
|
|
135
|
-
def
|
|
149
|
+
def get_event_events(self, series_symbol, symbols=None, status=None):
|
|
150
|
+
"""
|
|
151
|
+
Query event contract events
|
|
152
|
+
|
|
153
|
+
:param series_symbol: Series Symbol that identifies this series.
|
|
154
|
+
:param symbols: Symbol of the event events, supports JSON array format, multiple symbols separated by commas; maximum 100 symbols per query.
|
|
155
|
+
:param status: Event status (optional, defaults to querying tradable/valid events).
|
|
156
|
+
"""
|
|
157
|
+
event_events_request = GetEventEventsRequest()
|
|
158
|
+
event_events_request.set_series_symbol(series_symbol)
|
|
159
|
+
if symbols:
|
|
160
|
+
event_events_request.set_symbols(symbols)
|
|
161
|
+
if status:
|
|
162
|
+
event_events_request.set_status(status)
|
|
163
|
+
response = self.client.get_response(event_events_request)
|
|
164
|
+
return response
|
|
165
|
+
|
|
166
|
+
def get_event_instrument(self, series_symbol, event_symbol=None, symbols=None, expiration_date_after=None, last_instrument_id=None, page_size=500):
|
|
136
167
|
"""
|
|
137
168
|
Retrieve profile information for event contract markets based on the series symbol.
|
|
138
169
|
|
|
139
170
|
:param series_symbol: Symbol that identifies this series.
|
|
171
|
+
:param event_symbol: Symbol of the event events.
|
|
172
|
+
:param symbols: Symbol of the event market, supports JSON array format, multiple symbols separated by commas; maximum 100 symbols per query.
|
|
140
173
|
:param expiration_date_after: Used to filter items whose expiration date is later than a specified date; the default selection is the current day (inclusive).
|
|
141
|
-
:param last_instrument_id: Last
|
|
174
|
+
:param last_instrument_id: Last instrument id for pagination.
|
|
142
175
|
:param page_size: Page size, default 500.
|
|
143
176
|
"""
|
|
144
177
|
|
|
145
178
|
event_instrument_request = GetEventInstrumentRequest()
|
|
146
179
|
event_instrument_request.set_series_symbol(series_symbol)
|
|
180
|
+
if event_symbol:
|
|
181
|
+
event_instrument_request.set_event_symbol(event_symbol)
|
|
182
|
+
if symbols:
|
|
183
|
+
event_instrument_request.set_symbols(symbols)
|
|
147
184
|
if expiration_date_after:
|
|
148
185
|
event_instrument_request.set_expiration_date_after(expiration_date_after)
|
|
149
186
|
if last_instrument_id:
|
|
@@ -0,0 +1,30 @@
|
|
|
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
|
+
# coding=utf-8
|
|
15
|
+
|
|
16
|
+
from webull.data.quotes.subscribe.message_pb2 import EventTick
|
|
17
|
+
from webull.data.quotes.subscribe.event_tick_result import EventTickResult
|
|
18
|
+
|
|
19
|
+
from webull.data.internal.quotes_payload_decoder import BaseQuotesPayloadDecoder
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class EventTickDecoder(BaseQuotesPayloadDecoder):
|
|
24
|
+
def __init__(self):
|
|
25
|
+
super().__init__()
|
|
26
|
+
|
|
27
|
+
def parse(self, payload):
|
|
28
|
+
eventTick = EventTick()
|
|
29
|
+
eventTick.ParseFromString(payload)
|
|
30
|
+
return EventTickResult(eventTick)
|
|
@@ -0,0 +1,56 @@
|
|
|
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
|
+
|
|
17
|
+
from decimal import Decimal
|
|
18
|
+
from webull.data.quotes.subscribe.basic_result import BasicResult
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class EventTickResult:
|
|
22
|
+
def __init__(self, pb_event_tick):
|
|
23
|
+
self.basic = BasicResult(pb_event_tick.basic)
|
|
24
|
+
self.time = pb_event_tick.time
|
|
25
|
+
self.yes_price = Decimal(pb_event_tick.yes_price) if pb_event_tick.yes_price else None
|
|
26
|
+
self.no_price = Decimal(pb_event_tick.no_price) if pb_event_tick.no_price else None
|
|
27
|
+
self.volume = pb_event_tick.volume
|
|
28
|
+
self.side = pb_event_tick.side
|
|
29
|
+
self.trade_id = pb_event_tick.trade_id
|
|
30
|
+
|
|
31
|
+
def get_basic(self):
|
|
32
|
+
return self.basic
|
|
33
|
+
|
|
34
|
+
def get_time(self):
|
|
35
|
+
return self.time
|
|
36
|
+
|
|
37
|
+
def get_yes_price(self):
|
|
38
|
+
return self.yes_price
|
|
39
|
+
|
|
40
|
+
def get_no_price(self):
|
|
41
|
+
return self.no_price
|
|
42
|
+
|
|
43
|
+
def get_volume(self):
|
|
44
|
+
return self.volume
|
|
45
|
+
|
|
46
|
+
def get_side(self):
|
|
47
|
+
return self.side
|
|
48
|
+
|
|
49
|
+
def get_trade_id(self):
|
|
50
|
+
return self.trade_id
|
|
51
|
+
|
|
52
|
+
def __repr__(self):
|
|
53
|
+
return "basic: %s,time: %s,yes_price: %s,no_price:%s,volume:%s,side:%s,trade_id:%s" % (self.basic, self.time, self.yes_price, self.no_price, self.volume, self.side, self.trade_id)
|
|
54
|
+
|
|
55
|
+
def __str__(self):
|
|
56
|
+
return self.__repr__()
|
|
@@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default()
|
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rmessage.proto\"Z\n\x05\x42\x61sic\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x15\n\rinstrument_id\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\t\x12\x17\n\x0ftrading_session\x18\x04 \x01(\t\"\xd6\x03\n\x08Snapshot\x12\x15\n\x05\x62\x61sic\x18\x01 \x01(\x0b\x32\x06.Basic\x12\x12\n\ntrade_time\x18\x02 \x01(\t\x12\r\n\x05price\x18\x03 \x01(\t\x12\x0c\n\x04open\x18\x04 \x01(\t\x12\x0c\n\x04high\x18\x05 \x01(\t\x12\x0b\n\x03low\x18\x06 \x01(\t\x12\x11\n\tpre_close\x18\x07 \x01(\t\x12\x0e\n\x06volume\x18\x08 \x01(\t\x12\x0e\n\x06\x63hange\x18\t \x01(\t\x12\x14\n\x0c\x63hange_ratio\x18\n \x01(\t\x12\x16\n\x0e\x65xt_trade_time\x18\x0b \x01(\t\x12\x11\n\text_price\x18\x0c \x01(\t\x12\x10\n\x08\x65xt_high\x18\r \x01(\t\x12\x0f\n\x07\x65xt_low\x18\x0e \x01(\t\x12\x12\n\next_volume\x18\x0f \x01(\t\x12\x12\n\next_change\x18\x10 \x01(\t\x12\x18\n\x10\x65xt_change_ratio\x18\x11 \x01(\t\x12\x16\n\x0eovn_trade_time\x18\x12 \x01(\t\x12\x11\n\tovn_price\x18\x13 \x01(\t\x12\x10\n\x08ovn_high\x18\x14 \x01(\t\x12\x0f\n\x07ovn_low\x18\x15 \x01(\t\x12\x12\n\novn_volume\x18\x16 \x01(\t\x12\x12\n\novn_change\x18\x17 \x01(\t\x12\x18\n\x10ovn_change_ratio\x18\x18 \x01(\t\"L\n\x05Quote\x12\x15\n\x05\x62\x61sic\x18\x01 \x01(\x0b\x32\x06.Basic\x12\x15\n\x04\x61sks\x18\x02 \x03(\x0b\x32\x07.AskBid\x12\x15\n\x04\x62ids\x18\x03 \x03(\x0b\x32\x07.AskBid\"X\n\x04Tick\x12\x15\n\x05\x62\x61sic\x18\x01 \x01(\x0b\x32\x06.Basic\x12\x0c\n\x04time\x18\x02 \x01(\t\x12\r\n\x05price\x18\x03 \x01(\t\x12\x0e\n\x06volume\x18\x04 \x01(\t\x12\x0c\n\x04side\x18\x05 \x01(\t\"U\n\x06\x41skBid\x12\r\n\x05price\x18\x01 \x01(\t\x12\x0c\n\x04size\x18\x02 \x01(\t\x12\x15\n\x05order\x18\x03 \x03(\x0b\x32\x06.Order\x12\x17\n\x06\x62roker\x18\x04 \x03(\x0b\x32\x07.Broker\"#\n\x05Order\x12\x0c\n\x04mpid\x18\x01 \x01(\t\x12\x0c\n\x04size\x18\x02 \x01(\t\"#\n\x06\x42roker\x12\x0b\n\x03\x62id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x8d\x02\n\rEventSnapshot\x12\x15\n\x05\x62\x61sic\x18\x01 \x01(\x0b\x32\x06.Basic\x12\r\n\x05price\x18\x02 \x01(\t\x12\x0e\n\x06volume\x18\x03 \x01(\t\x12\x17\n\x0flast_trade_time\x18\x04 \x01(\t\x12\x15\n\ropen_interest\x18\x05 \x01(\t\x12\x0f\n\x07yes_ask\x18\x06 \x01(\t\x12\x0f\n\x07yes_bid\x18\x07 \x01(\t\x12\x14\n\x0cyes_ask_size\x18\x08 \x01(\t\x12\x14\n\x0cyes_bid_size\x18\t \x01(\t\x12\x0e\n\x06no_ask\x18\n \x01(\t\x12\x0e\n\x06no_bid\x18\x0b \x01(\t\x12\x13\n\x0bno_ask_size\x18\x0c \x01(\t\x12\x13\n\x0bno_bid_size\x18\r \x01(\t\"b\n\nEventQuote\x12\x15\n\x05\x62\x61sic\x18\x01 \x01(\x0b\x32\x06.Basic\x12\x1e\n\x08yes_bids\x18\x02 \x03(\x0b\x32\x0c.EventAskBid\x12\x1d\n\x07no_bids\x18\x03 \x03(\x0b\x32\x0c.EventAskBid\"*\n\x0b\x45ventAskBid\x12\r\n\x05price\x18\x01 \x01(\t\x12\x0c\n\x04size\x18\x02 \x01(\tb\x06proto3')
|
|
16
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rmessage.proto\"Z\n\x05\x42\x61sic\x12\x0e\n\x06symbol\x18\x01 \x01(\t\x12\x15\n\rinstrument_id\x18\x02 \x01(\t\x12\x11\n\ttimestamp\x18\x03 \x01(\t\x12\x17\n\x0ftrading_session\x18\x04 \x01(\t\"\xd6\x03\n\x08Snapshot\x12\x15\n\x05\x62\x61sic\x18\x01 \x01(\x0b\x32\x06.Basic\x12\x12\n\ntrade_time\x18\x02 \x01(\t\x12\r\n\x05price\x18\x03 \x01(\t\x12\x0c\n\x04open\x18\x04 \x01(\t\x12\x0c\n\x04high\x18\x05 \x01(\t\x12\x0b\n\x03low\x18\x06 \x01(\t\x12\x11\n\tpre_close\x18\x07 \x01(\t\x12\x0e\n\x06volume\x18\x08 \x01(\t\x12\x0e\n\x06\x63hange\x18\t \x01(\t\x12\x14\n\x0c\x63hange_ratio\x18\n \x01(\t\x12\x16\n\x0e\x65xt_trade_time\x18\x0b \x01(\t\x12\x11\n\text_price\x18\x0c \x01(\t\x12\x10\n\x08\x65xt_high\x18\r \x01(\t\x12\x0f\n\x07\x65xt_low\x18\x0e \x01(\t\x12\x12\n\next_volume\x18\x0f \x01(\t\x12\x12\n\next_change\x18\x10 \x01(\t\x12\x18\n\x10\x65xt_change_ratio\x18\x11 \x01(\t\x12\x16\n\x0eovn_trade_time\x18\x12 \x01(\t\x12\x11\n\tovn_price\x18\x13 \x01(\t\x12\x10\n\x08ovn_high\x18\x14 \x01(\t\x12\x0f\n\x07ovn_low\x18\x15 \x01(\t\x12\x12\n\novn_volume\x18\x16 \x01(\t\x12\x12\n\novn_change\x18\x17 \x01(\t\x12\x18\n\x10ovn_change_ratio\x18\x18 \x01(\t\"L\n\x05Quote\x12\x15\n\x05\x62\x61sic\x18\x01 \x01(\x0b\x32\x06.Basic\x12\x15\n\x04\x61sks\x18\x02 \x03(\x0b\x32\x07.AskBid\x12\x15\n\x04\x62ids\x18\x03 \x03(\x0b\x32\x07.AskBid\"X\n\x04Tick\x12\x15\n\x05\x62\x61sic\x18\x01 \x01(\x0b\x32\x06.Basic\x12\x0c\n\x04time\x18\x02 \x01(\t\x12\r\n\x05price\x18\x03 \x01(\t\x12\x0e\n\x06volume\x18\x04 \x01(\t\x12\x0c\n\x04side\x18\x05 \x01(\t\"U\n\x06\x41skBid\x12\r\n\x05price\x18\x01 \x01(\t\x12\x0c\n\x04size\x18\x02 \x01(\t\x12\x15\n\x05order\x18\x03 \x03(\x0b\x32\x06.Order\x12\x17\n\x06\x62roker\x18\x04 \x03(\x0b\x32\x07.Broker\"#\n\x05Order\x12\x0c\n\x04mpid\x18\x01 \x01(\t\x12\x0c\n\x04size\x18\x02 \x01(\t\"#\n\x06\x42roker\x12\x0b\n\x03\x62id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\"\x8d\x02\n\rEventSnapshot\x12\x15\n\x05\x62\x61sic\x18\x01 \x01(\x0b\x32\x06.Basic\x12\r\n\x05price\x18\x02 \x01(\t\x12\x0e\n\x06volume\x18\x03 \x01(\t\x12\x17\n\x0flast_trade_time\x18\x04 \x01(\t\x12\x15\n\ropen_interest\x18\x05 \x01(\t\x12\x0f\n\x07yes_ask\x18\x06 \x01(\t\x12\x0f\n\x07yes_bid\x18\x07 \x01(\t\x12\x14\n\x0cyes_ask_size\x18\x08 \x01(\t\x12\x14\n\x0cyes_bid_size\x18\t \x01(\t\x12\x0e\n\x06no_ask\x18\n \x01(\t\x12\x0e\n\x06no_bid\x18\x0b \x01(\t\x12\x13\n\x0bno_ask_size\x18\x0c \x01(\t\x12\x13\n\x0bno_bid_size\x18\r \x01(\t\"b\n\nEventQuote\x12\x15\n\x05\x62\x61sic\x18\x01 \x01(\x0b\x32\x06.Basic\x12\x1e\n\x08yes_bids\x18\x02 \x03(\x0b\x32\x0c.EventAskBid\x12\x1d\n\x07no_bids\x18\x03 \x03(\x0b\x32\x0c.EventAskBid\"*\n\x0b\x45ventAskBid\x12\r\n\x05price\x18\x01 \x01(\t\x12\x0c\n\x04size\x18\x02 \x01(\t\"\x85\x01\n\tEventTick\x12\x15\n\x05\x62\x61sic\x18\x01 \x01(\x0b\x32\x06.Basic\x12\x11\n\tyes_price\x18\x02 \x01(\t\x12\x10\n\x08no_price\x18\x03 \x01(\t\x12\x0e\n\x06volume\x18\x04 \x01(\t\x12\x0c\n\x04side\x18\x05 \x01(\t\x12\x10\n\x08trade_id\x18\x06 \x01(\t\x12\x0c\n\x04time\x18\x07 \x01(\tb\x06proto3')
|
|
17
17
|
|
|
18
18
|
_globals = globals()
|
|
19
19
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
|
@@ -40,4 +40,6 @@ if _descriptor._USE_C_DESCRIPTORS == False:
|
|
|
40
40
|
_globals['_EVENTQUOTE']._serialized_end=1281
|
|
41
41
|
_globals['_EVENTASKBID']._serialized_start=1283
|
|
42
42
|
_globals['_EVENTASKBID']._serialized_end=1325
|
|
43
|
+
_globals['_EVENTTICK']._serialized_start=1328
|
|
44
|
+
_globals['_EVENTTICK']._serialized_end=1461
|
|
43
45
|
# @@protoc_insertion_point(module_scope)
|
|
@@ -18,4 +18,5 @@ PAYLOAD_TYPE_QUOTE = 'quote'
|
|
|
18
18
|
PAYLOAD_TYPE_SHAPSHOT = 'snapshot'
|
|
19
19
|
PAYLOAD_TYPE_TICK = 'tick'
|
|
20
20
|
PAYLOAD_TYPE_EVENT_DEPTH = 'event-quote'
|
|
21
|
-
PAYLOAD_TYPE_EVENT_SHAPSHOT = 'event-snapshot'
|
|
21
|
+
PAYLOAD_TYPE_EVENT_SHAPSHOT = 'event-snapshot'
|
|
22
|
+
PAYLOAD_TYPE_EVENT_TICK = 'event-tick'
|
|
@@ -0,0 +1,43 @@
|
|
|
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
|
+
|
|
17
|
+
from webull.core.request import ApiRequest
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class GetEventBarsRequest(ApiRequest):
|
|
21
|
+
def __init__(self):
|
|
22
|
+
ApiRequest.__init__(self, "/openapi/market-data/event/bars", version='v2', method="GET", query_params={})
|
|
23
|
+
|
|
24
|
+
def set_symbols(self, symbols):
|
|
25
|
+
if isinstance(symbols, str):
|
|
26
|
+
self.add_query_param("symbols", symbols)
|
|
27
|
+
elif isinstance(symbols, list):
|
|
28
|
+
self.add_query_param("symbols", ",".join(symbols))
|
|
29
|
+
|
|
30
|
+
def set_category(self, category):
|
|
31
|
+
self.add_query_param("category", category)
|
|
32
|
+
|
|
33
|
+
def set_timespan(self, timespan):
|
|
34
|
+
if timespan:
|
|
35
|
+
self.add_query_param("timespan", timespan)
|
|
36
|
+
|
|
37
|
+
def set_count(self, count):
|
|
38
|
+
if count:
|
|
39
|
+
self.add_query_param("count", count)
|
|
40
|
+
|
|
41
|
+
def set_real_time_required(self, real_time_required):
|
|
42
|
+
if real_time_required:
|
|
43
|
+
self.add_query_param("real_time_required", real_time_required)
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
|
|
17
|
+
from webull.core.request import ApiRequest
|
|
18
|
+
|
|
19
|
+
class GetEventEventsRequest(ApiRequest):
|
|
20
|
+
def __init__(self):
|
|
21
|
+
ApiRequest.__init__(self, "/openapi/instrument/event/events", version='v2', method="GET", query_params={})
|
|
22
|
+
|
|
23
|
+
def set_series_symbol(self, series_symbol):
|
|
24
|
+
self.add_query_param("series_symbol", series_symbol)
|
|
25
|
+
|
|
26
|
+
def set_symbols(self, symbols):
|
|
27
|
+
if isinstance(symbols, str):
|
|
28
|
+
self.add_query_param("symbols", symbols)
|
|
29
|
+
elif isinstance(symbols, list):
|
|
30
|
+
self.add_query_param("symbols", ",".join(symbols))
|
|
31
|
+
|
|
32
|
+
def set_status(self, status):
|
|
33
|
+
self.add_query_param("status", status)
|
|
@@ -23,6 +23,15 @@ class GetEventInstrumentRequest(ApiRequest):
|
|
|
23
23
|
def set_series_symbol(self, series_symbol):
|
|
24
24
|
self.add_query_param("series_symbol", series_symbol)
|
|
25
25
|
|
|
26
|
+
def set_event_symbol(self, event_symbol):
|
|
27
|
+
self.add_query_param("event_symbol", event_symbol)
|
|
28
|
+
|
|
29
|
+
def set_symbols(self, symbols):
|
|
30
|
+
if isinstance(symbols, str):
|
|
31
|
+
self.add_query_param("symbols", symbols)
|
|
32
|
+
elif isinstance(symbols, list):
|
|
33
|
+
self.add_query_param("symbols", ",".join(symbols))
|
|
34
|
+
|
|
26
35
|
def set_expiration_date_after(self, expiration_date_after):
|
|
27
36
|
self.add_query_param("expiration_date_after", expiration_date_after)
|
|
28
37
|
|
|
@@ -0,0 +1,21 @@
|
|
|
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
|
+
|
|
17
|
+
from webull.core.request import ApiRequest
|
|
18
|
+
|
|
19
|
+
class GetEventCategoriesRequest(ApiRequest):
|
|
20
|
+
def __init__(self):
|
|
21
|
+
ApiRequest.__init__(self, "/openapi/instrument/event/categories", version='v2', method="GET", query_params={})
|
|
@@ -23,8 +23,14 @@ class GetEventSeriesRequest(ApiRequest):
|
|
|
23
23
|
def set_category(self, category):
|
|
24
24
|
self.add_query_param("category", category)
|
|
25
25
|
|
|
26
|
-
def
|
|
27
|
-
|
|
26
|
+
def set_symbols(self, symbols):
|
|
27
|
+
if isinstance(symbols, str):
|
|
28
|
+
self.add_query_param("symbols", symbols)
|
|
29
|
+
elif isinstance(symbols, list):
|
|
30
|
+
self.add_query_param("symbols", ",".join(symbols))
|
|
31
|
+
|
|
32
|
+
def set_last_series_id(self, last_series_id):
|
|
33
|
+
self.add_query_param("last_series_id", last_series_id)
|
|
28
34
|
|
|
29
35
|
def set_page_size(self, page_size):
|
|
30
36
|
self.add_query_param("page_size", page_size)
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
|
|
17
|
+
from webull.core.request import ApiRequest
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class GetEventTickRequest(ApiRequest):
|
|
21
|
+
def __init__(self):
|
|
22
|
+
ApiRequest.__init__(self, "/openapi/market-data/event/tick", version='v2', method="GET", query_params={})
|
|
23
|
+
|
|
24
|
+
def set_symbol(self, symbol):
|
|
25
|
+
self.add_query_param("symbol", symbol)
|
|
26
|
+
|
|
27
|
+
def set_category(self, category):
|
|
28
|
+
self.add_query_param("category", category)
|
|
29
|
+
|
|
30
|
+
def set_count(self, count):
|
|
31
|
+
if count:
|
|
32
|
+
self.add_query_param("count", count)
|
webull/trade/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = '
|
|
1
|
+
__version__ = '2.0.2'
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
|
|
17
|
+
from webull.core.common.easy_enum import EasyEnum
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class OrderStatus(EasyEnum):
|
|
21
|
+
BUY_TO_OPEN = (1, "BUY_TO_OPEN")
|
|
22
|
+
BUY_TO_CLOSE = (2, "BUY_TO_CLOSE")
|
|
23
|
+
SELL_TO_OPEN = (3, "SELL_TO_OPEN")
|
|
24
|
+
SELL_TO_CLOSE = (4, "SELL_TO_CLOSE")
|
|
@@ -68,8 +68,12 @@ class TradeEventsClient():
|
|
|
68
68
|
self._on_log = None
|
|
69
69
|
|
|
70
70
|
def _build_request(self, app_key, app_secret, accounts):
|
|
71
|
+
if self._region_id == 'us':
|
|
72
|
+
subscribeType = 3
|
|
73
|
+
else:
|
|
74
|
+
subscribeType = 1
|
|
71
75
|
request = pb.SubscribeRequest(
|
|
72
|
-
subscribeType=
|
|
76
|
+
subscribeType= subscribeType, # 1、2、3 allowed now
|
|
73
77
|
timestamp=int(time.time() * 1000), # millis
|
|
74
78
|
accounts=accounts,
|
|
75
79
|
)
|
{webull_openapi_python_sdk-2.0.0.dist-info → webull_openapi_python_sdk-2.0.2.dist-info}/RECORD
RENAMED
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
samples/__init__.py,sha256=
|
|
1
|
+
samples/__init__.py,sha256=kumiGImhzOTlTrRM-6jDo2mNnVHGO_2vxtrhB0nzAiw,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
|
|
5
5
|
samples/assets/assets_client.py,sha256=p9LS2Td3gbUMkHn4LD_9RMCFuaQRUbsKvG4PhZBGJDc,1974
|
|
6
6
|
samples/data/__init__.py,sha256=eoZ6GfifbqhMLNzjlqRDVil-yyBkOmVN9ujSgJWNBlY,15
|
|
7
7
|
samples/data/data_client.py,sha256=8FR5ZOY8jWCGfN3XohzyvLdFxYv-TdqfWRKw3E827WY,5248
|
|
8
|
-
samples/data/data_client_event.py,sha256=
|
|
8
|
+
samples/data/data_client_event.py,sha256=u6Bebo2hTE0Ri1bQHa8nhFEe-fBbdxfNwLpTZh3E1WY,3046
|
|
9
9
|
samples/data/data_streaming_client.py,sha256=2da21SE_Mneo7zbM_l1rkpdBBbI4avrpnSPMxsZIalw,4085
|
|
10
10
|
samples/data/data_streaming_client_async.py,sha256=o_u1ch8JdbcYnLCvDCCUzO-Z1IG7BUKncu_GB_kCbOs,4443
|
|
11
|
-
samples/data/data_streaming_client_event.py,sha256=
|
|
11
|
+
samples/data/data_streaming_client_event.py,sha256=688YhVFA53AWkYBq5-PBXMKIBICf626LpgN6ESHaRSA,3075
|
|
12
12
|
samples/order/__init__.py,sha256=eoZ6GfifbqhMLNzjlqRDVil-yyBkOmVN9ujSgJWNBlY,15
|
|
13
13
|
samples/order/order_option_client.py,sha256=njxr1QZc69_VbHsp9D9cOv1_-AekO2uNYKiY7o0-1Eg,3602
|
|
14
14
|
samples/order/order_stock_client.py,sha256=hYwVwVFVERk-YS7gRcW-LuGfAvcF8VJHZs1qwLcFhYU,3529
|
|
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=0PPa8Ws8xquKkoxLNI9kdpHqbmIDvjrX449NCW-dwYs,18933
|
|
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=
|
|
21
|
+
webull/__init__.py,sha256=kumiGImhzOTlTrRM-6jDo2mNnVHGO_2vxtrhB0nzAiw,22
|
|
22
|
+
webull/core/__init__.py,sha256=Ylr7nRvr6kvXjQi7itfhWrS1jw3gBhZft9UJvKU5NME,225
|
|
23
23
|
webull/core/client.py,sha256=QTH_2CuPdtl5hgfjZMMHV9XkC2NkHe929t_EC-oCYqs,16314
|
|
24
24
|
webull/core/compat.py,sha256=_r6Y_f3vTo_DoxOaCvLjnvOo1KRkD2Z9kXSh8OijEIA,3088
|
|
25
25
|
webull/core/headers.py,sha256=7aMt3_YtaL9Yhqj2T1g7ESQgkI78SAXIk7hMX5U5FgE,2019
|
|
@@ -84,9 +84,9 @@ webull/core/utils/common.py,sha256=iQ-HWNhpg8EhtIKS7Iqp2xHrQmwEwcK9PrMwlTmu1C4,1
|
|
|
84
84
|
webull/core/utils/data.py,sha256=YUyoWY68_2RkKanh3jsDscgGx__FIPh5VNEGXr1Qotc,852
|
|
85
85
|
webull/core/utils/desensitize.py,sha256=f8_ps9BrG3WfXD8ZAw873-_YoGeke1Q55CeDwRmYkqA,1104
|
|
86
86
|
webull/core/utils/validation.py,sha256=gJcIrHYtgo48yVJ0q6O-f5buTYWOcr6ShhDIBhTp-Yg,1957
|
|
87
|
-
webull/data/__init__.py,sha256=
|
|
87
|
+
webull/data/__init__.py,sha256=VneTYPdxN13uMVBkCiHF3l7IKhv6hDMTctOC82Pdacg,38
|
|
88
88
|
webull/data/data_client.py,sha256=1_jrNHrqes7vygUkA1GRI_CIMJp4zcv_Ny8XUDyck1E,1997
|
|
89
|
-
webull/data/data_streaming_client.py,sha256=
|
|
89
|
+
webull/data/data_streaming_client.py,sha256=TQBAilvOLCbcMqacByrniXGr9VjSwjym-4-LUOiqKx8,4456
|
|
90
90
|
webull/data/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
91
91
|
webull/data/common/category.py,sha256=7zp-C6ex1eBHw4jTKgeg4X_JASjAM619pLpzQK9XTbc,942
|
|
92
92
|
webull/data/common/connect_ack.py,sha256=PGhtTzb1hAciHRvMSqMUasyEMC6vdV52taP8RbTB8t8,1209
|
|
@@ -108,9 +108,9 @@ webull/data/internal/quotes_payload_decoder.py,sha256=xyG2bEeicF_mZLgdMZUTC7CYpZ
|
|
|
108
108
|
webull/data/internal/quotes_topic.py,sha256=kG4RZTjj01U0e54qoOrJHlLrPeBzXekySasm2uoyXVo,1138
|
|
109
109
|
webull/data/quotes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
110
110
|
webull/data/quotes/crypto_market_data.py,sha256=UQlxUz0GntvwcRS-Vh_h7cXbhQ045MqPlG5AhWUoQI4,3063
|
|
111
|
-
webull/data/quotes/event_market_data.py,sha256=
|
|
111
|
+
webull/data/quotes/event_market_data.py,sha256=lARSHqnVxRZZNOIi9uP-Rs5StMIUWtmwrw-p8droqtc,4650
|
|
112
112
|
webull/data/quotes/futures_market_data.py,sha256=fc9giYNy1LcdLHOJV31zMbPBKtWDH8kBW5xRFgHzQUA,5596
|
|
113
|
-
webull/data/quotes/instrument.py,sha256=
|
|
113
|
+
webull/data/quotes/instrument.py,sha256=hEuZe-LwZkJxF5HMt0evnIjMl8cVzxMTTqD-55458q8,9356
|
|
114
114
|
webull/data/quotes/market_data.py,sha256=5HjzLQje1F7OxasRrjNPZ2d-tkuYJ-aDMZj3fVEO6cI,11329
|
|
115
115
|
webull/data/quotes/market_streaming_data.py,sha256=cI9xxGpKV_KDS8cgh9azHifBji0yeSuKmH7Jxaqij38,3139
|
|
116
116
|
webull/data/quotes/subscribe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -121,9 +121,11 @@ webull/data/quotes/subscribe/event_depth_decoder.py,sha256=-2mOw4o32HWO1a7MuB3hg
|
|
|
121
121
|
webull/data/quotes/subscribe/event_depth_result.py,sha256=30hUvNqQZNnwGNngmqPO3eFtCkJXd6OjjV8FadN7uXE,1510
|
|
122
122
|
webull/data/quotes/subscribe/event_snapshot_decoder.py,sha256=R1Pnz-Ktmwo3vZ7CVTSY9labn-nZealarE6c0cSieRU,1090
|
|
123
123
|
webull/data/quotes/subscribe/event_snapshot_result.py,sha256=npGS47XNpxP8-u6-3K2mLnLeiI8ofgotOOleqfHkUsc,3327
|
|
124
|
-
webull/data/quotes/subscribe/
|
|
124
|
+
webull/data/quotes/subscribe/event_tick_decoder.py,sha256=-zwRK6E82ZZcl9bh8EizoI6P9u43vTmXJil1Rpd9CVI,1055
|
|
125
|
+
webull/data/quotes/subscribe/event_tick_result.py,sha256=t2N8l6YoXCZA5IntPAQTd4fMFIf_X0uSicmfeCMWJt8,1801
|
|
126
|
+
webull/data/quotes/subscribe/message_pb2.py,sha256=A0Efl43sUsebfaGxKc1J-2MZgykMgxuCBQimT5cbelI,4836
|
|
125
127
|
webull/data/quotes/subscribe/order_result.py,sha256=bqLjRzCDK0jpQBMm00QxfgV-SPg04lOLYxc8SgpkFDw,912
|
|
126
|
-
webull/data/quotes/subscribe/payload_type.py,sha256=
|
|
128
|
+
webull/data/quotes/subscribe/payload_type.py,sha256=2b-Xd0RzME0ou-SaKarLZ5ZRwBZVwA7TevIH4075IHU,801
|
|
127
129
|
webull/data/quotes/subscribe/quote_decoder.py,sha256=vTDKi3TaQ79ODTydVcEEiJR2g0fQLPf5hUOqo7Mi1gw,1016
|
|
128
130
|
webull/data/quotes/subscribe/quote_result.py,sha256=2SoRzSGANphAut1jleNnfZtUhpqqbELRcs1biu440p8,1442
|
|
129
131
|
webull/data/quotes/subscribe/snapshot_decoder.py,sha256=dukBHXa971LHp9oPkgQ4mqL_8yIAU5XSlUIUjpMz2NY,1045
|
|
@@ -137,10 +139,14 @@ webull/data/request/get_crypto_historical_bars_request.py,sha256=FKIp2hB2fPbkMLx
|
|
|
137
139
|
webull/data/request/get_crypto_instruments_request.py,sha256=GwOA9oPBH4qNg7yR-lVjrRSGZDF5zfRUBS4PegKLcjk,1549
|
|
138
140
|
webull/data/request/get_crypto_snapshot_request.py,sha256=W-z9nuBu2RaXqy07zFVHMQs9GP5Hc55vOWWYKoibWVA,1136
|
|
139
141
|
webull/data/request/get_eod_bars_request.py,sha256=CwbyXeAE-iPKu43zNxcekSw5qOlfEwZsztFxCQvAXuQ,1234
|
|
142
|
+
webull/data/request/get_event_bars_request.py,sha256=fsZkmPQoUIhRZnWr7CUR2PZl9f7ciNdO2i8t8xotDYU,1505
|
|
140
143
|
webull/data/request/get_event_depth_request.py,sha256=g0WzBAc7ab8TdYFJ1EWs9KxOvkrXcvuQrDSS-hNrOkQ,1079
|
|
141
|
-
webull/data/request/
|
|
142
|
-
webull/data/request/
|
|
144
|
+
webull/data/request/get_event_events_request.py,sha256=4n-dnJSpUmm8AOOXwKgUQeV6ngJiSDu4IrmlJnIUAX4,1229
|
|
145
|
+
webull/data/request/get_event_instrument_request.py,sha256=2eCthD00T_R9bquwXdHInwAWJwIwn_23tzk9U9yTwbA,1628
|
|
146
|
+
webull/data/request/get_event_series_categories.py,sha256=Q-ZDjSPYHIdtnE-qtXowUwCj8b6LAJQN_HIfzZtXzTg,815
|
|
147
|
+
webull/data/request/get_event_series_request.py,sha256=tuhG-EyXTqA6HiDslVGr9r96IEvop4zbxDjHg1tWt8g,1344
|
|
143
148
|
webull/data/request/get_event_snapshot_request.py,sha256=rQzdZWQ7eFohYMYmWaZInmdpyNi6rR5KhxgDOPlr_Wc,1133
|
|
149
|
+
webull/data/request/get_event_tick_request.py,sha256=DCoj_arn2L6KQLnolAXmBsrUAQwEdwD8wBRssdq4AEA,1077
|
|
144
150
|
webull/data/request/get_footprint_request.py,sha256=MnbKhhe7QMkKqyTxmXl-ztDl5l_3kkFhT1vtql82K3Y,1664
|
|
145
151
|
webull/data/request/get_futures_depth_request.py,sha256=d6Tl-75pcJlvX6-beAdko15o8hDhdB-486uxH8AeGIk,1083
|
|
146
152
|
webull/data/request/get_futures_footprint_request.py,sha256=I0l-SlXBKqY61Oxq1zn1EWwLY79euuEoUcrvCzPJlA8,1673
|
|
@@ -157,9 +163,9 @@ webull/data/request/get_snapshot_request.py,sha256=OD2PiaxmBCboFDaU8DFTwvfNd2zOb
|
|
|
157
163
|
webull/data/request/get_tick_request.py,sha256=rUHhQgC8Z_6ensLyCkg3DDK55SlEi0Bc_dhpCIIspDs,1366
|
|
158
164
|
webull/data/request/subscribe_request.py,sha256=dm93Q5Q4gigAMqAobolaYYSs3wM6QddPUZOjEtJsX-8,1471
|
|
159
165
|
webull/data/request/unsubscribe_request.py,sha256=hQA4mYM64PgmQEA2otl47-3nCXqjsSY_weFA3_wNbMM,1446
|
|
160
|
-
webull/trade/__init__.py,sha256=
|
|
166
|
+
webull/trade/__init__.py,sha256=GAIRmJowMWRtWQeCyC7ifwuM8E1mb_c41kcL-Cp0kAc,21
|
|
161
167
|
webull/trade/trade_client.py,sha256=_6lH4KO-jKgKWU28fWNsc9-KEHto-WvaP0gT96BJ_dw,2184
|
|
162
|
-
webull/trade/trade_events_client.py,sha256=
|
|
168
|
+
webull/trade/trade_events_client.py,sha256=Vl4qsIEuDagjI7csqKr7K0fqHXbu-iN-5Ti28HBcub4,9017
|
|
163
169
|
webull/trade/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
164
170
|
webull/trade/common/account_type.py,sha256=haVAB33MERN6XyPsbrfVQhK9_CpU90VltI6_KDkxzlE,715
|
|
165
171
|
webull/trade/common/category.py,sha256=GJ9pDCMkwq7062o9L9o5aPvqHoYxuMqEbInlkfxD65U,911
|
|
@@ -174,6 +180,7 @@ webull/trade/common/order_side.py,sha256=9kfuMnMzG3a_8Qq9jbeei9tQCVn3sTFA0jYAu6u
|
|
|
174
180
|
webull/trade/common/order_status.py,sha256=A9fSZR3x2EyQ87IFtj08QvPHxoxNJ7yTN0162u877FU,828
|
|
175
181
|
webull/trade/common/order_tif.py,sha256=ehP2gFgReW11aiqQFcO4k3EtqVC7NRaqldIPEfE6EOY,759
|
|
176
182
|
webull/trade/common/order_type.py,sha256=dXOaTtRQiubudg3A5sj3imaGjaedqUJvG_6bkco7vxc,1099
|
|
183
|
+
webull/trade/common/position_intent.py,sha256=nfO6vihp3z_rk4QUpOlUuFEiLL3KVWja2G-Dd-UtslU,821
|
|
177
184
|
webull/trade/common/trade_policy.py,sha256=Tm3RN2_fZSXl5APPWeg8riEHlrvFURPt-dGIK6zDbPU,800
|
|
178
185
|
webull/trade/common/trading_date_type.py,sha256=xw8-oxBZNB-jdF25-PRv_5gwpXs8MksVZyZ7ZXRMLqY,747
|
|
179
186
|
webull/trade/common/trailing_type.py,sha256=w-wi2Gy-v-8b2oUprQHobwql639Je4FIlPKxojlagz4,729
|
|
@@ -237,9 +244,9 @@ webull/trade/trade/v2/account_info_v2.py,sha256=IGY_BGTrZ0h7yQ_nDodNtmKen9gXW6he
|
|
|
237
244
|
webull/trade/trade/v2/order_operation_v2.py,sha256=m54RH2j45CBBWEnqe4KxrsltAF44XKtPMT4kv8t7djQ,12745
|
|
238
245
|
webull/trade/trade/v3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
239
246
|
webull/trade/trade/v3/order_opration_v3.py,sha256=_L10--m_XhoMe8YeYjQXVvRoTAWoRRzLU59UeneyMrU,7428
|
|
240
|
-
webull_openapi_python_sdk-2.0.
|
|
241
|
-
webull_openapi_python_sdk-2.0.
|
|
242
|
-
webull_openapi_python_sdk-2.0.
|
|
243
|
-
webull_openapi_python_sdk-2.0.
|
|
244
|
-
webull_openapi_python_sdk-2.0.
|
|
245
|
-
webull_openapi_python_sdk-2.0.
|
|
247
|
+
webull_openapi_python_sdk-2.0.2.dist-info/licenses/LICENSE,sha256=ALOnsLtb1aHxmDJg3-oMi0BO-i-cjfyZaOBfnnavKMc,11359
|
|
248
|
+
webull_openapi_python_sdk-2.0.2.dist-info/licenses/NOTICE,sha256=X5TApte6CPV10b96Cb70IRLusXmiRmK_R-dB-1tQM_I,2018
|
|
249
|
+
webull_openapi_python_sdk-2.0.2.dist-info/METADATA,sha256=5f5IQbNnYzJhQpI4ifg6cU8FbrqvDs6qRrDCwN-OfW4,1032
|
|
250
|
+
webull_openapi_python_sdk-2.0.2.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
|
|
251
|
+
webull_openapi_python_sdk-2.0.2.dist-info/top_level.txt,sha256=h8pEjNDGWS2ZUZ2vYFpUShoMQT0ZRIQaD57QJWD8_aI,15
|
|
252
|
+
webull_openapi_python_sdk-2.0.2.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|