webull-openapi-python-sdk 2.0.7__py3-none-any.whl → 2.0.9__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.7'
1
+ __version__ = '2.0.9'
@@ -24,6 +24,7 @@ optional_api_endpoint = "<api_endpoint>"
24
24
  your_app_key = "<your_app_key>"
25
25
  your_app_secret = "<your_app_secret>"
26
26
  region_id = "<region_id>"
27
+
27
28
  # The token_dir parameter can be used to specify the directory for storing the 2FA token. Both absolute and relative paths are supported and this option has the highest priority.
28
29
  # Alternatively, the storage directory can be configured via an environment variable with the key WEBULL_OPENAPI_TOKEN_DIR, which also supports both absolute and relative paths.
29
30
  # If neither is specified, the default configuration will be used, and the token will be stored at conf/token.txt under the current working directory.
@@ -145,3 +146,21 @@ if __name__ == '__main__':
145
146
  res = data_client.market_data.get_noii_snapshot("AAPL", Category.US_STOCK.name, "PRE_CLOSE")
146
147
  if res.status_code == 200:
147
148
  print('get_noii_snapshot (closing):', res.json())
149
+
150
+ # Option market data - Historical bars
151
+ # Rate limit: 1 request per second per App Key
152
+ res = data_client.option_market_data.get_option_history_bars('AAPL260522C00300000', Category.US_OPTION.name, Timespan.M1.name)
153
+ if res.status_code == 200:
154
+ print('get_option_history_bars:', res.json())
155
+
156
+ # Option market data - Tick
157
+ # Rate limit: 60 requests per minute
158
+ res = data_client.option_market_data.get_option_tick("AAPL260522C00300000", Category.US_OPTION.name, count=30)
159
+ if res.status_code == 200:
160
+ print('get_option_tick:', res.json())
161
+
162
+ # Option market data - Snapshot
163
+ # Rate limit: 60 requests per minute
164
+ res = data_client.option_market_data.get_option_snapshot("AAPL260522C00300000", Category.US_OPTION.name)
165
+ if res.status_code == 200:
166
+ print('get_option_snapshot:', res.json())
@@ -529,3 +529,331 @@ if __name__ == '__main__':
529
529
  res = trade_client.order_v3.get_order_detail(account_id, alog_client_order_id)
530
530
  if res.status_code == 200:
531
531
  print('get order detail res:', res.json())
532
+
533
+ # ============================================================
534
+ # Stop Loss Order Example (HK Market)
535
+ # ============================================================
536
+ stop_loss_client_order_id = uuid.uuid4().hex
537
+ print('stop loss client order id:', stop_loss_client_order_id)
538
+ new_stop_loss_orders = [
539
+ {
540
+ "combo_type": "NORMAL",
541
+ "client_order_id": stop_loss_client_order_id,
542
+ "symbol": "00700",
543
+ "instrument_type": "EQUITY",
544
+ "market": "HK",
545
+ "order_type": "STOP_LOSS",
546
+ "quantity": "200",
547
+ "stop_price": "560.35",
548
+ "support_trading_session": "CORE",
549
+ "side": "BUY",
550
+ "time_in_force": "DAY",
551
+ "entrust_type": "QTY",
552
+ "trigger_price_type": "PRICE"
553
+ }
554
+ ]
555
+
556
+ res = trade_client.order_v3.place_order(account_id, new_stop_loss_orders)
557
+ if res.status_code == 200:
558
+ print('place stop loss order res:', res.json())
559
+ sleep(5)
560
+
561
+ replace_stop_loss_orders = [
562
+ {
563
+ "client_order_id": stop_loss_client_order_id,
564
+ "stop_price": "560.37",
565
+ "quantity": "200"
566
+ }
567
+ ]
568
+ res = trade_client.order_v3.replace_order(account_id, replace_stop_loss_orders)
569
+ if res.status_code == 200:
570
+ print('replace stop loss order res:', res.json())
571
+ sleep(5)
572
+
573
+ res = trade_client.order_v3.cancel_order(account_id, stop_loss_client_order_id)
574
+ if res.status_code == 200:
575
+ print('cancel stop loss order res:', res.json())
576
+
577
+ res = trade_client.order_v3.get_order_history(account_id)
578
+ if res.status_code == 200:
579
+ print('get order history res:', res.json())
580
+
581
+ res = trade_client.order_v3.get_order_detail(account_id, stop_loss_client_order_id)
582
+ if res.status_code == 200:
583
+ print('get stop loss order detail res:', res.json())
584
+
585
+ # ============================================================
586
+ # Stop Loss Limit Order Example (HK Market)
587
+ # ============================================================
588
+ stop_loss_limit_client_order_id = uuid.uuid4().hex
589
+ print('stop loss limit client order id:', stop_loss_limit_client_order_id)
590
+ new_stop_loss_limit_orders = [
591
+ {
592
+ "combo_type": "NORMAL",
593
+ "client_order_id": stop_loss_limit_client_order_id,
594
+ "symbol": "00700",
595
+ "instrument_type": "EQUITY",
596
+ "market": "HK",
597
+ "order_type": "STOP_LOSS_LIMIT",
598
+ "quantity": "200",
599
+ "stop_price": "560.35",
600
+ "limit_price": "562.21",
601
+ "support_trading_session": "CORE",
602
+ "side": "BUY",
603
+ "time_in_force": "DAY",
604
+ "entrust_type": "QTY",
605
+ "trigger_price_type": "PRICE"
606
+ }
607
+ ]
608
+
609
+ res = trade_client.order_v3.place_order(account_id, new_stop_loss_limit_orders)
610
+ if res.status_code == 200:
611
+ print('place stop loss limit order res:', res.json())
612
+ sleep(5)
613
+
614
+ replace_stop_loss_limit_orders = [
615
+ {
616
+ "client_order_id": stop_loss_limit_client_order_id,
617
+ "stop_price": "560.39",
618
+ "limit_price": "562.69",
619
+ "quantity": "200"
620
+ }
621
+ ]
622
+ res = trade_client.order_v3.replace_order(account_id, replace_stop_loss_limit_orders)
623
+ if res.status_code == 200:
624
+ print('replace stop loss limit order res:', res.json())
625
+ sleep(5)
626
+
627
+ res = trade_client.order_v3.cancel_order(account_id, stop_loss_limit_client_order_id)
628
+ if res.status_code == 200:
629
+ print('cancel stop loss limit order res:', res.json())
630
+
631
+ res = trade_client.order_v3.get_order_history(account_id)
632
+ if res.status_code == 200:
633
+ print('get order history res:', res.json())
634
+
635
+ res = trade_client.order_v3.get_order_detail(account_id, stop_loss_limit_client_order_id)
636
+ if res.status_code == 200:
637
+ print('get stop loss limit order detail res:', res.json())
638
+
639
+ # ============================================================
640
+ # Touch (Market) Order Example (HK Market)
641
+ # ============================================================
642
+ touch_mkt_client_order_id = uuid.uuid4().hex
643
+ print('touch mkt client order id:', touch_mkt_client_order_id)
644
+ new_touch_mkt_orders = [
645
+ {
646
+ "combo_type": "NORMAL",
647
+ "client_order_id": touch_mkt_client_order_id,
648
+ "symbol": "00700",
649
+ "instrument_type": "EQUITY",
650
+ "market": "HK",
651
+ "order_type": "TOUCH_MKT",
652
+ "quantity": "200",
653
+ "stop_price": "540.35",
654
+ "support_trading_session": "CORE",
655
+ "side": "BUY",
656
+ "time_in_force": "DAY",
657
+ "entrust_type": "QTY",
658
+ "trigger_price_type": "PRICE"
659
+ }
660
+ ]
661
+
662
+ res = trade_client.order_v3.place_order(account_id, new_touch_mkt_orders)
663
+ if res.status_code == 200:
664
+ print('place touch mkt order res:', res.json())
665
+ sleep(5)
666
+
667
+ replace_touch_mkt_orders = [
668
+ {
669
+ "client_order_id": touch_mkt_client_order_id,
670
+ "stop_price": "540.67",
671
+ "quantity": "200",
672
+ "trigger_price_type": "PRICE"
673
+ }
674
+ ]
675
+ res = trade_client.order_v3.replace_order(account_id, replace_touch_mkt_orders)
676
+ if res.status_code == 200:
677
+ print('replace touch mkt order res:', res.json())
678
+ sleep(5)
679
+
680
+ res = trade_client.order_v3.cancel_order(account_id, touch_mkt_client_order_id)
681
+ if res.status_code == 200:
682
+ print('cancel touch mkt order res:', res.json())
683
+
684
+ res = trade_client.order_v3.get_order_history(account_id)
685
+ if res.status_code == 200:
686
+ print('get order history res:', res.json())
687
+
688
+ res = trade_client.order_v3.get_order_detail(account_id, touch_mkt_client_order_id)
689
+ if res.status_code == 200:
690
+ print('get touch mkt order detail res:', res.json())
691
+
692
+ # ============================================================
693
+ # Touch Limit Order Example (HK Market)
694
+ # ============================================================
695
+ touch_limit_client_order_id = uuid.uuid4().hex
696
+ print('touch limit client order id:', touch_limit_client_order_id)
697
+ new_touch_limit_orders = [
698
+ {
699
+ "combo_type": "NORMAL",
700
+ "client_order_id": touch_limit_client_order_id,
701
+ "symbol": "00700",
702
+ "instrument_type": "EQUITY",
703
+ "market": "HK",
704
+ "order_type": "TOUCH_MKT",
705
+ "quantity": "200",
706
+ "stop_price": "540.35",
707
+ "limit_price": "535.35",
708
+ "support_trading_session": "CORE",
709
+ "side": "BUY",
710
+ "time_in_force": "DAY",
711
+ "entrust_type": "QTY",
712
+ "trigger_price_type": "PRICE"
713
+ }
714
+ ]
715
+
716
+ res = trade_client.order_v3.place_order(account_id, new_touch_limit_orders)
717
+ if res.status_code == 200:
718
+ print('place touch limit order res:', res.json())
719
+ sleep(5)
720
+
721
+ replace_touch_limit_orders = [
722
+ {
723
+ "client_order_id": touch_limit_client_order_id,
724
+ "stop_price": "540.67",
725
+ "limit_price": "536.67",
726
+ "quantity": "200",
727
+ "trigger_price_type": "PRICE"
728
+ }
729
+ ]
730
+ res = trade_client.order_v3.replace_order(account_id, replace_touch_limit_orders)
731
+ if res.status_code == 200:
732
+ print('replace touch limit order res:', res.json())
733
+ sleep(5)
734
+
735
+ res = trade_client.order_v3.cancel_order(account_id, touch_limit_client_order_id)
736
+ if res.status_code == 200:
737
+ print('cancel touch limit order res:', res.json())
738
+
739
+ res = trade_client.order_v3.get_order_history(account_id)
740
+ if res.status_code == 200:
741
+ print('get order history res:', res.json())
742
+
743
+ res = trade_client.order_v3.get_order_detail(account_id, touch_limit_client_order_id)
744
+ if res.status_code == 200:
745
+ print('get touch limit order detail res:', res.json())
746
+
747
+ # ============================================================
748
+ # Trailing Stop Loss Order Example (HK Market)
749
+ # ============================================================
750
+ trailing_stop_loss_client_order_id = uuid.uuid4().hex
751
+ print('trailing stop loss client order id:', trailing_stop_loss_client_order_id)
752
+ new_trailing_stop_loss_orders = [
753
+ {
754
+ "combo_type": "NORMAL",
755
+ "client_order_id": trailing_stop_loss_client_order_id,
756
+ "symbol": "00700",
757
+ "instrument_type": "EQUITY",
758
+ "market": "HK",
759
+ "order_type": "TRAILING_STOP_LOSS",
760
+ "quantity": "200",
761
+ "trailing_stop_step": "0.1",
762
+ "trailing_type": "PERCENTAGE",
763
+ "support_trading_session": "CORE",
764
+ "side": "BUY",
765
+ "time_in_force": "DAY",
766
+ "entrust_type": "QTY",
767
+ "trigger_price_type": "PRICE"
768
+ }
769
+ ]
770
+
771
+ res = trade_client.order_v3.place_order(account_id, new_trailing_stop_loss_orders)
772
+ if res.status_code == 200:
773
+ print('place trailing stop loss order res:', res.json())
774
+ sleep(5)
775
+
776
+ replace_trailing_stop_loss_orders = [
777
+ {
778
+ "client_order_id": trailing_stop_loss_client_order_id,
779
+ "stop_price": "560.47",
780
+ "quantity": "200",
781
+ "trailing_stop_step": "0.15",
782
+ "trailing_type": "PERCENTAGE",
783
+ "trigger_price_type": "PRICE"
784
+ }
785
+ ]
786
+ res = trade_client.order_v3.replace_order(account_id, replace_trailing_stop_loss_orders)
787
+ if res.status_code == 200:
788
+ print('replace trailing stop loss order res:', res.json())
789
+ sleep(5)
790
+
791
+ res = trade_client.order_v3.cancel_order(account_id, trailing_stop_loss_client_order_id)
792
+ if res.status_code == 200:
793
+ print('cancel trailing stop loss order res:', res.json())
794
+
795
+ res = trade_client.order_v3.get_order_history(account_id)
796
+ if res.status_code == 200:
797
+ print('get order history res:', res.json())
798
+
799
+ res = trade_client.order_v3.get_order_detail(account_id, trailing_stop_loss_client_order_id)
800
+ if res.status_code == 200:
801
+ print('get trailing stop loss order detail res:', res.json())
802
+
803
+ # ============================================================
804
+ # Trailing Stop Loss Limit Order Example (HK Market)
805
+ # ============================================================
806
+ trailing_stop_loss_limit_client_order_id = uuid.uuid4().hex
807
+ print('trailing stop loss limit client order id:', trailing_stop_loss_limit_client_order_id)
808
+ new_trailing_stop_loss_limit_orders = [
809
+ {
810
+ "combo_type": "NORMAL",
811
+ "client_order_id": trailing_stop_loss_limit_client_order_id,
812
+ "symbol": "00700",
813
+ "instrument_type": "EQUITY",
814
+ "market": "HK",
815
+ "order_type": "TRAILING_STOP_LOSS_LIMIT",
816
+ "quantity": "200",
817
+ "trailing_stop_step": "0.1",
818
+ "trailing_limit_price": "580",
819
+ "trailing_type": "PERCENTAGE",
820
+ "support_trading_session": "CORE",
821
+ "side": "BUY",
822
+ "time_in_force": "DAY",
823
+ "entrust_type": "QTY",
824
+ "trigger_price_type": "PRICE"
825
+ }
826
+ ]
827
+
828
+ res = trade_client.order_v3.place_order(account_id, new_trailing_stop_loss_limit_orders)
829
+ if res.status_code == 200:
830
+ print('place trailing stop loss limit order res:', res.json())
831
+ sleep(5)
832
+
833
+ replace_trailing_stop_loss_limit_orders = [
834
+ {
835
+ "client_order_id": trailing_stop_loss_limit_client_order_id,
836
+ "stop_price": "560.77",
837
+ "quantity": "200",
838
+ "trailing_stop_step": "0.15",
839
+ "trailing_limit_price": "581",
840
+ "trailing_type": "PERCENTAGE",
841
+ "trigger_price_type": "PRICE"
842
+ }
843
+ ]
844
+ res = trade_client.order_v3.replace_order(account_id, replace_trailing_stop_loss_limit_orders)
845
+ if res.status_code == 200:
846
+ print('replace trailing stop loss limit order res:', res.json())
847
+ sleep(5)
848
+
849
+ res = trade_client.order_v3.cancel_order(account_id, trailing_stop_loss_limit_client_order_id)
850
+ if res.status_code == 200:
851
+ print('cancel trailing stop loss limit order res:', res.json())
852
+
853
+ res = trade_client.order_v3.get_order_history(account_id)
854
+ if res.status_code == 200:
855
+ print('get order history res:', res.json())
856
+
857
+ res = trade_client.order_v3.get_order_detail(account_id, trailing_stop_loss_limit_client_order_id)
858
+ if res.status_code == 200:
859
+ print('get trailing stop loss limit order detail res:', res.json())
webull/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '2.0.7'
1
+ __version__ = '2.0.9'
webull/core/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = '2.0.7'
1
+ __version__ = '2.0.9'
2
2
 
3
3
  import logging
4
4
 
@@ -6,3 +6,7 @@ class Region(Enum):
6
6
  HK = 'hk'
7
7
  JP = 'jp'
8
8
  SG = 'sg'
9
+ TH = 'th'
10
+ AU = 'au'
11
+ MY = 'my'
12
+ UK = 'uk'
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "default_region": "us",
3
- "regions": ["us", "hk", "jp","sg"],
3
+ "regions": ["us", "hk", "jp", "sg", "th", "au", "my", "uk"],
4
4
  "region_mapping": {
5
5
  "us": {
6
6
  "api": "api.webull.com",
@@ -21,7 +21,26 @@
21
21
  "api": "api.webull.com.sg",
22
22
  "quotes-api": "data-api.webull.com.sg",
23
23
  "events-api": "events-api.webull.com.sg"
24
+ },
25
+ "th": {
26
+ "api": "api.webull.co.th",
27
+ "quotes-api": "data-api.webull.co.th",
28
+ "events-api": "events-api.webull.co.th"
29
+ },
30
+ "au": {
31
+ "api": "api.webull.com.au",
32
+ "quotes-api": "data-api.webull.com.au",
33
+ "events-api": "events-api.webull.com.au"
34
+ },
35
+ "my": {
36
+ "api": "api.webull.com.my",
37
+ "quotes-api": "data-api.webull.com.my",
38
+ "events-api": "events-api.webull.com.my"
39
+ },
40
+ "uk": {
41
+ "api": "api.webull-uk.com",
42
+ "quotes-api": "data-api.webull-uk.com",
43
+ "events-api": "events-api.webull-uk.com"
24
44
  }
25
45
  }
26
46
  }
27
-
webull/data/__init__.py CHANGED
@@ -1,3 +1,3 @@
1
1
  # coding=utf-8
2
2
 
3
- __version__ = '2.0.7'
3
+ __version__ = '2.0.9'
@@ -23,6 +23,7 @@ from webull.data.quotes.event_market_data import EventMarketData
23
23
  from webull.data.quotes.futures_market_data import FuturesMarketData
24
24
  from webull.data.quotes.instrument import Instrument
25
25
  from webull.data.quotes.market_data import MarketData
26
+ from webull.data.quotes.option_market_data import OptionMarketData
26
27
  from webull.data.quotes.screener import Screener
27
28
  from webull.data.quotes.watchlist import Watchlist
28
29
 
@@ -35,6 +36,7 @@ class DataClient:
35
36
  self.market_data = MarketData(api_client)
36
37
  self.crypto_market_data = CryptoMarketData(api_client)
37
38
  self.futures_market_data = FuturesMarketData(api_client)
39
+ self.option_market_data = OptionMarketData(api_client)
38
40
  self.event_market_data = EventMarketData(api_client)
39
41
  self.screener = Screener(api_client)
40
42
  self.watchlist = Watchlist(api_client)
@@ -0,0 +1,71 @@
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
+ from webull.data.request.get_option_bars_request import GetOptionBarsRequest
16
+ from webull.data.request.get_option_snapshot_request import GetOptionSnapshotRequest
17
+ from webull.data.request.get_option_tick_request import GetOptionTickRequest
18
+
19
+
20
+ class OptionMarketData:
21
+ def __init__(self, api_client):
22
+ self.client = api_client
23
+
24
+ def get_option_history_bars(self, symbols, category, timespan, count='200', real_time_required=None):
25
+ """
26
+ Batch query K-line data for multiple option symbols, returning aggregated data within the window.
27
+ According to the last N K-lines of the option code, it supports various granularity K-lines such as m1 and m5.
28
+
29
+ :param symbols: List of option security codes
30
+ :param category: Security type, enumeration
31
+ :param timespan: K-line interval
32
+ :param count: Number of K-lines to return, default is 200, maximum is 1200
33
+ :param real_time_required: Returns the latest trade quote data. By default, the most recent market data is returned.
34
+ """
35
+ history_bar_request = GetOptionBarsRequest()
36
+ history_bar_request.set_symbols(symbols)
37
+ history_bar_request.set_category(category)
38
+ history_bar_request.set_timespan(timespan)
39
+ history_bar_request.set_count(count)
40
+ history_bar_request.set_real_time_required(real_time_required)
41
+ response = self.client.get_response(history_bar_request)
42
+ return response
43
+
44
+ def get_option_tick(self, symbol, category, count='30'):
45
+ """
46
+ Query tick-by-tick transaction of options according to the option code list.
47
+
48
+ :param symbol: Option securities code
49
+ :param category: Security type, enumeration.
50
+ :param count: The number of lines: the default is 30, and the maximum limit is 1200
51
+ """
52
+ tick_request = GetOptionTickRequest()
53
+ tick_request.set_symbol(symbol)
54
+ tick_request.set_category(category)
55
+ tick_request.set_count(count)
56
+ response = self.client.get_response(tick_request)
57
+ return response
58
+
59
+ def get_option_snapshot(self, symbols, category):
60
+ """
61
+ Query the latest option market snapshots in batches according to the option code list.
62
+
63
+ :param symbols: List of option security codes; for example: single: AAPL260522C00300000 multiple: AAPL260522C00300000,TSLA251219C00450000;
64
+ For each request,up to 20 symbols can be subscribed
65
+ :param category: Security type, enumeration.
66
+ """
67
+ snapshot_request = GetOptionSnapshotRequest()
68
+ snapshot_request.set_symbols(symbols)
69
+ snapshot_request.set_category(category)
70
+ response = self.client.get_response(snapshot_request)
71
+ return response
@@ -0,0 +1,73 @@
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 GetOptionBarsRequest(ApiRequest):
21
+ """
22
+ Request class for querying historical bars for options.
23
+ Batch query interface to retrieve the last N bars based on option codes,
24
+ time granularity, and type. Supports various granularities like M1, M5, etc.
25
+ """
26
+
27
+ def __init__(self):
28
+ ApiRequest.__init__(self, "/openapi/market-data/option/bars", version='v2', method="GET", query_params={})
29
+
30
+ def set_symbols(self, symbols):
31
+ """
32
+ Set option symbols.
33
+
34
+ :param symbols: List of option symbols, separated by commas; maximum 20 symbols per query.
35
+ Example: "AAPL,TSLA" or ["AAPL", "TSLA"]
36
+ """
37
+ if isinstance(symbols, str):
38
+ self.add_query_param("symbols", symbols)
39
+ elif isinstance(symbols, list):
40
+ self.add_query_param("symbols", ",".join(symbols))
41
+
42
+ def set_category(self, category):
43
+ """
44
+ Set security type.
45
+
46
+ :param category: Security type. Currently only US_OPTION is supported.
47
+ """
48
+ self.add_query_param("category", category)
49
+
50
+ def set_timespan(self, timespan):
51
+ """
52
+ Set bar time granularity.
53
+
54
+ :param timespan: Bar time granularity, e.g., M1, M5, M15, M30, M60, M120, M240, D, W, M, Y
55
+ """
56
+ self.add_query_param("timespan", timespan)
57
+
58
+ def set_count(self, count='200'):
59
+ """
60
+ Set number of bars to return.
61
+
62
+ :param count: Number of bars, default is 200, maximum is 1200.
63
+ """
64
+ self.add_query_param("count", count)
65
+
66
+ def set_real_time_required(self, real_time_required):
67
+ """
68
+ Set whether to include the latest data.
69
+
70
+ :param real_time_required: Whether to include the latest data, default is false.
71
+ """
72
+ if real_time_required is not None:
73
+ self.add_query_param("real_time_required", real_time_required)
@@ -0,0 +1,48 @@
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 GetOptionSnapshotRequest(ApiRequest):
21
+ """
22
+ Request class for querying real-time quote snapshots for options.
23
+ Returns key market indicators for specified options, including the latest price,
24
+ price change percentage, trading volume, turnover rate, and best bid/ask quotes.
25
+ """
26
+
27
+ def __init__(self):
28
+ ApiRequest.__init__(self, "/openapi/market-data/option/snapshot", version='v2', method="GET", query_params={})
29
+
30
+ def set_symbols(self, symbols):
31
+ """
32
+ Set option symbols.
33
+
34
+ :param symbols: List of option symbols, separated by commas; maximum 20 symbols per query.
35
+ Example: "AAPL260522C00300000,TSLA251219C00450000" or ["AAPL260522C00300000", "TSLA251219C00450000"]
36
+ """
37
+ if isinstance(symbols, str):
38
+ self.add_query_param("symbols", symbols)
39
+ elif isinstance(symbols, list):
40
+ self.add_query_param("symbols", ",".join(symbols))
41
+
42
+ def set_category(self, category):
43
+ """
44
+ Set security type.
45
+
46
+ :param category: Security type. Currently only US_OPTION is supported.
47
+ """
48
+ self.add_query_param("category", category)
@@ -0,0 +1,52 @@
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 GetOptionTickRequest(ApiRequest):
21
+ """
22
+ Request class for querying option tick data.
23
+ Returns detailed tick-by-tick trade records for a specified option code,
24
+ including trade time, price, volume, and trade direction.
25
+ """
26
+
27
+ def __init__(self):
28
+ ApiRequest.__init__(self, "/openapi/market-data/option/tick", version='v2', method="GET", query_params={})
29
+
30
+ def set_symbol(self, symbol):
31
+ """
32
+ Set option symbol.
33
+
34
+ :param symbol: Option symbol.
35
+ """
36
+ self.add_query_param("symbol", symbol)
37
+
38
+ def set_category(self, category):
39
+ """
40
+ Set security type.
41
+
42
+ :param category: Security type. Currently only US_OPTION is supported.
43
+ """
44
+ self.add_query_param("category", category)
45
+
46
+ def set_count(self, count='30'):
47
+ """
48
+ Set number of ticks to return.
49
+
50
+ :param count: Number of ticks, default is 30, maximum is 1200.
51
+ """
52
+ self.add_query_param("count", count)
webull/trade/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '2.0.7'
1
+ __version__ = '2.0.9'
@@ -25,7 +25,7 @@ class AccountV2:
25
25
 
26
26
  def get_account_list(self):
27
27
  """
28
- This interface is currently supported only for Webull HK, Webull US, and Webull JP, and Webull SG.
28
+ This interface is currently supported only for Webull HK, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK.
29
29
  Support for other regions will be available in future updates.
30
30
  """
31
31
  account_list = GetAccountListRequest()
@@ -34,7 +34,7 @@ class AccountV2:
34
34
 
35
35
  def get_account_balance(self, account_id):
36
36
  """
37
- This interface is currently supported only for Webull HK, Webull US, and Webull JP, and Webull SG.
37
+ This interface is currently supported only for Webull HK, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK.
38
38
  Support for other regions will be available in future updates.
39
39
  """
40
40
  account_balance_request = AccountBalanceRequest()
@@ -44,7 +44,7 @@ class AccountV2:
44
44
 
45
45
  def get_account_position(self, account_id):
46
46
  """
47
- This interface is currently supported only for Webull HK, Webull US, and Webull JP, and Webull SG.
47
+ This interface is currently supported only for Webull HK, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK.
48
48
  Support for other regions will be available in future updates.
49
49
  """
50
50
  account_positions_request = AccountPositionsRequest()
@@ -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 HK, Webull US, and Webull JP, and Webull SG.
31
+ This interface is currently supported only for Webull HK, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK.
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 HK, Webull US, and Webull JP, and Webull SG.
43
+ This interface is currently supported only for Webull HK, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK.
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 HK, Webull US, and Webull JP, and Webull SG.
68
+ This interface is currently supported only for Webull HK, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK.
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 HK, Webull US, and Webull JP, and Webull SG.
80
+ This interface is currently supported only for Webull HK, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK.
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 HK, Webull US, and Webull JP, and Webull SG.
91
+ This interface is currently supported only for Webull HK, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK.
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 HK, Webull US, and Webull JP, and Webull SG.
102
+ This interface is currently supported only for Webull HK, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK.
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 HK, Webull US, and Webull JP, and Webull SG, and Webull SG.
130
+ This interface is currently supported only for Webull HK, Webull US, Webull JP, Webull SG, Webull TH, Webull AU, Webull MY, Webull UK.
131
131
  Support for other regions will be available in future updates.
132
132
 
133
133
  Paging query pending orders.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webull-openapi-python-sdk
3
- Version: 2.0.7
3
+ Version: 2.0.9
4
4
  Summary: Webull Python SDK.
5
5
  Home-page:
6
6
  Author: Webull
@@ -1,10 +1,10 @@
1
- samples/__init__.py,sha256=Eqd_jrp6aA0AOwkbRY6r2MSGXmOOkqUkdUqKDmktZJM,22
1
+ samples/__init__.py,sha256=YHfSoqxCUyNphrTJsW3Ed3e2IVM5_H1IYKii1J5IND4,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
- samples/data/data_client.py,sha256=7H1uGWKXeU1DHC1X6XYpf1SaaykbbLJBvr7psI6PlKs,6672
7
+ samples/data/data_client.py,sha256=nvKj5zQ9vd1gNkwRV0MMP_J2-QK1TP_7BlGeHRok79w,7518
8
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
@@ -17,13 +17,13 @@ samples/screener/screener_client.py,sha256=NGwjY7YaG_3l9c-QePpmpPG4Gtk_BZaM7-jQb
17
17
  samples/trade/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  samples/trade/trade_client.py,sha256=LyWSvZJH4ByCkRORqP9WdkXfx65A2b6fhc9_GzL8DOM,6258
19
19
  samples/trade/trade_client_v2.py,sha256=IO-zmRiUnCmIetTdiYunPh8jVK2VaPrOR77Dwvz1auY,10771
20
- samples/trade/trade_client_v3.py,sha256=WYGL3f0V-bDqeT0z5Qg0xbzCQtCdiHn7dM589DiEhfc,19386
20
+ samples/trade/trade_client_v3.py,sha256=YT9MUkxHttLmI_mCTK1olAIbWC48oi0DUF1Ig2EoFBI,31909
21
21
  samples/trade/trade_client_v3_event.py,sha256=91HlT04KlK8Q5gUnsB8F5ErCFdJRnpDABKkBfYRc-YE,3932
22
22
  samples/trade/trade_event_client.py,sha256=BWdD1L41LXmDlaig6ku9T3t3fSCCZEdj5nxH1xI1AZA,2653
23
23
  samples/watchlist/__init__.py,sha256=rtV5s4_CJgDAT4DGEJa_pNLJU71Wdr5OLz_IQ1EajFQ,567
24
24
  samples/watchlist/watchlist_client.py,sha256=lpzJs7SXuSka2KKkJ0u9s83A9iHta5qrjvIdkbfNcwg,3246
25
- webull/__init__.py,sha256=Eqd_jrp6aA0AOwkbRY6r2MSGXmOOkqUkdUqKDmktZJM,22
26
- webull/core/__init__.py,sha256=P6HyssmMpnvnyiBdmTTmwJ4Hvu3pmR6nn9bxyi7CNG4,225
25
+ webull/__init__.py,sha256=YHfSoqxCUyNphrTJsW3Ed3e2IVM5_H1IYKii1J5IND4,22
26
+ webull/core/__init__.py,sha256=zyQxIey4b1weHFMUbMDgFE9DW_WcYZC6lHL7ke1hQCo,225
27
27
  webull/core/client.py,sha256=zxSBiII9KDxc5tHpTerJfV_PKPt8E9e3oTOpiakAtJw,16758
28
28
  webull/core/compat.py,sha256=_r6Y_f3vTo_DoxOaCvLjnvOo1KRkD2Z9kXSh8OijEIA,3088
29
29
  webull/core/headers.py,sha256=Wj2zev1XYyYsy2b9YKnoK3GqjVsXZO_o2WziMmuVBTw,2061
@@ -44,10 +44,10 @@ webull/core/cache/__init__.py,sha256=_dME59dRIinH4PXhB3ZOtlN-3J57mFfhegzuFKVedWs
44
44
  webull/core/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
45
45
  webull/core/common/api_type.py,sha256=rXYvwiJs71AX7exvD_szbXcv3UW50V7_ve8ModpkAiM,643
46
46
  webull/core/common/easy_enum.py,sha256=3PorEZPQgBT7uFwtNplpwZ9oi76CCwgKIZ0jRiybZYw,1047
47
- webull/core/common/region.py,sha256=CwUurkJVnUWRD50aVZoDNdRBGLecv68179KkexiYaec,100
47
+ webull/core/common/region.py,sha256=36Y4jB6im219SPo94PmQIFXK_ek2e3JdGH5VK_gyzU0,156
48
48
  webull/core/context/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
49
  webull/core/context/request_context_holder.py,sha256=41aSKMtOkS0yHVvMMmP2vjsMg3WHvDPe3_njT0hwi_4,1148
50
- webull/core/data/endpoints.json,sha256=Ln5awMOVWtpFqsfD-ggshg6wD8M-ZYmrIu0APF-daeo,766
50
+ webull/core/data/endpoints.json,sha256=ABcCEFypqUlh6A80AuSaxH-Ikrj2yV49BZAmIkezY00,1475
51
51
  webull/core/data/retry_config.json,sha256=aRKrBfZyLrXt_58LCt7VvunQoxXS_qGon4JGGZnB644,304
52
52
  webull/core/endpoint/__init__.py,sha256=hC_6UsVc7NGxD21gMT4i42Crm2zN4K-IAU4zxkLysVo,153
53
53
  webull/core/endpoint/chained_endpoint_resolver.py,sha256=YQ-K7w9P3UolgiH0UdXiKsG4ALSManebWlZHeZjxSjY,2256
@@ -89,8 +89,8 @@ webull/core/utils/common.py,sha256=T5VVcYQVhA9fhiUHZN9gBuoh0uzVgbCM01o1qK08NAE,2
89
89
  webull/core/utils/data.py,sha256=YUyoWY68_2RkKanh3jsDscgGx__FIPh5VNEGXr1Qotc,852
90
90
  webull/core/utils/desensitize.py,sha256=f8_ps9BrG3WfXD8ZAw873-_YoGeke1Q55CeDwRmYkqA,1104
91
91
  webull/core/utils/validation.py,sha256=gJcIrHYtgo48yVJ0q6O-f5buTYWOcr6ShhDIBhTp-Yg,1957
92
- webull/data/__init__.py,sha256=E0G1HBxSnLY_6pVD-FW8RwpEJMoXIAB9ub-e38-q0IY,38
93
- webull/data/data_client.py,sha256=5lMvWswwnL3gwjGKGWo5MYjJGzfmDlOoyS_wq5sZRKQ,2189
92
+ webull/data/__init__.py,sha256=tbVcOxrB2y05ELvQkUB_Wb5L014BZpLDyROxiUxu5FY,38
93
+ webull/data/data_client.py,sha256=tH0HrjRkP1sKEZ5Q8w1wCE2XaEqdy0_4EEvm60h4r28,2319
94
94
  webull/data/data_streaming_client.py,sha256=TQBAilvOLCbcMqacByrniXGr9VjSwjym-4-LUOiqKx8,4456
95
95
  webull/data/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
96
  webull/data/common/category.py,sha256=8mtq9J9aiNan1CkwgfqRnggdH0tENyhJBJ2HI3EkUHE,978
@@ -118,6 +118,7 @@ webull/data/quotes/futures_market_data.py,sha256=fc9giYNy1LcdLHOJV31zMbPBKtWDH8k
118
118
  webull/data/quotes/instrument.py,sha256=BHQ4INg3ct2b0E22E6IHMtYz47q8hA3HIf1wzbw6Ns4,12665
119
119
  webull/data/quotes/market_data.py,sha256=L7f5V5tmG01lev9-IJU3w6up7EnX42WfI7GtW2mEcw8,14748
120
120
  webull/data/quotes/market_streaming_data.py,sha256=cI9xxGpKV_KDS8cgh9azHifBji0yeSuKmH7Jxaqij38,3139
121
+ webull/data/quotes/option_market_data.py,sha256=4fW_GI3u1T-5dluhLRQ60Gbb2bsnhWkSrILYJq-96pw,3305
121
122
  webull/data/quotes/screener.py,sha256=PkSQzu3nq26Vkob2IhZH2VvHswqyHcYMxELoP1Yb1N0,5289
122
123
  webull/data/quotes/watchlist.py,sha256=RkuPV7OwC6e4NEpeldTUNWEsYAqGQbVqyOHs9edMuhE,6344
123
124
  webull/data/quotes/subscribe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -171,6 +172,9 @@ webull/data/request/get_historical_bars_request.py,sha256=xClCvnUyzfj9DeCxxOGzs0
171
172
  webull/data/request/get_instruments_request.py,sha256=PmDXrv9hUTHNtwppjV6GMQqTcNPFFVG_LAbW2Ub4cvw,1520
172
173
  webull/data/request/get_noii_bars_request.py,sha256=_ubNykIQCCDg9cRgeR49FVloF21s2REWlp_KTnUlYEg,1845
173
174
  webull/data/request/get_noii_snapshot_request.py,sha256=IQ2HrAyyO2GzC8HEsjz4S0Owc0Zk25d-1ULjTqThmZU,2057
175
+ webull/data/request/get_option_bars_request.py,sha256=ObE4blYHZ_OcKG8Cp6St7ujDTIFIZyBP4MGhx8k9X6k,2556
176
+ webull/data/request/get_option_snapshot_request.py,sha256=XHmtHKN8fF6-rIWfstFr_bLFtgEIx-u61H6Y7WnOrlE,1816
177
+ webull/data/request/get_option_tick_request.py,sha256=MuSFYnM8m1UwOJ2NjzhOJYlWhbYDyiqPbNkKoPQUupI,1648
174
178
  webull/data/request/get_quotes_request.py,sha256=g4J7lAQZBqoeM67Xm2E-Y2pwNxsqkrECf_r5DTTrS5M,1244
175
179
  webull/data/request/get_snapshot_request.py,sha256=OD2PiaxmBCboFDaU8DFTwvfNd2zObYSnPfl1fa49DIs,1471
176
180
  webull/data/request/get_tick_request.py,sha256=rUHhQgC8Z_6ensLyCkg3DDK55SlEi0Bc_dhpCIIspDs,1366
@@ -188,7 +192,7 @@ webull/data/request/watchlist/get_watchlist_request.py,sha256=XxzS4gxFbdQSajpFSm
188
192
  webull/data/request/watchlist/remove_watchlist_instruments_request.py,sha256=qOtQYDBp-PSawAgljnLmtfUce8dAblWI_zB0nnIv3G0,1451
189
193
  webull/data/request/watchlist/update_watchlist_instruments_request.py,sha256=KoihfB8MszsAooQGUUMjFmnid_a7xk4YSdEMDO1gh-k,1493
190
194
  webull/data/request/watchlist/update_watchlist_request.py,sha256=0s3ftkxiz9hjtXhLORrIUphyDIldRA8pJ4mP5zfbsyU,1466
191
- webull/trade/__init__.py,sha256=XrDu8k_IxSYdWR9fdENgQaVLDoDnh9VjrAmupbj-Ozw,21
195
+ webull/trade/__init__.py,sha256=Fz9FyyzdwMvsPPrB8DkVnD9wNalmr9HSvhN897_GWPc,21
192
196
  webull/trade/trade_client.py,sha256=_6lH4KO-jKgKWU28fWNsc9-KEHto-WvaP0gT96BJ_dw,2184
193
197
  webull/trade/trade_events_client.py,sha256=G9ovuxrnQh8iA1so2Ar-41jWRzDCYQYSHTkQLGlwhhA,9983
194
198
  webull/trade/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -266,13 +270,13 @@ webull/trade/trade/order_operation.py,sha256=QrL4Da87RTOSupiAbuXtZigo9602Byp14DQ
266
270
  webull/trade/trade/trade_calendar.py,sha256=rGSiR5GZggQnZOmmpbC-06trgPQgFTvdpUzGMpw2ycw,1415
267
271
  webull/trade/trade/trade_instrument.py,sha256=293IaiLnhw0mAc1IuF3LSgwgve_XZ1Dyf1VeFtmClc8,3474
268
272
  webull/trade/trade/v2/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
269
- webull/trade/trade/v2/account_info_v2.py,sha256=YXDEejg7spwg4j2wd25SQdVyHWMqasO4J9QDP56rY8s,3036
273
+ webull/trade/trade/v2/account_info_v2.py,sha256=rLjNipJgF0lyqPafPjtQK1gItyye7tT5AJ3vGGtWuMU,3144
270
274
  webull/trade/trade/v2/order_operation_v2.py,sha256=m54RH2j45CBBWEnqe4KxrsltAF44XKtPMT4kv8t7djQ,12745
271
275
  webull/trade/trade/v3/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
272
- webull/trade/trade/v3/order_opration_v3.py,sha256=ZWxlIkoD5Dk8G-gRD04UeCrLQHbFQZL-8H5yOEdIIR4,7730
273
- webull_openapi_python_sdk-2.0.7.dist-info/licenses/LICENSE,sha256=ALOnsLtb1aHxmDJg3-oMi0BO-i-cjfyZaOBfnnavKMc,11359
274
- webull_openapi_python_sdk-2.0.7.dist-info/licenses/NOTICE,sha256=X5TApte6CPV10b96Cb70IRLusXmiRmK_R-dB-1tQM_I,2018
275
- webull_openapi_python_sdk-2.0.7.dist-info/METADATA,sha256=GAbdm1NDSHxawBt9_8FEz3xGFuN_JRLMgEwz2NGBceM,1032
276
- webull_openapi_python_sdk-2.0.7.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
277
- webull_openapi_python_sdk-2.0.7.dist-info/top_level.txt,sha256=h8pEjNDGWS2ZUZ2vYFpUShoMQT0ZRIQaD57QJWD8_aI,15
278
- webull_openapi_python_sdk-2.0.7.dist-info/RECORD,,
276
+ webull/trade/trade/v3/order_opration_v3.py,sha256=1msk2tG9XBBPwFTlYEPpQ2feu0Pq6T7AlnO5n9uQ87M,7967
277
+ webull_openapi_python_sdk-2.0.9.dist-info/licenses/LICENSE,sha256=ALOnsLtb1aHxmDJg3-oMi0BO-i-cjfyZaOBfnnavKMc,11359
278
+ webull_openapi_python_sdk-2.0.9.dist-info/licenses/NOTICE,sha256=X5TApte6CPV10b96Cb70IRLusXmiRmK_R-dB-1tQM_I,2018
279
+ webull_openapi_python_sdk-2.0.9.dist-info/METADATA,sha256=BKHNU_5dIOz0oA24le9nKhnDf3hZ4IJD-xwlTxogghg,1032
280
+ webull_openapi_python_sdk-2.0.9.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
281
+ webull_openapi_python_sdk-2.0.9.dist-info/top_level.txt,sha256=h8pEjNDGWS2ZUZ2vYFpUShoMQT0ZRIQaD57QJWD8_aI,15
282
+ webull_openapi_python_sdk-2.0.9.dist-info/RECORD,,