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.
Files changed (349) hide show
  1. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/PKG-INFO +1 -1
  2. webull_openapi_python_sdk-1.0.8/samples/__init__.py +1 -0
  3. webull_openapi_python_sdk-1.0.8/samples/account/account_client.py +42 -0
  4. webull_openapi_python_sdk-1.0.8/samples/assets/__init__.py +1 -0
  5. webull_openapi_python_sdk-1.0.8/samples/assets/assets_client.py +47 -0
  6. webull_openapi_python_sdk-1.0.8/samples/data/__init__.py +1 -0
  7. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/data/data_client.py +7 -0
  8. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/data/data_streaming_client.py +5 -0
  9. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/data/data_streaming_client_async.py +5 -0
  10. webull_openapi_python_sdk-1.0.8/samples/order/__init__.py +1 -0
  11. webull_openapi_python_sdk-1.0.8/samples/order/order_option_client.py +92 -0
  12. webull_openapi_python_sdk-1.0.8/samples/order/order_stock_client.py +95 -0
  13. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/trade_client.py +6 -0
  14. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/trade_client_v2.py +6 -1
  15. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/trade_client_v3.py +38 -1
  16. webull_openapi_python_sdk-1.0.8/webull/__init__.py +1 -0
  17. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/__init__.py +1 -1
  18. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/client.py +7 -0
  19. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/client_initializer.py +1 -1
  20. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/token_manager.py +5 -9
  21. webull_openapi_python_sdk-1.0.8/webull/core/http/initializer/token/token_storage.py +140 -0
  22. webull_openapi_python_sdk-1.0.8/webull/data/__init__.py +3 -0
  23. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/quotes_client.py +6 -0
  24. webull_openapi_python_sdk-1.0.8/webull/data/quotes/subscribe/message_pb2.py +37 -0
  25. webull_openapi_python_sdk-1.0.8/webull/data/quotes/subscribe/snapshot_result.py +133 -0
  26. webull_openapi_python_sdk-1.0.8/webull/trade/__init__.py +1 -0
  27. webull_openapi_python_sdk-1.0.8/webull/trade/request/v3/batch_place_order_request.py +52 -0
  28. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/v3/order_opration_v3.py +13 -0
  29. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull_openapi_python_sdk.egg-info/PKG-INFO +1 -1
  30. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull_openapi_python_sdk.egg-info/SOURCES.txt +9 -0
  31. webull_openapi_python_sdk-1.0.6/samples/__init__.py +0 -1
  32. webull_openapi_python_sdk-1.0.6/webull/__init__.py +0 -1
  33. webull_openapi_python_sdk-1.0.6/webull/data/__init__.py +0 -3
  34. webull_openapi_python_sdk-1.0.6/webull/data/quotes/subscribe/message_pb2.py +0 -37
  35. webull_openapi_python_sdk-1.0.6/webull/data/quotes/subscribe/snapshot_result.py +0 -69
  36. webull_openapi_python_sdk-1.0.6/webull/trade/__init__.py +0 -1
  37. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/ChangeLog.txt +0 -0
  38. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/LICENSE +0 -0
  39. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/MANIFEST.in +0 -0
  40. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/NOTICE +0 -0
  41. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/README.rst +0 -0
  42. {webull_openapi_python_sdk-1.0.6/samples/data → webull_openapi_python_sdk-1.0.8/samples/account}/__init__.py +0 -0
  43. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/__init__.py +0 -0
  44. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/samples/trade/trade_event_client.py +0 -0
  45. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/setup.cfg +0 -0
  46. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/setup.py +0 -0
  47. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/__init__.py +0 -0
  48. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/algorithm/__init__.py +0 -0
  49. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/algorithm/sha_hmac1.py +0 -0
  50. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/algorithm/sha_hmac256.py +0 -0
  51. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/composer/__init__.py +0 -0
  52. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/composer/default_signature_composer.py +0 -0
  53. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/credentials.py +0 -0
  54. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/signers/__init__.py +0 -0
  55. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/signers/app_key_signer.py +0 -0
  56. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/signers/signer.py +0 -0
  57. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/auth/signers/signer_factory.py +0 -0
  58. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/cache/__init__.py +0 -0
  59. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/common/__init__.py +0 -0
  60. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/common/api_type.py +0 -0
  61. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/common/easy_enum.py +0 -0
  62. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/common/region.py +0 -0
  63. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/compat.py +0 -0
  64. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/context/__init__.py +0 -0
  65. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/context/request_context_holder.py +0 -0
  66. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/data/endpoints.json +0 -0
  67. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/data/retry_config.json +0 -0
  68. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/endpoint/__init__.py +0 -0
  69. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/endpoint/chained_endpoint_resolver.py +0 -0
  70. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/endpoint/default_endpoint_resolver.py +0 -0
  71. {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
  72. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/endpoint/resolver_endpoint_request.py +0 -0
  73. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/endpoint/user_customized_endpoint_resolver.py +0 -0
  74. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/exception/__init__.py +0 -0
  75. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/exception/error_code.py +0 -0
  76. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/exception/error_msg.py +0 -0
  77. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/exception/exceptions.py +0 -0
  78. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/headers.py +0 -0
  79. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/__init__.py +0 -0
  80. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/__init__.py +0 -0
  81. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/config/__init__.py +0 -0
  82. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/config/bean/__init__.py +0 -0
  83. {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
  84. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/config/config_operation.py +0 -0
  85. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/__init__.py +0 -0
  86. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/bean/__init__.py +0 -0
  87. {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
  88. {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
  89. {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
  90. {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
  91. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/initializer/token/token_operation.py +0 -0
  92. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/method_type.py +0 -0
  93. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/protocol_type.py +0 -0
  94. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/request.py +0 -0
  95. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/http/response.py +0 -0
  96. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/request.py +0 -0
  97. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/retry/__init__.py +0 -0
  98. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/retry/backoff_strategy.py +0 -0
  99. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/retry/retry_condition.py +0 -0
  100. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/retry/retry_policy.py +0 -0
  101. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/retry/retry_policy_context.py +0 -0
  102. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/utils/__init__.py +0 -0
  103. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/utils/common.py +0 -0
  104. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/utils/data.py +0 -0
  105. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/utils/desensitize.py +0 -0
  106. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/utils/validation.py +0 -0
  107. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/__init__.py +0 -0
  108. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/__init__.py +0 -0
  109. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/__version__.py +0 -0
  110. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/_internal_utils.py +0 -0
  111. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/adapters.py +0 -0
  112. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/api.py +0 -0
  113. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/auth.py +0 -0
  114. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/certs.py +0 -0
  115. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/compat.py +0 -0
  116. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/cookies.py +0 -0
  117. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/exceptions.py +0 -0
  118. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/help.py +0 -0
  119. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/hooks.py +0 -0
  120. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/models.py +0 -0
  121. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/__init__.py +0 -0
  122. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/certifi/__init__.py +0 -0
  123. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/certifi/__main__.py +0 -0
  124. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/certifi/cacert.pem +0 -0
  125. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/certifi/core.py +0 -0
  126. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/__init__.py +0 -0
  127. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/big5freq.py +0 -0
  128. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/big5prober.py +0 -0
  129. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/chardistribution.py +0 -0
  130. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/charsetgroupprober.py +0 -0
  131. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/charsetprober.py +0 -0
  132. {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
  133. {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
  134. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/codingstatemachine.py +0 -0
  135. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/compat.py +0 -0
  136. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/cp949prober.py +0 -0
  137. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/enums.py +0 -0
  138. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/escprober.py +0 -0
  139. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/escsm.py +0 -0
  140. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/eucjpprober.py +0 -0
  141. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/euckrfreq.py +0 -0
  142. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/euckrprober.py +0 -0
  143. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/euctwfreq.py +0 -0
  144. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/euctwprober.py +0 -0
  145. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/gb2312freq.py +0 -0
  146. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/gb2312prober.py +0 -0
  147. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/hebrewprober.py +0 -0
  148. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/jisfreq.py +0 -0
  149. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/jpcntx.py +0 -0
  150. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langbulgarianmodel.py +0 -0
  151. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langcyrillicmodel.py +0 -0
  152. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langgreekmodel.py +0 -0
  153. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langhebrewmodel.py +0 -0
  154. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langhungarianmodel.py +0 -0
  155. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langthaimodel.py +0 -0
  156. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/langturkishmodel.py +0 -0
  157. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/latin1prober.py +0 -0
  158. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/mbcharsetprober.py +0 -0
  159. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/mbcsgroupprober.py +0 -0
  160. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/mbcssm.py +0 -0
  161. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/sbcharsetprober.py +0 -0
  162. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/sbcsgroupprober.py +0 -0
  163. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/sjisprober.py +0 -0
  164. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/universaldetector.py +0 -0
  165. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/utf8prober.py +0 -0
  166. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/chardet/version.py +0 -0
  167. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/__init__.py +0 -0
  168. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/_collections.py +0 -0
  169. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/connection.py +0 -0
  170. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/connectionpool.py +0 -0
  171. {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
  172. {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
  173. {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
  174. {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
  175. {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
  176. {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
  177. {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
  178. {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
  179. {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
  180. {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
  181. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/exceptions.py +0 -0
  182. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/fields.py +0 -0
  183. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/filepost.py +0 -0
  184. {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
  185. {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
  186. {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
  187. {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
  188. {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
  189. {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
  190. {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
  191. {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
  192. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/poolmanager.py +0 -0
  193. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/request.py +0 -0
  194. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages/urllib3/response.py +0 -0
  195. {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
  196. {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
  197. {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
  198. {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
  199. {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
  200. {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
  201. {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
  202. {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
  203. {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
  204. {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
  205. {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
  206. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/packages.py +0 -0
  207. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/sessions.py +0 -0
  208. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/status_codes.py +0 -0
  209. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/structures.py +0 -0
  210. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/requests/utils.py +0 -0
  211. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/core/vendored/six.py +0 -0
  212. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/__init__.py +0 -0
  213. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/category.py +0 -0
  214. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/connect_ack.py +0 -0
  215. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/contract_type.py +0 -0
  216. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/direction.py +0 -0
  217. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/exchange_code.py +0 -0
  218. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/exercise_style.py +0 -0
  219. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/expiration_cycle.py +0 -0
  220. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/instrument_status.py +0 -0
  221. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/option_type.py +0 -0
  222. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/subscribe_type.py +0 -0
  223. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/common/timespan.py +0 -0
  224. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/data_client.py +0 -0
  225. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/data_streaming_client.py +0 -0
  226. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/__init__.py +0 -0
  227. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/default_retry_policy.py +0 -0
  228. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/exceptions.py +0 -0
  229. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/quotes_decoder.py +0 -0
  230. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/quotes_payload_decoder.py +0 -0
  231. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/internal/quotes_topic.py +0 -0
  232. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/__init__.py +0 -0
  233. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/crypto_market_data.py +0 -0
  234. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/futures_market_data.py +0 -0
  235. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/instrument.py +0 -0
  236. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/market_data.py +0 -0
  237. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/market_streaming_data.py +0 -0
  238. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/__init__.py +0 -0
  239. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/ask_bid_result.py +0 -0
  240. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/basic_result.py +0 -0
  241. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/broker_result.py +0 -0
  242. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/order_result.py +0 -0
  243. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/payload_type.py +0 -0
  244. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/quote_decoder.py +0 -0
  245. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/quote_result.py +0 -0
  246. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/snapshot_decoder.py +0 -0
  247. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/tick_decoder.py +0 -0
  248. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/quotes/subscribe/tick_result.py +0 -0
  249. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/__init__.py +0 -0
  250. {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
  251. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_corp_action_request.py +0 -0
  252. {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
  253. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_crypto_instruments_request.py +0 -0
  254. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_crypto_snapshot_request.py +0 -0
  255. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_eod_bars_request.py +0 -0
  256. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_depth_request.py +0 -0
  257. {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
  258. {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
  259. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_instruments_request.py +0 -0
  260. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_products_request.py +0 -0
  261. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_snapshot_request.py +0 -0
  262. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_futures_tick_request.py +0 -0
  263. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_historical_bars_request.py +0 -0
  264. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_instruments_request.py +0 -0
  265. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_quotes_request.py +0 -0
  266. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_snapshot_request.py +0 -0
  267. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/get_tick_request.py +0 -0
  268. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/subscribe_request.py +0 -0
  269. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/data/request/unsubscribe_request.py +0 -0
  270. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/__init__.py +0 -0
  271. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/account_type.py +0 -0
  272. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/category.py +0 -0
  273. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/combo_ticker_type.py +0 -0
  274. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/combo_type.py +0 -0
  275. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/currency.py +0 -0
  276. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/forbid_reason.py +0 -0
  277. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/instrument_type.py +0 -0
  278. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/markets.py +0 -0
  279. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/order_entrust_type.py +0 -0
  280. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/order_side.py +0 -0
  281. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/order_status.py +0 -0
  282. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/order_tif.py +0 -0
  283. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/order_type.py +0 -0
  284. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/trade_policy.py +0 -0
  285. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/trading_date_type.py +0 -0
  286. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/common/trailing_type.py +0 -0
  287. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/__init__.py +0 -0
  288. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/default_retry_policy.py +0 -0
  289. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/events_pb2.py +0 -0
  290. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/events_pb2_grpc.py +0 -0
  291. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/signature_composer.py +0 -0
  292. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/events/types.py +0 -0
  293. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/__init__.py +0 -0
  294. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/cancel_order_request.py +0 -0
  295. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_account_balance_request.py +0 -0
  296. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_account_positions_request.py +0 -0
  297. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_account_profile_request.py +0 -0
  298. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_app_subscriptions.py +0 -0
  299. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_open_orders_request.py +0 -0
  300. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_order_detail_request.py +0 -0
  301. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_today_orders_request.py +0 -0
  302. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_trade_calendar_request.py +0 -0
  303. {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
  304. {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
  305. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/get_tradeable_instruments_request.py +0 -0
  306. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/palce_order_request.py +0 -0
  307. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/place_order_request.py +0 -0
  308. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/place_order_request_v2.py +0 -0
  309. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/replace_order_request.py +0 -0
  310. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/replace_order_request_v2.py +0 -0
  311. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/__init__.py +0 -0
  312. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/cancel_option_request.py +0 -0
  313. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/cancel_order_request.py +0 -0
  314. {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
  315. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/get_account_list.py +0 -0
  316. {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
  317. {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
  318. {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
  319. {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
  320. {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
  321. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/palce_order_request.py +0 -0
  322. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/place_option_request.py +0 -0
  323. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/place_order_request.py +0 -0
  324. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/preview_option_request.py +0 -0
  325. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/preview_order_request.py +0 -0
  326. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/replace_option_request.py +0 -0
  327. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v2/replace_order_request.py +0 -0
  328. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/__init__.py +0 -0
  329. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/cancel_order_request.py +0 -0
  330. {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
  331. {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
  332. {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
  333. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/place_order_request.py +0 -0
  334. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/preview_order_request.py +0 -0
  335. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/request/v3/replace_order_request.py +0 -0
  336. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/__init__.py +0 -0
  337. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/account_info.py +0 -0
  338. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/order_operation.py +0 -0
  339. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/trade_calendar.py +0 -0
  340. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/trade_instrument.py +0 -0
  341. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/v2/__init__.py +0 -0
  342. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/v2/account_info_v2.py +0 -0
  343. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/v2/order_operation_v2.py +0 -0
  344. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade/v3/__init__.py +0 -0
  345. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade_client.py +0 -0
  346. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull/trade/trade_events_client.py +0 -0
  347. {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
  348. {webull_openapi_python_sdk-1.0.6 → webull_openapi_python_sdk-1.0.8}/webull_openapi_python_sdk.egg-info/requires.txt +0 -0
  349. {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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: webull-openapi-python-sdk
3
- Version: 1.0.6
3
+ Version: 1.0.8
4
4
  Summary: Webull Python SDK.
5
5
  Home-page:
6
6
  Author: Webull
@@ -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
@@ -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())
@@ -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
 
@@ -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
 
@@ -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'
@@ -1,4 +1,4 @@
1
- __version__ = '1.0.6'
1
+ __version__ = '1.0.8'
2
2
 
3
3
  import logging
4
4
 
@@ -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)' \
@@ -62,7 +62,7 @@ class ClientInitializer:
62
62
  if not ClientInitializer._check_token_enable(api_client):
63
63
  return
64
64
 
65
- token_manager = TokenManager()
65
+ token_manager = TokenManager(api_client.get_token_dir())
66
66
  token_manager.init_token(api_client)
67
67
 
68
68
  @staticmethod
@@ -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
- dir_path = Path(self.CONF_ENV_TOKEN_DIR) if self.CONF_ENV_TOKEN_DIR else Path(self.DEFAULT_ENV_TOKEN_DIR)
56
- self.token_file_path = dir_path / self.TOKEN_FILE_NAME
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
@@ -0,0 +1,3 @@
1
+ # coding=utf-8
2
+
3
+ __version__ = '1.0.8'