webull-openapi-python-sdk 1.0.6__tar.gz → 1.0.8__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-1.0.6 → webull_openapi_python_sdk-1.0.8}/PKG-INFO +1 -1
- webull_openapi_python_sdk-1.0.8/samples/__init__.py +1 -0
- webull_openapi_python_sdk-1.0.8/samples/account/account_client.py +42 -0
- webull_openapi_python_sdk-1.0.8/samples/assets/__init__.py +1 -0
- webull_openapi_python_sdk-1.0.8/samples/assets/assets_client.py +47 -0
- webull_openapi_python_sdk-1.0.8/samples/data/__init__.py +1 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/data/data_client.py +7 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/data/data_streaming_client.py +5 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/data/data_streaming_client_async.py +5 -0
- webull_openapi_python_sdk-1.0.8/samples/order/__init__.py +1 -0
- webull_openapi_python_sdk-1.0.8/samples/order/order_option_client.py +92 -0
- webull_openapi_python_sdk-1.0.8/samples/order/order_stock_client.py +95 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/trade_client.py +6 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/trade_client_v2.py +6 -1
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/trade_client_v3.py +38 -1
- webull_openapi_python_sdk-1.0.8/webull/__init__.py +1 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/__init__.py +1 -1
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/client.py +7 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/client_initializer.py +1 -1
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/token_manager.py +5 -9
- webull_openapi_python_sdk-1.0.8/webull/core/http/initializer/token/token_storage.py +140 -0
- webull_openapi_python_sdk-1.0.8/webull/data/__init__.py +3 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/quotes_client.py +6 -0
- webull_openapi_python_sdk-1.0.8/webull/data/quotes/subscribe/message_pb2.py +37 -0
- webull_openapi_python_sdk-1.0.8/webull/data/quotes/subscribe/snapshot_result.py +133 -0
- webull_openapi_python_sdk-1.0.8/webull/trade/__init__.py +1 -0
- webull_openapi_python_sdk-1.0.8/webull/trade/request/v3/batch_place_order_request.py +52 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/v3/order_opration_v3.py +13 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull_openapi_python_sdk.egg-info/PKG-INFO +1 -1
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull_openapi_python_sdk.egg-info/SOURCES.txt +9 -0
- webull_openapi_python_sdk-1.0.6/samples/__init__.py +0 -1
- webull_openapi_python_sdk-1.0.6/webull/__init__.py +0 -1
- webull_openapi_python_sdk-1.0.6/webull/data/__init__.py +0 -3
- webull_openapi_python_sdk-1.0.6/webull/data/quotes/subscribe/message_pb2.py +0 -37
- webull_openapi_python_sdk-1.0.6/webull/data/quotes/subscribe/snapshot_result.py +0 -69
- webull_openapi_python_sdk-1.0.6/webull/trade/__init__.py +0 -1
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/ChangeLog.txt +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/LICENSE +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/MANIFEST.in +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/NOTICE +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/README.rst +0 -0
- {webull_openapi_python_sdk-1.0.6/samples/data → webull_openapi_python_sdk-1.0.8/samples/account}/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/trade_event_client.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/setup.cfg +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/setup.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/algorithm/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/algorithm/sha_hmac1.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/algorithm/sha_hmac256.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/composer/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/composer/default_signature_composer.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/credentials.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/signers/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/signers/app_key_signer.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/signers/signer.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/signers/signer_factory.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/cache/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/common/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/common/api_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/common/easy_enum.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/common/region.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/compat.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/context/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/context/request_context_holder.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/data/endpoints.json +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/data/retry_config.json +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/endpoint/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/endpoint/chained_endpoint_resolver.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/endpoint/default_endpoint_resolver.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/endpoint/local_config_regional_endpoint_resolver.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/endpoint/resolver_endpoint_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/endpoint/user_customized_endpoint_resolver.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/exception/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/exception/error_code.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/exception/error_msg.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/exception/exceptions.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/headers.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/config/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/config/bean/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/config/bean/query_config_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/config/config_operation.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/bean/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/bean/access_token.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/bean/check_token_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/bean/create_token_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/bean/refresh_token_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/token_operation.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/method_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/protocol_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/response.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/retry/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/retry/backoff_strategy.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/retry/retry_condition.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/retry/retry_policy.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/retry/retry_policy_context.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/utils/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/utils/common.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/utils/data.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/utils/desensitize.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/utils/validation.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/__version__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/_internal_utils.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/adapters.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/api.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/auth.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/certs.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/compat.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/cookies.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/exceptions.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/help.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/hooks.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/models.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/certifi/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/certifi/__main__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/certifi/cacert.pem +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/certifi/core.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/big5freq.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/big5prober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/chardistribution.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/charsetgroupprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/charsetprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/cli/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/cli/chardetect.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/codingstatemachine.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/compat.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/cp949prober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/enums.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/escprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/escsm.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/eucjpprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/euckrfreq.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/euckrprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/euctwfreq.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/euctwprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/gb2312freq.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/gb2312prober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/hebrewprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/jisfreq.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/jpcntx.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langbulgarianmodel.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langcyrillicmodel.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langgreekmodel.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langhebrewmodel.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langhungarianmodel.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langthaimodel.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langturkishmodel.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/latin1prober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/mbcharsetprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/mbcsgroupprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/mbcssm.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/sbcharsetprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/sbcsgroupprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/sjisprober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/universaldetector.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/utf8prober.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/version.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/_collections.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/connection.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/connectionpool.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/contrib/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/contrib/_appengine_environ.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/contrib/_securetransport/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/contrib/_securetransport/bindings.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/contrib/_securetransport/low_level.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/contrib/appengine.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/contrib/ntlmpool.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/contrib/pyopenssl.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/contrib/securetransport.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/contrib/socks.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/exceptions.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/fields.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/filepost.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/packages/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/packages/backports/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/packages/backports/makefile.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/packages/ordered_dict.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/packages/six.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/packages/socks.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/packages/ssl_match_hostname/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/packages/ssl_match_hostname/_implementation.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/poolmanager.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/response.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/util/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/util/connection.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/util/queue.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/util/request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/util/response.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/util/retry.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/util/selectors.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/util/ssl_.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/util/timeout.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/util/url.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/util/wait.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/sessions.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/status_codes.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/structures.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/utils.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/six.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/category.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/connect_ack.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/contract_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/direction.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/exchange_code.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/exercise_style.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/expiration_cycle.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/instrument_status.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/option_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/subscribe_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/timespan.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/data_client.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/data_streaming_client.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/default_retry_policy.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/exceptions.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/quotes_decoder.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/quotes_payload_decoder.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/quotes_topic.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/crypto_market_data.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/futures_market_data.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/instrument.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/market_data.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/market_streaming_data.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/ask_bid_result.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/basic_result.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/broker_result.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/order_result.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/payload_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/quote_decoder.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/quote_result.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/snapshot_decoder.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/tick_decoder.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/tick_result.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_batch_historical_bars_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_corp_action_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_crypto_historical_bars_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_crypto_instruments_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_crypto_snapshot_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_eod_bars_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_depth_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_historical_bars_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_instruments_by_code_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_instruments_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_products_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_snapshot_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_tick_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_historical_bars_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_instruments_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_quotes_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_snapshot_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_tick_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/subscribe_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/unsubscribe_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/account_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/category.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/combo_ticker_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/combo_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/currency.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/forbid_reason.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/instrument_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/markets.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/order_entrust_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/order_side.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/order_status.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/order_tif.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/order_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/trade_policy.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/trading_date_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/trailing_type.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/default_retry_policy.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/events_pb2.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/events_pb2_grpc.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/signature_composer.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/types.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/cancel_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_account_balance_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_account_positions_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_account_profile_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_app_subscriptions.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_open_orders_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_order_detail_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_today_orders_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_trade_calendar_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_trade_instrument_detail_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_trade_security_detail_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_tradeable_instruments_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/palce_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/place_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/place_order_request_v2.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/replace_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/replace_order_request_v2.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/cancel_option_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/cancel_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/get_account_balance_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/get_account_list.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/get_account_list_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/get_account_positions_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/get_order_detail_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/get_order_history_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/get_order_open_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/palce_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/place_option_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/place_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/preview_option_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/preview_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/replace_option_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/replace_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/cancel_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/get_order_detail_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/get_order_history_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/get_order_open_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/place_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/preview_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/replace_order_request.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/account_info.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/order_operation.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/trade_calendar.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/trade_instrument.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/v2/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/v2/account_info_v2.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/v2/order_operation_v2.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/v3/__init__.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade_client.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade_events_client.py +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull_openapi_python_sdk.egg-info/dependency_links.txt +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull_openapi_python_sdk.egg-info/requires.txt +0 -0
- {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull_openapi_python_sdk.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '1.0.8'
|
|
@@ -0,0 +1,42 @@
|
|
|
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
|
+
import json
|
|
16
|
+
import uuid
|
|
17
|
+
from time import sleep
|
|
18
|
+
|
|
19
|
+
from webull.core.client import ApiClient
|
|
20
|
+
from webull.trade.trade_client import TradeClient
|
|
21
|
+
|
|
22
|
+
optional_api_endpoint = "<api_endpoint>"
|
|
23
|
+
your_app_key = "<your_app_key>"
|
|
24
|
+
your_app_secret = "<your_app_secret>"
|
|
25
|
+
region_id = "<region_id>" # hk or us
|
|
26
|
+
account_id = "<your_account_id>"
|
|
27
|
+
# 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
|
+
# 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
|
+
# 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.
|
|
30
|
+
# token_dir = "<your_token_dir>"
|
|
31
|
+
# api_client.set_token_dir(token_dir)
|
|
32
|
+
|
|
33
|
+
api_client = ApiClient(your_app_key, your_app_secret, region_id)
|
|
34
|
+
api_client.add_endpoint(region_id, optional_api_endpoint)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
if __name__ == '__main__':
|
|
38
|
+
trade_client = TradeClient(api_client)
|
|
39
|
+
|
|
40
|
+
res = trade_client.account_v2.get_account_list()
|
|
41
|
+
if res.status_code == 200:
|
|
42
|
+
print('get account list:', res.json())
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# coding=utf-8
|
|
@@ -0,0 +1,47 @@
|
|
|
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
|
+
import json
|
|
16
|
+
import uuid
|
|
17
|
+
from time import sleep
|
|
18
|
+
|
|
19
|
+
from webull.core.client import ApiClient
|
|
20
|
+
from webull.trade.trade_client import TradeClient
|
|
21
|
+
|
|
22
|
+
optional_api_endpoint = "<api_endpoint>"
|
|
23
|
+
your_app_key = "<your_app_key>"
|
|
24
|
+
your_app_secret = "<your_app_secret>"
|
|
25
|
+
region_id = "<region_id>" # hk or us
|
|
26
|
+
account_id = "<your_account_id>"
|
|
27
|
+
# 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
|
+
# 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
|
+
# 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.
|
|
30
|
+
# token_dir = "<your_token_dir>"
|
|
31
|
+
# api_client.set_token_dir(token_dir)
|
|
32
|
+
|
|
33
|
+
api_client = ApiClient(your_app_key, your_app_secret, region_id)
|
|
34
|
+
api_client.add_endpoint(region_id, optional_api_endpoint)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
if __name__ == '__main__':
|
|
38
|
+
trade_client = TradeClient(api_client)
|
|
39
|
+
|
|
40
|
+
res = trade_client.account_v2.get_account_balance(account_id)
|
|
41
|
+
if res.status_code == 200:
|
|
42
|
+
print('get account balance info:', res.json())
|
|
43
|
+
|
|
44
|
+
res = trade_client.account_v2.get_account_position(account_id)
|
|
45
|
+
if res.status_code == 200:
|
|
46
|
+
print('get account positions info:', res.json())
|
|
47
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# coding=utf-8
|
{webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/data/data_client.py
RENAMED
|
@@ -24,9 +24,16 @@ 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
|
+
# 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
|
+
# 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
|
+
# 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.
|
|
30
|
+
# token_dir = "<your_token_dir>"
|
|
31
|
+
# api_client.set_token_dir(token_dir)
|
|
32
|
+
|
|
27
33
|
api_client = ApiClient(your_app_key, your_app_secret, region_id)
|
|
28
34
|
api_client.add_endpoint(region_id, optional_api_endpoint)
|
|
29
35
|
|
|
36
|
+
|
|
30
37
|
if __name__ == '__main__':
|
|
31
38
|
data_client = DataClient(api_client)
|
|
32
39
|
|
|
@@ -27,6 +27,11 @@ your_app_secret = "</your_app_secret>"
|
|
|
27
27
|
optional_api_endpoint = "</optional_quotes_endpoint>"
|
|
28
28
|
optional_quotes_endpoint = "</optional_quotes_endpoint>"
|
|
29
29
|
region_id = '<region_id>'
|
|
30
|
+
# 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.
|
|
31
|
+
# 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.
|
|
32
|
+
# 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.
|
|
33
|
+
# token_dir = "<your_token_dir>"
|
|
34
|
+
# data_streaming_client.set_token_dir(token_dir)
|
|
30
35
|
|
|
31
36
|
session_id = uuid.uuid4().hex
|
|
32
37
|
data_streaming_client = DataStreamingClient(your_app_key, your_app_secret, region_id, session_id,
|
|
@@ -27,6 +27,11 @@ your_app_secret = "</your_app_secret>"
|
|
|
27
27
|
optional_api_endpoint = "</optional_quotes_endpoint>"
|
|
28
28
|
optional_quotes_endpoint = "</optional_quotes_endpoint>"
|
|
29
29
|
region_id = '<region_id>'
|
|
30
|
+
# 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.
|
|
31
|
+
# 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.
|
|
32
|
+
# 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.
|
|
33
|
+
# token_dir = "<your_token_dir>"
|
|
34
|
+
# data_streaming_client.set_token_dir(token_dir)
|
|
30
35
|
|
|
31
36
|
session_id = uuid.uuid4().hex
|
|
32
37
|
data_streaming_client = DataStreamingClient(your_app_key, your_app_secret, region_id, session_id,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# coding=utf-8
|
|
@@ -0,0 +1,92 @@
|
|
|
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
|
+
import uuid
|
|
16
|
+
from webull.core.client import ApiClient
|
|
17
|
+
from webull.trade.trade_client import TradeClient
|
|
18
|
+
|
|
19
|
+
optional_api_endpoint = "<api_endpoint>"
|
|
20
|
+
your_app_key = "<your_app_key>"
|
|
21
|
+
your_app_secret = "<your_app_secret>"
|
|
22
|
+
region_id = "<region_id>" # hk or us
|
|
23
|
+
account_id = "<your_account_id>"
|
|
24
|
+
# 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.
|
|
25
|
+
# 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.
|
|
26
|
+
# 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.
|
|
27
|
+
# token_dir = "<your_token_dir>"
|
|
28
|
+
# api_client.set_token_dir(token_dir)
|
|
29
|
+
|
|
30
|
+
api_client = ApiClient(your_app_key, your_app_secret, region_id)
|
|
31
|
+
api_client.add_endpoint(region_id, optional_api_endpoint)
|
|
32
|
+
|
|
33
|
+
if __name__ == '__main__':
|
|
34
|
+
trade_client = TradeClient(api_client)
|
|
35
|
+
|
|
36
|
+
# Options
|
|
37
|
+
# For option order inquiries, please use the V2 query interface: api.order_v2.get_order_detail(account_id, client_order_id).
|
|
38
|
+
client_order_id = uuid.uuid4().hex
|
|
39
|
+
option_new_orders = [
|
|
40
|
+
{
|
|
41
|
+
"client_order_id": client_order_id,
|
|
42
|
+
"combo_type": "NORMAL",
|
|
43
|
+
"order_type": "LIMIT",
|
|
44
|
+
"quantity": "1",
|
|
45
|
+
"limit_price": "21.25",
|
|
46
|
+
"option_strategy": "SINGLE",
|
|
47
|
+
"side": "BUY",
|
|
48
|
+
"time_in_force": "GTC",
|
|
49
|
+
"entrust_type": "QTY",
|
|
50
|
+
"legs": [
|
|
51
|
+
{
|
|
52
|
+
"side": "BUY",
|
|
53
|
+
"quantity": "1",
|
|
54
|
+
"symbol": "TSLA",
|
|
55
|
+
"strike_price": "400",
|
|
56
|
+
"option_expire_date": "2025-12-26",
|
|
57
|
+
"instrument_type": "OPTION",
|
|
58
|
+
"option_type": "CALL",
|
|
59
|
+
"market": "US"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
}
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
# preview
|
|
66
|
+
res = trade_client.order_v2.preview_option(account_id, option_new_orders)
|
|
67
|
+
if res.status_code == 200:
|
|
68
|
+
print("preview option res:", res.json())
|
|
69
|
+
|
|
70
|
+
# place
|
|
71
|
+
res = trade_client.order_v2.place_option(account_id, option_new_orders)
|
|
72
|
+
if res.status_code == 200:
|
|
73
|
+
print("place option res:" , res.json())
|
|
74
|
+
|
|
75
|
+
option_modify_orders = [
|
|
76
|
+
{
|
|
77
|
+
"client_order_id": client_order_id,
|
|
78
|
+
"quantity": "2",
|
|
79
|
+
"limit_price": "21.25"
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
res = trade_client.order_v2.replace_option(account_id, option_modify_orders)
|
|
83
|
+
if res.status_code == 200:
|
|
84
|
+
print("Replace option order res:" , res.json())
|
|
85
|
+
|
|
86
|
+
res = trade_client.order_v2.cancel_option(account_id, client_order_id)
|
|
87
|
+
if res.status_code == 200:
|
|
88
|
+
print("Cancel option order res:" , res.json())
|
|
89
|
+
|
|
90
|
+
res = trade_client.order_v2.get_order_detail(account_id, client_order_id)
|
|
91
|
+
if res.status_code == 200:
|
|
92
|
+
print("Option order detail order res:" , res.json())
|
|
@@ -0,0 +1,95 @@
|
|
|
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
|
+
import uuid
|
|
16
|
+
from webull.core.client import ApiClient
|
|
17
|
+
from webull.trade.trade_client import TradeClient
|
|
18
|
+
|
|
19
|
+
optional_api_endpoint = "<api_endpoint>"
|
|
20
|
+
your_app_key = "<your_app_key>"
|
|
21
|
+
your_app_secret = "<your_app_secret>"
|
|
22
|
+
region_id = "<region_id>" # hk or us
|
|
23
|
+
account_id = "<your_account_id>"
|
|
24
|
+
# 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.
|
|
25
|
+
# 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.
|
|
26
|
+
# 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.
|
|
27
|
+
# token_dir = "<your_token_dir>"
|
|
28
|
+
# api_client.set_token_dir(token_dir)
|
|
29
|
+
|
|
30
|
+
api_client = ApiClient(your_app_key, your_app_secret, region_id)
|
|
31
|
+
api_client.add_endpoint(region_id, optional_api_endpoint)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
if __name__ == '__main__':
|
|
35
|
+
trade_client = TradeClient(api_client)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# simple order
|
|
39
|
+
client_order_id = uuid.uuid4().hex
|
|
40
|
+
print('client order id:', client_order_id)
|
|
41
|
+
new_simple_orders = [
|
|
42
|
+
{
|
|
43
|
+
"client_order_id": client_order_id,
|
|
44
|
+
"symbol": "BULL",
|
|
45
|
+
"instrument_type": "EQUITY",
|
|
46
|
+
"market": "US",
|
|
47
|
+
"order_type": "LIMIT",
|
|
48
|
+
"limit_price": "26",
|
|
49
|
+
"quantity": "1",
|
|
50
|
+
"support_trading_session": "CORE",
|
|
51
|
+
"side": "BUY",
|
|
52
|
+
"time_in_force": "DAY",
|
|
53
|
+
"entrust_type": "QTY"
|
|
54
|
+
}
|
|
55
|
+
]
|
|
56
|
+
new_hk_stock_simple_orders = [
|
|
57
|
+
{
|
|
58
|
+
"client_order_id": client_order_id,
|
|
59
|
+
"symbol": "00700",
|
|
60
|
+
"instrument_type": "EQUITY",
|
|
61
|
+
"market": "HK",
|
|
62
|
+
"order_type": "ENHANCED_LIMIT",
|
|
63
|
+
"limit_price": "612",
|
|
64
|
+
"quantity": "100",
|
|
65
|
+
"side": "BUY",
|
|
66
|
+
"time_in_force": "DAY",
|
|
67
|
+
"entrust_type": "QTY"
|
|
68
|
+
}
|
|
69
|
+
]
|
|
70
|
+
res = trade_client.order_v2.preview_order(account_id, new_simple_orders)
|
|
71
|
+
if res.status_code == 200:
|
|
72
|
+
print('preview order res:', res.json())
|
|
73
|
+
|
|
74
|
+
res = trade_client.order_v2.place_order(account_id, new_simple_orders)
|
|
75
|
+
if res.status_code == 200:
|
|
76
|
+
print('place order res:', res.json())
|
|
77
|
+
|
|
78
|
+
modify_simple_orders = [
|
|
79
|
+
{
|
|
80
|
+
"client_order_id": client_order_id,
|
|
81
|
+
"quantity": "2",
|
|
82
|
+
"limit_price": "25"
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
res = trade_client.order_v2.replace_order(account_id, modify_simple_orders)
|
|
86
|
+
if res.status_code == 200:
|
|
87
|
+
print('replace order res:', res.json())
|
|
88
|
+
|
|
89
|
+
res = trade_client.order_v2.cancel_order(account_id, client_order_id)
|
|
90
|
+
if res.status_code == 200:
|
|
91
|
+
print('cancel order res:', res.json())
|
|
92
|
+
|
|
93
|
+
res = trade_client.order_v2.get_order_detail(account_id, client_order_id)
|
|
94
|
+
if res.status_code == 200:
|
|
95
|
+
print('order detail:', res.json())
|
{webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/trade_client.py
RENAMED
|
@@ -25,6 +25,12 @@ your_app_key = "<your_app_key>"
|
|
|
25
25
|
your_app_secret = "<your_app_secret>"
|
|
26
26
|
region_id = "<region_id>"
|
|
27
27
|
account_id = "<your_account_id>"
|
|
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.
|
|
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.
|
|
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.
|
|
31
|
+
# token_dir = "<your_token_dir>"
|
|
32
|
+
# api_client.set_token_dir(token_dir)
|
|
33
|
+
|
|
28
34
|
api_client = ApiClient(your_app_key, your_app_secret, region_id)
|
|
29
35
|
api_client.add_endpoint(region_id, optional_api_endpoint)
|
|
30
36
|
|
{webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/trade_client_v2.py
RENAMED
|
@@ -24,10 +24,15 @@ your_app_key = "<your_app_key>"
|
|
|
24
24
|
your_app_secret = "<your_app_secret>"
|
|
25
25
|
region_id = "<region_id>"
|
|
26
26
|
account_id = "<your_account_id>"
|
|
27
|
+
# 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
|
+
# 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
|
+
# 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.
|
|
30
|
+
# token_dir = "<your_token_dir>"
|
|
31
|
+
# api_client.set_token_dir(token_dir)
|
|
32
|
+
|
|
27
33
|
api_client = ApiClient(your_app_key, your_app_secret, region_id)
|
|
28
34
|
api_client.add_endpoint(region_id, optional_api_endpoint)
|
|
29
35
|
|
|
30
|
-
|
|
31
36
|
if __name__ == '__main__':
|
|
32
37
|
trade_client = TradeClient(api_client)
|
|
33
38
|
|
{webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/trade_client_v3.py
RENAMED
|
@@ -24,6 +24,12 @@ your_app_key = "<your_app_key>"
|
|
|
24
24
|
your_app_secret = "<your_app_secret>"
|
|
25
25
|
region_id = "<region_id>"
|
|
26
26
|
account_id = "<your_account_id>"
|
|
27
|
+
# 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
|
+
# 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
|
+
# 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.
|
|
30
|
+
# token_dir = "<your_token_dir>"
|
|
31
|
+
# api_client.set_token_dir(token_dir)
|
|
32
|
+
|
|
27
33
|
api_client = ApiClient(your_app_key, your_app_secret, region_id)
|
|
28
34
|
api_client.add_endpoint(region_id, optional_api_endpoint)
|
|
29
35
|
|
|
@@ -202,7 +208,38 @@ if __name__ == '__main__':
|
|
|
202
208
|
if res.status_code == 200:
|
|
203
209
|
print('get master order detail res:', res.json())
|
|
204
210
|
|
|
205
|
-
|
|
211
|
+
# batch place order
|
|
212
|
+
batch_place_orders = [
|
|
213
|
+
{
|
|
214
|
+
"combo_type": "NORMAL",
|
|
215
|
+
"client_order_id": uuid.uuid4().hex,
|
|
216
|
+
"instrument_type": "EQUITY",
|
|
217
|
+
"market": "US",
|
|
218
|
+
"symbol": "AAPL",
|
|
219
|
+
"order_type": "MARKET",
|
|
220
|
+
"entrust_type": "QTY",
|
|
221
|
+
"support_trading_session": "CORE",
|
|
222
|
+
"time_in_force": "DAY",
|
|
223
|
+
"side": "BUY",
|
|
224
|
+
"quantity": "1"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"combo_type": "NORMAL",
|
|
228
|
+
"client_order_id": uuid.uuid4().hex,
|
|
229
|
+
"instrument_type": "EQUITY",
|
|
230
|
+
"market": "US",
|
|
231
|
+
"symbol": "TESL",
|
|
232
|
+
"order_type": "MARKET",
|
|
233
|
+
"entrust_type": "QTY",
|
|
234
|
+
"support_trading_session": "CORE",
|
|
235
|
+
"time_in_force": "DAY",
|
|
236
|
+
"side": "BUY",
|
|
237
|
+
"quantity": "1"
|
|
238
|
+
}
|
|
239
|
+
]
|
|
240
|
+
res = trade_client.order_v3.batch_place_order(account_id, batch_place_orders)
|
|
241
|
+
if res.status_code == 200:
|
|
242
|
+
print('batch place normal equity order res:', res.json())
|
|
206
243
|
|
|
207
244
|
|
|
208
245
|
# ============================================================
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = '1.0.8'
|
|
@@ -122,6 +122,7 @@ class ApiClient:
|
|
|
122
122
|
self._token_check_duration_seconds = token_check_duration_seconds
|
|
123
123
|
validation.assert_integer_positive(token_check_interval_seconds, "token_check_interval_seconds")
|
|
124
124
|
self._token_check_interval_seconds = token_check_interval_seconds
|
|
125
|
+
self._token_dir = None
|
|
125
126
|
|
|
126
127
|
def get_region_id(self):
|
|
127
128
|
return self._region_id
|
|
@@ -164,6 +165,12 @@ class ApiClient:
|
|
|
164
165
|
def get_token_check_interval_seconds(self):
|
|
165
166
|
return self._token_check_interval_seconds
|
|
166
167
|
|
|
168
|
+
def set_token_dir(self, token_dir):
|
|
169
|
+
self._token_dir = token_dir
|
|
170
|
+
|
|
171
|
+
def get_token_dir(self):
|
|
172
|
+
return self._token_dir
|
|
173
|
+
|
|
167
174
|
@staticmethod
|
|
168
175
|
def user_agent_header():
|
|
169
176
|
base = '%s (%s %s;%s)' \
|
|
@@ -34,11 +34,10 @@
|
|
|
34
34
|
# coding=utf-8
|
|
35
35
|
|
|
36
36
|
import logging
|
|
37
|
-
import os
|
|
38
37
|
import time
|
|
39
|
-
from pathlib import Path
|
|
40
38
|
|
|
41
39
|
from webull.core import compat
|
|
40
|
+
from webull.core.http.initializer.token.token_storage import TokenStorage
|
|
42
41
|
from webull.core.utils import desensitize
|
|
43
42
|
from webull.core.exception.exceptions import ClientException
|
|
44
43
|
from webull.core.http.initializer.token.bean.access_token import AccessToken
|
|
@@ -47,13 +46,10 @@ from webull.core.http.initializer.token.token_operation import TokenOperation
|
|
|
47
46
|
logger = logging.getLogger(__name__)
|
|
48
47
|
|
|
49
48
|
class TokenManager:
|
|
50
|
-
TOKEN_FILE_NAME = "conf/token.txt"
|
|
51
|
-
CONF_ENV_TOKEN_DIR = os.getenv("WEBULL_OPENAPI_TOKEN_DIR")
|
|
52
|
-
DEFAULT_ENV_TOKEN_DIR = os.getcwd()
|
|
53
49
|
|
|
54
|
-
def __init__(self):
|
|
55
|
-
|
|
56
|
-
self.token_file_path =
|
|
50
|
+
def __init__(self, custom_token_dir=None):
|
|
51
|
+
token_storage = TokenStorage(custom_token_dir=custom_token_dir)
|
|
52
|
+
self.token_file_path = token_storage.get_token_file_path()
|
|
57
53
|
|
|
58
54
|
def init_token(self, api_client):
|
|
59
55
|
local_access_token = self.load_token_from_local()
|
|
@@ -100,7 +96,7 @@ class TokenManager:
|
|
|
100
96
|
def save_token_to_local(self, server_access_token):
|
|
101
97
|
try:
|
|
102
98
|
logger.info("save_token_to_local writing token to local file. token:%s expires:%s status:%s",
|
|
103
|
-
server_access_token.get("token"), server_access_token.get("expires"), server_access_token.get("status"))
|
|
99
|
+
desensitize.desensitize_token(server_access_token.get("token")), server_access_token.get("expires"), server_access_token.get("status"))
|
|
104
100
|
self.token_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
105
101
|
with open(self.token_file_path, "w", encoding="utf-8") as f:
|
|
106
102
|
f.write(server_access_token.get("token") + "\n")
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Copyright 2022 Webull
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
|
16
|
+
# or more contributor license agreements. See the NOTICE file
|
|
17
|
+
# distributed with this work for additional information
|
|
18
|
+
# regarding copyright ownership. The ASF licenses this file
|
|
19
|
+
# to you under the Apache License, Version 2.0 (the
|
|
20
|
+
# "License"); you may not use this file except in compliance
|
|
21
|
+
# with the License. You may obtain a copy of the License at
|
|
22
|
+
#
|
|
23
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
24
|
+
#
|
|
25
|
+
#
|
|
26
|
+
#
|
|
27
|
+
# Unless required by applicable law or agreed to in writing,
|
|
28
|
+
# software distributed under the License is distributed on an
|
|
29
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
30
|
+
# KIND, either express or implied. See the License for the
|
|
31
|
+
# specific language governing permissions and limitations
|
|
32
|
+
# under the License.
|
|
33
|
+
|
|
34
|
+
# coding=utf-8
|
|
35
|
+
|
|
36
|
+
import logging
|
|
37
|
+
import os
|
|
38
|
+
import platform
|
|
39
|
+
import re
|
|
40
|
+
from pathlib import Path
|
|
41
|
+
|
|
42
|
+
from webull.core.exception.exceptions import ClientException
|
|
43
|
+
|
|
44
|
+
logger = logging.getLogger(__name__)
|
|
45
|
+
|
|
46
|
+
class TokenStorage:
|
|
47
|
+
|
|
48
|
+
DEFAULT_TOKEN_PATH = "conf"
|
|
49
|
+
DEFAULT_TOKEN_FILE = "token.txt"
|
|
50
|
+
DEFAULT_ENV_TOKEN_DIR = "WEBULL_OPENAPI_TOKEN_DIR"
|
|
51
|
+
|
|
52
|
+
_INVALID_CHARS = {
|
|
53
|
+
"windows": re.compile(r'[<>"|?*]'),
|
|
54
|
+
"posix": re.compile(r'[\0]')
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
def __init__(self, custom_token_dir=None):
|
|
58
|
+
# Resolve the final storage directory (priority: custom direction > environment variable > default).
|
|
59
|
+
self.storage_token_dir = self._resolve_dir(custom_token_dir)
|
|
60
|
+
# Full path validation
|
|
61
|
+
self._validate_path()
|
|
62
|
+
# Ensure the directory exists
|
|
63
|
+
self._ensure_dir_exists()
|
|
64
|
+
# Full path
|
|
65
|
+
self.token_file = self.storage_token_dir / self.DEFAULT_TOKEN_FILE
|
|
66
|
+
logger.info("storage_token initialized path:%s.",self.token_file)
|
|
67
|
+
# Check file exists
|
|
68
|
+
self._check_file_exists()
|
|
69
|
+
|
|
70
|
+
def _resolve_dir(self, custom_token_dir=None) -> Path:
|
|
71
|
+
if custom_token_dir and custom_token_dir.strip():
|
|
72
|
+
# custom direction
|
|
73
|
+
raw_dir = custom_token_dir.strip()
|
|
74
|
+
logger.info("storage_token uses the custom configuration, token_dir:%s.", raw_dir)
|
|
75
|
+
elif env_dir := os.getenv(self.DEFAULT_ENV_TOKEN_DIR):
|
|
76
|
+
# environment variable
|
|
77
|
+
raw_dir = env_dir.strip()
|
|
78
|
+
logger.info("storage_token uses environment variable configuration, %s:%s.", self.DEFAULT_ENV_TOKEN_DIR, raw_dir)
|
|
79
|
+
else:
|
|
80
|
+
# default
|
|
81
|
+
raw_dir = self.DEFAULT_TOKEN_PATH
|
|
82
|
+
logger.info("storage_token uses the default configuration, %s.", raw_dir)
|
|
83
|
+
|
|
84
|
+
# Resolve path
|
|
85
|
+
normalized_token_dir = Path(raw_dir).expanduser().absolute()
|
|
86
|
+
return normalized_token_dir
|
|
87
|
+
|
|
88
|
+
def _validate_path(self):
|
|
89
|
+
|
|
90
|
+
dir_path = self.storage_token_dir
|
|
91
|
+
os_type = platform.system().lower()
|
|
92
|
+
|
|
93
|
+
self._validate_path_syntax(dir_path, os_type)
|
|
94
|
+
self._validate_path_access(dir_path)
|
|
95
|
+
|
|
96
|
+
def _validate_path_syntax(self, path: Path, os_type: str):
|
|
97
|
+
"""Syntax validity check"""
|
|
98
|
+
invalid_pattern = self._INVALID_CHARS["windows"] if "windows" in os_type else self._INVALID_CHARS["posix"]
|
|
99
|
+
if invalid_pattern.search(str(path)):
|
|
100
|
+
msg = ("storage_token path contains illegal characters, path:%s." % (str(path)))
|
|
101
|
+
logger.warning(msg)
|
|
102
|
+
|
|
103
|
+
def _validate_path_access(self, path: Path):
|
|
104
|
+
"""Accessibility/permission check"""
|
|
105
|
+
if path.exists():
|
|
106
|
+
if not path.is_dir():
|
|
107
|
+
msg = ("storage_token path already exists but is not a directory, path:%s." % (str(path)))
|
|
108
|
+
logger.warning(msg)
|
|
109
|
+
return
|
|
110
|
+
if not os.access(path, os.R_OK | os.W_OK):
|
|
111
|
+
msg = ("storage_token directory has no read/write permission. Please check the configuration, path:%s." % (str(path)))
|
|
112
|
+
logger.warning(msg)
|
|
113
|
+
else:
|
|
114
|
+
parent_dir = path.parent
|
|
115
|
+
if not parent_dir.exists():
|
|
116
|
+
msg = ("storage_token parent directory does not exist, unable to create directory. Please check the configuration, parent path:%s." % (str(parent_dir)))
|
|
117
|
+
logger.warning(msg)
|
|
118
|
+
return
|
|
119
|
+
if not os.access(parent_dir, os.R_OK | os.W_OK | os.X_OK):
|
|
120
|
+
msg = ("storage_token parent directory has no read/write permission. Please check the configuration, parent path:%s." % (str(parent_dir)))
|
|
121
|
+
logger.warning(msg)
|
|
122
|
+
|
|
123
|
+
def _ensure_dir_exists(self):
|
|
124
|
+
"""Ensure the directory exists"""
|
|
125
|
+
try:
|
|
126
|
+
self.storage_token_dir.mkdir(parents=True, exist_ok=True)
|
|
127
|
+
except Exception as e:
|
|
128
|
+
msg = ("storage_token failed to create directory, file:%s." % (str(self.storage_token_dir)))
|
|
129
|
+
logger.error(msg)
|
|
130
|
+
raise ClientException("ERROR_STORAGE_TOKEN", str(e)) from e
|
|
131
|
+
|
|
132
|
+
def _check_file_exists(self):
|
|
133
|
+
"""Check file exists"""
|
|
134
|
+
full_path = Path(self.token_file)
|
|
135
|
+
if full_path.is_file():
|
|
136
|
+
msg = ("storage_token Note: The token file already exists, the latest token configuration will be overwritten and written to the token file after successful 2FA verification. path:%s." % self.token_file)
|
|
137
|
+
logger.warning(msg)
|
|
138
|
+
|
|
139
|
+
def get_token_file_path(self):
|
|
140
|
+
return self.token_file
|