webull-openapi-python-sdk 2.0.7__tar.gz → 2.0.9__tar.gz
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.
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/PKG-INFO +1 -1
- webull_openapi_python_sdk-2.0.9/samples/__init__.py +1 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/data/data_client.py +19 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/trade/trade_client_v3.py +328 -0
- webull_openapi_python_sdk-2.0.9/webull/__init__.py +1 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/__init__.py +1 -1
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/common/region.py +4 -0
- webull_openapi_python_sdk-2.0.9/webull/core/data/endpoints.json +46 -0
- webull_openapi_python_sdk-2.0.9/webull/data/__init__.py +3 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/data_client.py +2 -0
- webull_openapi_python_sdk-2.0.9/webull/data/quotes/option_market_data.py +71 -0
- webull_openapi_python_sdk-2.0.9/webull/data/request/get_option_bars_request.py +73 -0
- webull_openapi_python_sdk-2.0.9/webull/data/request/get_option_snapshot_request.py +48 -0
- webull_openapi_python_sdk-2.0.9/webull/data/request/get_option_tick_request.py +52 -0
- webull_openapi_python_sdk-2.0.9/webull/trade/__init__.py +1 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade/v2/account_info_v2.py +3 -3
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade/v3/order_opration_v3.py +7 -7
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull_openapi_python_sdk.egg-info/PKG-INFO +1 -1
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull_openapi_python_sdk.egg-info/SOURCES.txt +4 -0
- webull_openapi_python_sdk-2.0.7/samples/__init__.py +0 -1
- webull_openapi_python_sdk-2.0.7/webull/__init__.py +0 -1
- webull_openapi_python_sdk-2.0.7/webull/core/data/endpoints.json +0 -27
- webull_openapi_python_sdk-2.0.7/webull/data/__init__.py +0 -3
- webull_openapi_python_sdk-2.0.7/webull/trade/__init__.py +0 -1
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/ChangeLog.txt +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/LICENSE +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/MANIFEST.in +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/NOTICE +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/README.rst +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/account/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/account/account_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/assets/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/assets/assets_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/data/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/data/data_client_event.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/data/data_streaming_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/data/data_streaming_client_async.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/data/data_streaming_client_event.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/order/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/order/order_option_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/order/order_stock_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/screener/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/screener/screener_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/trade/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/trade/trade_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/trade/trade_client_v2.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/trade/trade_client_v3_event.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/trade/trade_event_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/watchlist/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/watchlist/watchlist_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/setup.cfg +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/setup.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/algorithm/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/algorithm/sha_hmac1.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/algorithm/sha_hmac256.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/algorithm/sha_hmac256_new.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/composer/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/composer/default_signature_composer.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/credentials.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/signers/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/signers/app_key_signer.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/signers/signer.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/auth/signers/signer_factory.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/cache/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/common/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/common/api_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/common/easy_enum.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/compat.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/context/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/context/request_context_holder.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/data/retry_config.json +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/endpoint/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/endpoint/chained_endpoint_resolver.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/endpoint/default_endpoint_resolver.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/endpoint/local_config_regional_endpoint_resolver.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/endpoint/resolver_endpoint_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/endpoint/user_customized_endpoint_resolver.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/exception/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/exception/error_code.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/exception/error_msg.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/exception/exceptions.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/headers.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/client_initializer.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/config/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/config/bean/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/config/bean/query_config_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/config/config_operation.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/token/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/token/bean/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/token/bean/access_token.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/token/bean/check_token_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/token/bean/create_token_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/token/bean/refresh_token_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/token/token_manager.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/token/token_operation.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/initializer/token/token_storage.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/method_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/protocol_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/http/response.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/retry/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/retry/backoff_strategy.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/retry/retry_condition.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/retry/retry_policy.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/retry/retry_policy_context.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/utils/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/utils/common.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/utils/data.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/utils/desensitize.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/core/utils/validation.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/category.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/connect_ack.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/contract_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/direction.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/exchange_code.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/exercise_style.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/expiration_cycle.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/instrument_status.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/option_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/subscribe_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/common/timespan.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/data_streaming_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/internal/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/internal/default_retry_policy.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/internal/exceptions.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/internal/quotes_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/internal/quotes_decoder.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/internal/quotes_payload_decoder.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/internal/quotes_topic.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/crypto_market_data.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/event_market_data.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/futures_market_data.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/instrument.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/market_data.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/market_streaming_data.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/screener.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/ask_bid_result.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/basic_result.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/broker_result.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/event_depth_decoder.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/event_depth_result.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/event_snapshot_decoder.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/event_snapshot_result.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/event_tick_decoder.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/event_tick_result.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/message_pb2.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/order_result.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/payload_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/quote_decoder.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/quote_result.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/snapshot_decoder.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/snapshot_result.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/tick_decoder.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/subscribe/tick_result.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/quotes/watchlist.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_analyst_rating_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_analyst_target_price_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_batch_historical_bars_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_company_profile_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_corp_action_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_crypto_historical_bars_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_crypto_instruments_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_crypto_snapshot_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_eod_bars_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_event_bars_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_event_depth_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_event_events_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_event_instrument_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_event_series_categories.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_event_series_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_event_snapshot_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_event_tick_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_footprint_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_futures_depth_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_futures_footprint_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_futures_historical_bars_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_futures_instruments_by_code_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_futures_instruments_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_futures_product_class.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_futures_products_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_futures_snapshot_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_futures_tick_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_historical_bars_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_instruments_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_noii_bars_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_noii_snapshot_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_quotes_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_snapshot_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/get_tick_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/screener/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/screener/get_gainers_losers_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/screener/get_most_active_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/subscribe_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/unsubscribe_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/watchlist/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/watchlist/add_watchlist_instruments_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/watchlist/create_watchlist_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/watchlist/delete_watchlist_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/watchlist/get_watchlist_instruments_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/watchlist/get_watchlist_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/watchlist/remove_watchlist_instruments_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/watchlist/update_watchlist_instruments_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/request/watchlist/update_watchlist_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/account_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/category.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/combo_ticker_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/combo_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/currency.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/forbid_reason.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/instrument_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/markets.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/order_entrust_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/order_side.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/order_status.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/order_tif.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/order_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/position_intent.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/trade_policy.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/trading_date_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/common/trailing_type.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/events/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/events/default_retry_policy.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/events/events_pb2.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/events/events_pb2_grpc.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/events/signature_composer.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/events/types.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/cancel_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/get_account_balance_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/get_account_positions_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/get_account_profile_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/get_app_subscriptions.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/get_open_orders_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/get_order_detail_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/get_today_orders_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/get_trade_calendar_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/get_trade_instrument_detail_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/get_trade_security_detail_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/get_tradeable_instruments_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/palce_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/place_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/place_order_request_v2.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/replace_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/replace_order_request_v2.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/cancel_option_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/cancel_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/get_account_balance_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/get_account_list.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/get_account_list_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/get_account_position_details_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/get_account_positions_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/get_order_detail_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/get_order_history_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/get_order_open_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/palce_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/place_option_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/place_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/preview_option_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/preview_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/replace_option_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v2/replace_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v3/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v3/batch_place_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v3/cancel_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v3/get_order_detail_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v3/get_order_history_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v3/get_order_open_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v3/place_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v3/preview_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/request/v3/replace_order_request.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade/account_info.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade/order_operation.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade/trade_calendar.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade/trade_instrument.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade/v2/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade/v2/order_operation_v2.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade/v3/__init__.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/trade/trade_events_client.py +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull_openapi_python_sdk.egg-info/dependency_links.txt +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull_openapi_python_sdk.egg-info/requires.txt +0 -0
- {webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull_openapi_python_sdk.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '2.0.9'
|
{webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/data/data_client.py
RENAMED
|
@@ -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())
|
{webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/samples/trade/trade_client_v3.py
RENAMED
|
@@ -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())
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '2.0.9'
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"default_region": "us",
|
|
3
|
+
"regions": ["us", "hk", "jp", "sg", "th", "au", "my", "uk"],
|
|
4
|
+
"region_mapping": {
|
|
5
|
+
"us": {
|
|
6
|
+
"api": "api.webull.com",
|
|
7
|
+
"quotes-api": "data-api.webull.com",
|
|
8
|
+
"events-api": "events-api.webull.com"
|
|
9
|
+
},
|
|
10
|
+
"hk": {
|
|
11
|
+
"api": "api.webull.hk",
|
|
12
|
+
"quotes-api": "data-api.webull.hk",
|
|
13
|
+
"events-api": "events-api.webull.hk"
|
|
14
|
+
},
|
|
15
|
+
"jp": {
|
|
16
|
+
"api": "api.webull.co.jp",
|
|
17
|
+
"quotes-api": "data-api.webull.co.jp",
|
|
18
|
+
"events-api": "events-api.webull.co.jp"
|
|
19
|
+
},
|
|
20
|
+
"sg": {
|
|
21
|
+
"api": "api.webull.com.sg",
|
|
22
|
+
"quotes-api": "data-api.webull.com.sg",
|
|
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"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
{webull_openapi_python_sdk-2.0.7 → webull_openapi_python_sdk-2.0.9}/webull/data/data_client.py
RENAMED
|
@@ -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)
|