architect-py 5.1.2__tar.gz → 5.1.4b1__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 (205) hide show
  1. {architect_py-5.1.2 → architect_py-5.1.4b1}/PKG-INFO +3 -3
  2. {architect_py-5.1.2 → architect_py-5.1.4b1}/README.md +1 -1
  3. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/__init__.py +1 -1
  4. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/async_client.py +45 -22
  5. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/client.py +11 -1
  6. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/client.pyi +6 -1
  7. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/client.py +13 -4
  8. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/SubscribeL1BookSnapshotsRequest.py +14 -1
  9. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/TickersRequest.py +4 -1
  10. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/definitions.py +1 -0
  11. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py.egg-info/PKG-INFO +3 -3
  12. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py.egg-info/SOURCES.txt +4 -1
  13. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py.egg-info/top_level.txt +1 -1
  14. {architect_py-5.1.2 → architect_py-5.1.4b1}/examples/book_subscription.py +1 -1
  15. {architect_py-5.1.2 → architect_py-5.1.4b1}/examples/candles.py +1 -1
  16. architect_py-5.1.2/examples/common.py → architect_py-5.1.4b1/examples/config.py +4 -48
  17. {architect_py-5.1.2 → architect_py-5.1.4b1}/examples/funding_rate_mean_reversion_algo.py +1 -1
  18. {architect_py-5.1.2 → architect_py-5.1.4b1}/examples/order_sending.py +1 -1
  19. architect_py-5.1.4b1/examples/orderflow_channel.py +56 -0
  20. architect_py-5.1.4b1/examples/orderflow_streaming.py +47 -0
  21. {architect_py-5.1.2 → architect_py-5.1.4b1}/examples/stream_l1_marketdata.py +1 -1
  22. {architect_py-5.1.2 → architect_py-5.1.4b1}/examples/stream_l2_marketdata.py +1 -1
  23. architect_py-5.1.4b1/examples/termutils.py +44 -0
  24. {architect_py-5.1.2 → architect_py-5.1.4b1}/examples/trades.py +1 -1
  25. {architect_py-5.1.2 → architect_py-5.1.4b1}/examples/tutorial_async.py +2 -1
  26. {architect_py-5.1.2 → architect_py-5.1.4b1}/examples/tutorial_sync.py +2 -1
  27. {architect_py-5.1.2 → architect_py-5.1.4b1}/pyproject.toml +3 -3
  28. {architect_py-5.1.2 → architect_py-5.1.4b1}/scripts/correct_sync_interface.py +5 -2
  29. {architect_py-5.1.2 → architect_py-5.1.4b1}/LICENSE +0 -0
  30. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/common_types/__init__.py +0 -0
  31. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/common_types/order_dir.py +0 -0
  32. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/common_types/time_in_force.py +0 -0
  33. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/common_types/tradable_product.py +0 -0
  34. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/__init__.py +0 -0
  35. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/base_model.py +0 -0
  36. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/client.py +0 -0
  37. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/enums.py +0 -0
  38. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/exceptions.py +0 -0
  39. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/fragments.py +0 -0
  40. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/get_execution_info_query.py +0 -0
  41. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/get_execution_infos_query.py +0 -0
  42. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/get_first_notice_date_query.py +0 -0
  43. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/get_future_series_query.py +0 -0
  44. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/get_product_info_query.py +0 -0
  45. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/get_product_infos_query.py +0 -0
  46. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/input_types.py +0 -0
  47. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/juniper_base_client.py +0 -0
  48. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/search_symbols_query.py +0 -0
  49. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/graphql_client/user_id_query.py +0 -0
  50. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/__init__.py +0 -0
  51. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Accounts/AccountsRequest.py +0 -0
  52. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Accounts/AccountsResponse.py +0 -0
  53. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Accounts/__init__.py +0 -0
  54. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/AlgoOrder.py +0 -0
  55. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/AlgoOrderRequest.py +0 -0
  56. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/AlgoOrdersRequest.py +0 -0
  57. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/AlgoOrdersResponse.py +0 -0
  58. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/CreateAlgoOrderRequest.py +0 -0
  59. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/PauseAlgoRequest.py +0 -0
  60. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/PauseAlgoResponse.py +0 -0
  61. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/StartAlgoRequest.py +0 -0
  62. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/StartAlgoResponse.py +0 -0
  63. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/StopAlgoRequest.py +0 -0
  64. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/StopAlgoResponse.py +0 -0
  65. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Algo/__init__.py +0 -0
  66. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Auth/CreateJwtRequest.py +0 -0
  67. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Auth/CreateJwtResponse.py +0 -0
  68. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Auth/__init__.py +0 -0
  69. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Boss/DepositsRequest.py +0 -0
  70. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Boss/DepositsResponse.py +0 -0
  71. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Boss/RqdAccountStatisticsRequest.py +0 -0
  72. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Boss/RqdAccountStatisticsResponse.py +0 -0
  73. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Boss/StatementUrlRequest.py +0 -0
  74. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Boss/StatementUrlResponse.py +0 -0
  75. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Boss/StatementsRequest.py +0 -0
  76. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Boss/StatementsResponse.py +0 -0
  77. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Boss/WithdrawalsRequest.py +0 -0
  78. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Boss/WithdrawalsResponse.py +0 -0
  79. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Boss/__init__.py +0 -0
  80. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Core/ConfigRequest.py +0 -0
  81. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Core/ConfigResponse.py +0 -0
  82. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Core/RestartCptyRequest.py +0 -0
  83. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Core/RestartCptyResponse.py +0 -0
  84. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Core/__init__.py +0 -0
  85. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Cpty/CptyRequest.py +0 -0
  86. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Cpty/CptyResponse.py +0 -0
  87. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Cpty/CptyStatus.py +0 -0
  88. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Cpty/CptyStatusRequest.py +0 -0
  89. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Cpty/CptysRequest.py +0 -0
  90. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Cpty/CptysResponse.py +0 -0
  91. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Cpty/__init__.py +0 -0
  92. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Folio/AccountHistoryRequest.py +0 -0
  93. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Folio/AccountHistoryResponse.py +0 -0
  94. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Folio/AccountSummariesRequest.py +0 -0
  95. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Folio/AccountSummariesResponse.py +0 -0
  96. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Folio/AccountSummary.py +0 -0
  97. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Folio/AccountSummaryRequest.py +0 -0
  98. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Folio/HistoricalFillsRequest.py +0 -0
  99. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Folio/HistoricalFillsResponse.py +0 -0
  100. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Folio/HistoricalOrdersRequest.py +0 -0
  101. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Folio/HistoricalOrdersResponse.py +0 -0
  102. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Folio/__init__.py +0 -0
  103. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Health/HealthCheckRequest.py +0 -0
  104. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Health/HealthCheckResponse.py +0 -0
  105. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Health/__init__.py +0 -0
  106. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/ArrayOfL1BookSnapshot.py +0 -0
  107. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/Candle.py +0 -0
  108. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/HistoricalCandlesRequest.py +0 -0
  109. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/HistoricalCandlesResponse.py +0 -0
  110. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/L1BookSnapshot.py +0 -0
  111. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/L1BookSnapshotRequest.py +0 -0
  112. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/L1BookSnapshotsRequest.py +0 -0
  113. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/L2BookSnapshot.py +0 -0
  114. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/L2BookSnapshotRequest.py +0 -0
  115. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/L2BookUpdate.py +0 -0
  116. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/Liquidation.py +0 -0
  117. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/MarketStatus.py +0 -0
  118. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/MarketStatusRequest.py +0 -0
  119. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/SubscribeCandlesRequest.py +0 -0
  120. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/SubscribeCurrentCandlesRequest.py +0 -0
  121. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/SubscribeL2BookUpdatesRequest.py +0 -0
  122. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/SubscribeLiquidationsRequest.py +0 -0
  123. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/SubscribeManyCandlesRequest.py +0 -0
  124. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/SubscribeTickersRequest.py +0 -0
  125. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/SubscribeTradesRequest.py +0 -0
  126. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/Ticker.py +0 -0
  127. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/TickerRequest.py +0 -0
  128. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/TickerUpdate.py +0 -0
  129. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/TickersResponse.py +0 -0
  130. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/Trade.py +0 -0
  131. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Marketdata/__init__.py +0 -0
  132. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Oms/Cancel.py +0 -0
  133. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Oms/CancelAllOrdersRequest.py +0 -0
  134. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Oms/CancelAllOrdersResponse.py +0 -0
  135. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Oms/CancelOrderRequest.py +0 -0
  136. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Oms/OpenOrdersRequest.py +0 -0
  137. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Oms/OpenOrdersResponse.py +0 -0
  138. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Oms/Order.py +0 -0
  139. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Oms/PendingCancelsRequest.py +0 -0
  140. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Oms/PendingCancelsResponse.py +0 -0
  141. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Oms/PlaceOrderRequest.py +0 -0
  142. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Oms/__init__.py +0 -0
  143. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/OptionsMarketdata/OptionsChain.py +0 -0
  144. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeks.py +0 -0
  145. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeksRequest.py +0 -0
  146. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/OptionsMarketdata/OptionsChainRequest.py +0 -0
  147. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/OptionsMarketdata/OptionsExpirations.py +0 -0
  148. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/OptionsMarketdata/OptionsExpirationsRequest.py +0 -0
  149. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/OptionsMarketdata/__init__.py +0 -0
  150. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Orderflow/Dropcopy.py +0 -0
  151. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Orderflow/DropcopyRequest.py +0 -0
  152. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Orderflow/Orderflow.py +0 -0
  153. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Orderflow/OrderflowRequest.py +0 -0
  154. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Orderflow/SubscribeOrderflowRequest.py +0 -0
  155. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Orderflow/__init__.py +0 -0
  156. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/DownloadProductCatalogRequest.py +0 -0
  157. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/DownloadProductCatalogResponse.py +0 -0
  158. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/ExecutionInfoRequest.py +0 -0
  159. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/ExecutionInfoResponse.py +0 -0
  160. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/PruneExpiredSymbolsRequest.py +0 -0
  161. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/PruneExpiredSymbolsResponse.py +0 -0
  162. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/SubscribeSymbology.py +0 -0
  163. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/SymbologyRequest.py +0 -0
  164. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/SymbologySnapshot.py +0 -0
  165. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/SymbologyUpdate.py +0 -0
  166. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/SymbolsRequest.py +0 -0
  167. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/SymbolsResponse.py +0 -0
  168. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/UploadProductCatalogRequest.py +0 -0
  169. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/UploadProductCatalogResponse.py +0 -0
  170. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/UploadSymbologyRequest.py +0 -0
  171. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/UploadSymbologyResponse.py +0 -0
  172. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/Symbology/__init__.py +0 -0
  173. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/models/__init__.py +0 -0
  174. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/resolve_endpoint.py +0 -0
  175. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/server.py +0 -0
  176. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/grpc/utils.py +0 -0
  177. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/tests/__init__.py +0 -0
  178. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/tests/conftest.py +0 -0
  179. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/tests/test_book_building.py +0 -0
  180. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/tests/test_encoding.py +0 -0
  181. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/tests/test_marketdata.py +0 -0
  182. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/tests/test_order_entry.py +0 -0
  183. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/tests/test_orderflow.py +0 -0
  184. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/tests/test_portfolio_management.py +0 -0
  185. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/tests/test_rounding.py +0 -0
  186. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/tests/test_symbology.py +0 -0
  187. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/tests/test_sync_client.py +0 -0
  188. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/utils/nearest_tick.py +0 -0
  189. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/utils/nearest_tick_2.py +0 -0
  190. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/utils/orderbook.py +0 -0
  191. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/utils/pandas.py +0 -0
  192. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/utils/price_bands.py +0 -0
  193. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py/utils/symbol_parsing.py +0 -0
  194. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py.egg-info/dependency_links.txt +0 -0
  195. {architect_py-5.1.2 → architect_py-5.1.4b1}/architect_py.egg-info/requires.txt +0 -0
  196. {architect_py-5.1.2 → architect_py-5.1.4b1}/examples/__init__.py +0 -0
  197. {architect_py-5.1.2 → architect_py-5.1.4b1}/examples/external_cpty.py +0 -0
  198. {architect_py-5.1.2 → architect_py-5.1.4b1}/scripts/add_imports_to_inits.py +0 -0
  199. {architect_py-5.1.2 → architect_py-5.1.4b1}/scripts/generate_functions_md.py +0 -0
  200. {architect_py-5.1.2 → architect_py-5.1.4b1}/scripts/postprocess_grpc.py +0 -0
  201. {architect_py-5.1.2 → architect_py-5.1.4b1}/scripts/preprocess_grpc_schema.py +0 -0
  202. {architect_py-5.1.2 → architect_py-5.1.4b1}/scripts/prune_graphql_schema.py +0 -0
  203. {architect_py-5.1.2 → architect_py-5.1.4b1}/setup.cfg +0 -0
  204. {architect_py-5.1.2 → architect_py-5.1.4b1}/templates/exceptions.py +0 -0
  205. {architect_py-5.1.2 → architect_py-5.1.4b1}/templates/juniper_base_client.py +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: architect-py
3
- Version: 5.1.2
3
+ Version: 5.1.4b1
4
4
  Summary: Python SDK for the Architect trading platform and brokerage.
5
5
  Author-email: "Architect Financial Technologies, Inc." <hello@architect.co>
6
6
  License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://www.architect.co/brokerage/overview
8
7
  Project-URL: Documentation, https://docs.architect.co
8
+ Project-URL: Homepage, https://www.architect.co/brokerage/overview
9
9
  Project-URL: Repository, https://github.com/architect-xyz/architect-py
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Operating System :: OS Independent
@@ -48,7 +48,7 @@ Go to [FUNCTIONS.md](FUNCTIONS.md) file to see a catalog of methods.
48
48
 
49
49
  ## Examples
50
50
 
51
- Go to the [Examples](./examples) to see examples of a variety of common use cases.
51
+ Go to the [Examples](./examples) to see examples of a variety of common use cases. To run a specific example, use e.g. `python -m examples.orderflow_streaming`.
52
52
 
53
53
  ## Documentation
54
54
 
@@ -23,7 +23,7 @@ Go to [FUNCTIONS.md](FUNCTIONS.md) file to see a catalog of methods.
23
23
 
24
24
  ## Examples
25
25
 
26
- Go to the [Examples](./examples) to see examples of a variety of common use cases.
26
+ Go to the [Examples](./examples) to see examples of a variety of common use cases. To run a specific example, use e.g. `python -m examples.orderflow_streaming`.
27
27
 
28
28
  ## Documentation
29
29
 
@@ -1,6 +1,6 @@
1
1
  # ruff: noqa:I001
2
2
 
3
- __version__ = "5.1.2"
3
+ __version__ = "5.1.4b1"
4
4
 
5
5
  from .utils.nearest_tick import TickRoundMethod
6
6
  from .async_client import AsyncClient
@@ -11,6 +11,7 @@ from typing import (
11
11
  Literal,
12
12
  Optional,
13
13
  Sequence,
14
+ Tuple,
14
15
  Union,
15
16
  overload,
16
17
  )
@@ -56,6 +57,7 @@ class AsyncClient:
56
57
  api_secret: Optional[str] = None
57
58
  paper_trading: bool
58
59
  graphql_client: GraphQLClient
60
+ grpc_options: Sequence[Tuple[str, Any]] | None = None
59
61
  grpc_core: Optional[GrpcClient] = None
60
62
  grpc_marketdata: dict[Venue, GrpcClient] = {}
61
63
  grpc_hmart: Optional[GrpcClient] = None
@@ -77,14 +79,22 @@ class AsyncClient:
77
79
  paper_trading: bool,
78
80
  endpoint: str = "https://app.architect.co",
79
81
  graphql_port: Optional[int] = None,
82
+ grpc_options: Sequence[Tuple[str, Any]] | None = None,
80
83
  **kwargs: Any,
81
84
  ) -> "AsyncClient":
82
85
  """
83
86
  Connect to an Architect installation.
84
87
 
85
- An `api_key` and `api_secret` can be created at https://app.architect.co/api-keys
88
+ An `api_key` and `api_secret` can be created at https://app.architect.co/api-keys.
86
89
 
87
90
  Raises ValueError if the API key and secret are not the correct length or contain invalid characters.
91
+
92
+ ## Advanced configuration
93
+
94
+ ### gRPC channel options
95
+
96
+ Use `grpc_options` to configure gRPC channels created by this client.
97
+ See https://grpc.github.io/grpc/python/glossary.html#term-channel_arguments for reference.
88
98
  """
89
99
  if paper_trading:
90
100
  COLOR = "\033[30;43m"
@@ -123,6 +133,7 @@ class AsyncClient:
123
133
  paper_trading=paper_trading,
124
134
  grpc_host=grpc_host,
125
135
  grpc_port=grpc_port,
136
+ grpc_options=grpc_options,
126
137
  graphql_port=graphql_port,
127
138
  use_ssl=use_ssl,
128
139
  _i_know_what_i_am_doing=True,
@@ -144,6 +155,7 @@ class AsyncClient:
144
155
  paper_trading: bool,
145
156
  grpc_host: str = "app.architect.co",
146
157
  grpc_port: int,
158
+ grpc_options: Sequence[Tuple[str, Any]] | None = None,
147
159
  graphql_port: Optional[int] = None,
148
160
  use_ssl: bool = True,
149
161
  _i_know_what_i_am_doing: bool = False,
@@ -179,7 +191,10 @@ class AsyncClient:
179
191
  api_key=api_key,
180
192
  api_secret=api_secret,
181
193
  )
182
- self.grpc_core = GrpcClient(host=grpc_host, port=grpc_port, use_ssl=use_ssl)
194
+ self.grpc_options = grpc_options
195
+ self.grpc_core = GrpcClient(
196
+ host=grpc_host, port=grpc_port, use_ssl=use_ssl, options=grpc_options
197
+ )
183
198
 
184
199
  async def close(self):
185
200
  """
@@ -268,7 +283,10 @@ class AsyncClient:
268
283
  use_ssl,
269
284
  )
270
285
  self.grpc_marketdata[venue] = GrpcClient(
271
- host=grpc_host, port=grpc_port, use_ssl=use_ssl
286
+ host=grpc_host,
287
+ port=grpc_port,
288
+ use_ssl=use_ssl,
289
+ options=self.grpc_options,
272
290
  )
273
291
  except Exception as e:
274
292
  logging.error("Failed to set marketdata endpoint: %s", e)
@@ -282,7 +300,10 @@ class AsyncClient:
282
300
  try:
283
301
  grpc_host, grpc_port, use_ssl = await resolve_endpoint(endpoint)
284
302
  self.grpc_marketdata[venue] = GrpcClient(
285
- host=grpc_host, port=grpc_port, use_ssl=use_ssl
303
+ host=grpc_host,
304
+ port=grpc_port,
305
+ use_ssl=use_ssl,
306
+ options=self.grpc_options,
286
307
  )
287
308
  logging.debug(
288
309
  f"Setting marketdata endpoint for {venue}: {grpc_host}:{grpc_port} use_ssl={use_ssl}"
@@ -315,7 +336,10 @@ class AsyncClient:
315
336
  use_ssl,
316
337
  )
317
338
  self.grpc_hmart = GrpcClient(
318
- host=grpc_host, port=grpc_port, use_ssl=use_ssl
339
+ host=grpc_host,
340
+ port=grpc_port,
341
+ use_ssl=use_ssl,
342
+ options=self.grpc_options,
319
343
  )
320
344
  except Exception as e:
321
345
  logging.error("Failed to set hmart endpoint: %s", e)
@@ -364,6 +388,17 @@ class AsyncClient:
364
388
  "as of v5.0.0: enable_orderflow is deprecated; orderflow is enabled by default"
365
389
  )
366
390
 
391
+ async def cpty_status(
392
+ self, kind: str, instance: Optional[str] = None
393
+ ) -> CptyStatus:
394
+ """
395
+ Get cpty status.
396
+ """
397
+ grpc_client = await self.core()
398
+ req = CptyStatusRequest(kind=kind, instance=instance)
399
+ res: CptyStatus = await grpc_client.unary_unary(req)
400
+ return res
401
+
367
402
  # ------------------------------------------------------------
368
403
  # Symbology
369
404
  # ------------------------------------------------------------
@@ -1382,28 +1417,16 @@ class AsyncClient:
1382
1417
 
1383
1418
  Example:
1384
1419
  ```python
1385
- async for of in client.stream_orderflow(account, execution_venue, trader):
1386
- print(of)
1420
+ async for event in client.stream_orderflow(account, execution_venue, trader):
1421
+ print(event)
1387
1422
  ```
1388
1423
  """
1389
1424
  grpc_client = await self.core()
1390
- request: SubscribeOrderflowRequest = SubscribeOrderflowRequest(
1425
+ req: SubscribeOrderflowRequest = SubscribeOrderflowRequest(
1391
1426
  account=account, execution_venue=execution_venue, trader=trader
1392
1427
  )
1393
- grpc_client = await self.core()
1394
- decoder = grpc_client.get_decoder(SubscribeOrderflowRequest)
1395
- stub: grpc.aio.UnaryStreamMultiCallable[
1396
- SubscribeOrderflowRequest, Orderflow
1397
- ] = grpc_client.channel.unary_stream(
1398
- SubscribeOrderflowRequest.get_route(),
1399
- request_serializer=grpc_client.encoder().encode,
1400
- response_deserializer=decoder.decode,
1401
- )
1402
- call: grpc.aio._base_call.UnaryStreamCall[
1403
- SubscribeOrderflowRequest, Orderflow
1404
- ] = stub(request, metadata=(("authorization", f"Bearer {grpc_client.jwt}"),))
1405
- async for update in call:
1406
- yield update
1428
+ async for res in grpc_client.unary_stream(req): # type: ignore
1429
+ yield res
1407
1430
 
1408
1431
  # ------------------------------------------------------------
1409
1432
  # Order entry
@@ -4,7 +4,15 @@ import threading
4
4
  from asyncio import AbstractEventLoop
5
5
  from collections.abc import Callable
6
6
  from functools import partial
7
- from typing import Any, Concatenate, Coroutine, Optional, ParamSpec, TypeVar
7
+ from typing import (
8
+ Any,
9
+ Concatenate,
10
+ Coroutine,
11
+ Optional,
12
+ ParamSpec,
13
+ Sequence,
14
+ TypeVar,
15
+ )
8
16
 
9
17
  from .async_client import AsyncClient
10
18
 
@@ -50,6 +58,7 @@ class Client:
50
58
  paper_trading: bool,
51
59
  endpoint: str = "https://app.architect.co",
52
60
  graphql_port: Optional[int] = None,
61
+ grpc_options: Sequence[tuple[str, Any]] | None = None,
53
62
  event_loop: Optional[AbstractEventLoop] = None,
54
63
  **kwargs,
55
64
  ):
@@ -78,6 +87,7 @@ class Client:
78
87
  paper_trading=paper_trading,
79
88
  endpoint=endpoint,
80
89
  graphql_port=graphql_port,
90
+ grpc_options=grpc_options,
81
91
  **kwargs,
82
92
  )
83
93
 
@@ -38,13 +38,14 @@ class Client:
38
38
  api_secret: str | None
39
39
  paper_trading: bool
40
40
  graphql_client: GraphQLClient
41
+ grpc_options: Sequence[tuple[str, Any]] | None
41
42
  grpc_core: GrpcClient | None
42
43
  grpc_marketdata: dict[Venue, GrpcClient]
43
44
  grpc_hmart: GrpcClient | None
44
45
  jwt: str | None
45
46
  jwt_expiration: datetime | None
46
47
  l1_books: dict[Venue, dict[TradableProduct, tuple[L1BookSnapshot, asyncio.Task]]]
47
- def __init__(self, *, api_key: str, api_secret: str, paper_trading: bool, endpoint: str = 'https://app.architect.co', graphql_port: int | None = None, event_loop: asyncio.events.AbstractEventLoop | None = None) -> None:
48
+ def __init__(self, *, api_key: str, api_secret: str, paper_trading: bool, endpoint: str = 'https://app.architect.co', graphql_port: int | None = None, grpc_options: Sequence[tuple[str, Any]] | None = None, event_loop: asyncio.events.AbstractEventLoop | None = None) -> None:
48
49
  """
49
50
  Create a new Client instance.
50
51
 
@@ -118,6 +119,10 @@ class Client:
118
119
  Returns:
119
120
  (user_id, user_email)
120
121
  """
122
+ def cpty_status(self, kind: str, instance: str | None = None) -> CptyStatus:
123
+ """
124
+ Get cpty status.
125
+ """
121
126
  def list_symbols(self, *, marketdata: Venue | None = None) -> list[str]:
122
127
  """
123
128
  List all symbols.
@@ -1,5 +1,5 @@
1
1
  from types import UnionType
2
- from typing import AsyncIterator
2
+ from typing import Any, AsyncIterator, Sequence, Tuple
3
3
 
4
4
  import grpc
5
5
  import msgspec
@@ -18,14 +18,23 @@ class GrpcClient:
18
18
  channel: grpc.aio.Channel
19
19
  jwt: str | None = None
20
20
 
21
- def __init__(self, *, host: str, port: int, use_ssl: bool = False):
21
+ def __init__(
22
+ self,
23
+ *,
24
+ host: str,
25
+ port: int,
26
+ use_ssl: bool = False,
27
+ options: Sequence[Tuple[str, Any]] | None = None,
28
+ ):
22
29
  scheme = "https" if use_ssl else "http"
23
30
  self.endpoint = f"{scheme}://{host}:{port}"
24
31
  if use_ssl:
25
32
  credentials = grpc.ssl_channel_credentials()
26
- self.channel = grpc.aio.secure_channel(f"{host}:{port}", credentials)
33
+ self.channel = grpc.aio.secure_channel(
34
+ f"{host}:{port}", credentials, options=options
35
+ )
27
36
  else:
28
- self.channel = grpc.aio.insecure_channel(f"{host}:{port}")
37
+ self.channel = grpc.aio.insecure_channel(f"{host}:{port}", options=options)
29
38
 
30
39
  def set_jwt(self, jwt: str | None):
31
40
  self.jwt = jwt
@@ -10,6 +10,17 @@ from msgspec import Meta, Struct
10
10
 
11
11
 
12
12
  class SubscribeL1BookSnapshotsRequest(Struct, omit_defaults=True):
13
+ send_initial_snapshots: Optional[
14
+ Annotated[
15
+ bool,
16
+ Meta(
17
+ description="If true, send an initial snapshot to subscribers on symbol subscription"
18
+ ),
19
+ ]
20
+ ] = False
21
+ """
22
+ If true, send an initial snapshot to subscribers on symbol subscription
23
+ """
13
24
  symbols: Optional[
14
25
  Annotated[
15
26
  List[str],
@@ -25,16 +36,18 @@ class SubscribeL1BookSnapshotsRequest(Struct, omit_defaults=True):
25
36
  @classmethod
26
37
  def new(
27
38
  cls,
39
+ send_initial_snapshots: Optional[bool] = False,
28
40
  symbols: Optional[List[str]] = None,
29
41
  venue: Optional[str] = None,
30
42
  ):
31
43
  return cls(
44
+ send_initial_snapshots,
32
45
  symbols,
33
46
  venue,
34
47
  )
35
48
 
36
49
  def __str__(self) -> str:
37
- return f"SubscribeL1BookSnapshotsRequest(symbols={self.symbols},venue={self.venue})"
50
+ return f"SubscribeL1BookSnapshotsRequest(send_initial_snapshots={self.send_initial_snapshots},symbols={self.symbols},venue={self.venue})"
38
51
 
39
52
  @staticmethod
40
53
  def get_response_type():
@@ -13,6 +13,7 @@ from .. import definitions
13
13
 
14
14
  class TickersRequest(Struct, omit_defaults=True):
15
15
  i: Optional[Annotated[Optional[int], Meta(title="offset")]] = None
16
+ include_options: Optional[bool] = None
16
17
  k: Optional[
17
18
  Annotated[Optional[definitions.SortTickersBy], Meta(title="sort_by")]
18
19
  ] = None
@@ -25,6 +26,7 @@ class TickersRequest(Struct, omit_defaults=True):
25
26
  def new(
26
27
  cls,
27
28
  offset: Optional[int] = None,
29
+ include_options: Optional[bool] = None,
28
30
  sort_by: Optional[definitions.SortTickersBy] = None,
29
31
  limit: Optional[int] = None,
30
32
  symbols: Optional[List[str]] = None,
@@ -32,6 +34,7 @@ class TickersRequest(Struct, omit_defaults=True):
32
34
  ):
33
35
  return cls(
34
36
  offset,
37
+ include_options,
35
38
  sort_by,
36
39
  limit,
37
40
  symbols,
@@ -39,7 +42,7 @@ class TickersRequest(Struct, omit_defaults=True):
39
42
  )
40
43
 
41
44
  def __str__(self) -> str:
42
- return f"TickersRequest(offset={self.i},sort_by={self.k},limit={self.n},symbols={self.symbols},venue={self.venue})"
45
+ return f"TickersRequest(offset={self.i},include_options={self.include_options},sort_by={self.k},limit={self.n},symbols={self.symbols},venue={self.venue})"
43
46
 
44
47
  @property
45
48
  def offset(self) -> Optional[int]:
@@ -454,6 +454,7 @@ class OrderRejectReason(str, Enum):
454
454
  InsufficientCash = "InsufficientCash"
455
455
  InsufficientMargin = "InsufficientMargin"
456
456
  NotEasyToBorrow = "NotEasyToBorrow"
457
+ InvalidOrder = "InvalidOrder"
457
458
  Unknown = "Unknown"
458
459
 
459
460
 
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: architect-py
3
- Version: 5.1.2
3
+ Version: 5.1.4b1
4
4
  Summary: Python SDK for the Architect trading platform and brokerage.
5
5
  Author-email: "Architect Financial Technologies, Inc." <hello@architect.co>
6
6
  License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://www.architect.co/brokerage/overview
8
7
  Project-URL: Documentation, https://docs.architect.co
8
+ Project-URL: Homepage, https://www.architect.co/brokerage/overview
9
9
  Project-URL: Repository, https://github.com/architect-xyz/architect-py
10
10
  Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Operating System :: OS Independent
@@ -48,7 +48,7 @@ Go to [FUNCTIONS.md](FUNCTIONS.md) file to see a catalog of methods.
48
48
 
49
49
  ## Examples
50
50
 
51
- Go to the [Examples](./examples) to see examples of a variety of common use cases.
51
+ Go to the [Examples](./examples) to see examples of a variety of common use cases. To run a specific example, use e.g. `python -m examples.orderflow_streaming`.
52
52
 
53
53
  ## Documentation
54
54
 
@@ -181,12 +181,15 @@ architect_py/utils/symbol_parsing.py
181
181
  examples/__init__.py
182
182
  examples/book_subscription.py
183
183
  examples/candles.py
184
- examples/common.py
184
+ examples/config.py
185
185
  examples/external_cpty.py
186
186
  examples/funding_rate_mean_reversion_algo.py
187
187
  examples/order_sending.py
188
+ examples/orderflow_channel.py
189
+ examples/orderflow_streaming.py
188
190
  examples/stream_l1_marketdata.py
189
191
  examples/stream_l2_marketdata.py
192
+ examples/termutils.py
190
193
  examples/trades.py
191
194
  examples/tutorial_async.py
192
195
  examples/tutorial_sync.py
@@ -1,6 +1,6 @@
1
1
  architect_py
2
2
  dist
3
3
  examples
4
- ipynb
4
+ htmlcov
5
5
  scripts
6
6
  templates
@@ -6,7 +6,7 @@ from pydantic import ValidationError
6
6
  from architect_py import AsyncClient, TradableProduct
7
7
  from architect_py.graphql_client.exceptions import GraphQLClientHttpError
8
8
 
9
- from .common import connect_async_client
9
+ from .config import connect_async_client
10
10
 
11
11
  buy_columns = "{:>15} {:>15} {:>15}"
12
12
  sell_columns = "{:<15} {:<15} {:<15}"
@@ -3,7 +3,7 @@ import asyncio
3
3
  from architect_py import AsyncClient, CandleWidth, TradableProduct
4
4
  from architect_py.graphql_client.exceptions import GraphQLClientHttpError
5
5
 
6
- from .common import connect_async_client
6
+ from .config import connect_async_client
7
7
 
8
8
 
9
9
  async def main():
@@ -16,15 +16,17 @@ class Config:
16
16
 
17
17
  def load_config() -> Config:
18
18
  loaded = load_dotenv()
19
+
19
20
  if not loaded:
20
21
  raise ValueError(
21
- "⚠️ .env file not found or had no new variables\n"
22
- "Please create a .env file with the following variables:\n"
22
+ "⚠️ .env file not found or had no new variables\n\n"
23
+ "Please create a .env file with the following variables:\n\n"
23
24
  "ARCHITECT_ENDPOINT=your_endpoint (e.g. app.architect.co)\n"
24
25
  "ARCHITECT_API_KEY=your_api_key (get from https://app.architect.co/user/account)\n"
25
26
  "ARCHITECT_API_SECRET=your_api_secret\n"
26
27
  "ARCHITECT_PAPER_TRADING=true/false\n"
27
28
  )
29
+
28
30
  endpoint = os.environ["ARCHITECT_ENDPOINT"]
29
31
  api_key = os.getenv("ARCHITECT_API_KEY")
30
32
  api_secret = os.getenv("ARCHITECT_API_SECRET")
@@ -49,7 +51,6 @@ def load_config() -> Config:
49
51
 
50
52
  def connect_client():
51
53
  config = load_config()
52
-
53
54
  c = Client(
54
55
  endpoint=config.endpoint,
55
56
  api_key=config.api_key,
@@ -68,48 +69,3 @@ async def connect_async_client():
68
69
  paper_trading=config.paper_trading,
69
70
  )
70
71
  return c
71
-
72
-
73
- buy_columns = "{:>15} {:>15} {:>15}"
74
- sell_columns = "{:<15} {:<15} {:<15}"
75
- green = "\033[32m"
76
- red = "\033[31m"
77
- normal = "\033[0m"
78
-
79
-
80
- def print_book(book):
81
- print(
82
- (buy_columns + " " + sell_columns).format(
83
- "Total", "Size", "Bid", "Ask", "Size", "Total"
84
- )
85
- )
86
- for i in range(min(20, len(book.bids), len(book.asks))):
87
- b = book.bids[i]
88
- s = book.asks[i]
89
- print(
90
- (green + buy_columns).format(b.total, b.amount, b.price),
91
- (red + sell_columns).format(s.price, s.amount, s.total),
92
- )
93
- print(normal)
94
-
95
-
96
- def print_open_orders(orders):
97
- if len(orders) == 0:
98
- print("No open orders")
99
- else:
100
- for o in orders:
101
- print(
102
- f" • {o.order.market.name} {o.order.dir} {o.order.quantity} {o.order.order_type.limit_price}"
103
- )
104
-
105
-
106
- def confirm(prompt: str):
107
- """
108
- Ask user to enter Y or N (case-insensitive).
109
- :return: True if the answer is Y.
110
- :rtype: bool
111
- """
112
- answer = ""
113
- while answer not in ["y", "n"]:
114
- answer = input(f"{prompt} [Y/N]? ").lower()
115
- return answer == "y"
@@ -24,7 +24,7 @@ from architect_py.grpc.models.Orderflow.OrderflowRequest import (
24
24
  PlaceOrder,
25
25
  )
26
26
 
27
- from .common import connect_async_client
27
+ from .config import connect_async_client
28
28
 
29
29
  venue = "BINANCE"
30
30
  product = "BTC-USDT Perpetual"
@@ -4,7 +4,7 @@ from datetime import datetime, timedelta, timezone
4
4
  from decimal import Decimal
5
5
 
6
6
  from architect_py import AsyncClient, OrderDir, OrderType, TimeInForce, TradableProduct
7
- from examples.common import connect_async_client
7
+ from examples.config import connect_async_client
8
8
 
9
9
  LOGGER = logging.getLogger(__name__)
10
10
 
@@ -0,0 +1,56 @@
1
+ # """
2
+ # Example of using a bidirectional orderflow channel with the Architect OEMS.
3
+
4
+ # This connection style is ~equivalent to having a websocket.
5
+
6
+ # This code example sends a series of orders to Architect while concurrently
7
+ # listening to orderflow events. Compare to `examples/orderflow_streaming.py`,
8
+ # which accomplishes the same thing but using a separate asyncio task.
9
+ # """
10
+
11
+ # import asyncio
12
+ # from decimal import Decimal
13
+
14
+ # from architect_py import AsyncClient, OrderDir, PlaceOrderRequest
15
+ # from architect_py.grpc.models.Orderflow.OrderflowRequest import PlaceOrder
16
+
17
+ # from .config import connect_async_client
18
+
19
+
20
+ # async def send_orders(client: AsyncClient):
21
+ # symbol = await client.get_front_future("ES CME Futures")
22
+ # print(f"symbol={symbol}")
23
+
24
+ # while True:
25
+ # await asyncio.sleep(1)
26
+ # snap = await client.get_l1_book_snapshot(symbol, "CME")
27
+ # if snap.best_ask is not None:
28
+ # limit_price = snap.best_ask[0]
29
+ # print(f"\nPlacing buy order at {limit_price}\n")
30
+ # try:
31
+ # req = PlaceOrderRequest.new(
32
+ # symbol=symbol,
33
+ # execution_venue="CME",
34
+ # dir=OrderDir.BUY,
35
+ # quantity=Decimal(1),
36
+ # limit_price=limit_price,
37
+ # post_only=True,
38
+ # time_in_force="DAY",
39
+ # order_type="LIMIT",
40
+ # )
41
+ # print(f"req={req}")
42
+ # yield PlaceOrder(req)
43
+ # except Exception as e:
44
+ # print(f"Error placing order: {e}")
45
+ # else:
46
+ # print("\nNo ask price from snapshot, doing nothing\n")
47
+
48
+
49
+ # async def main():
50
+ # client = await connect_async_client()
51
+
52
+ # async for event in client.orderflow(send_orders(client)):
53
+ # print(f" --> {event}")
54
+
55
+
56
+ # asyncio.run(main())
@@ -0,0 +1,47 @@
1
+ """
2
+ Example of streaming orderflow events from the Architect OEMS.
3
+
4
+ This code example sends a series of orders to Architect in one asyncio
5
+ task, while concurrently listening to orderflow events in another.
6
+ """
7
+
8
+ import asyncio
9
+ from decimal import Decimal
10
+
11
+ from architect_py import AsyncClient, OrderDir
12
+
13
+ from .config import connect_async_client
14
+
15
+
16
+ async def send_orders(client: AsyncClient):
17
+ symbol = await client.get_front_future("ES CME Futures")
18
+ print(f"symbol={symbol}")
19
+
20
+ while True:
21
+ await asyncio.sleep(1)
22
+ snap = await client.get_l1_book_snapshot(symbol, "CME")
23
+ if snap.best_ask is not None:
24
+ limit_price = snap.best_ask[0]
25
+ print(f"\nPlacing buy order at {limit_price}\n")
26
+ await client.place_limit_order(
27
+ symbol=symbol,
28
+ execution_venue="CME",
29
+ dir=OrderDir.BUY,
30
+ quantity=Decimal(1),
31
+ limit_price=limit_price,
32
+ post_only=True,
33
+ )
34
+ else:
35
+ print("\nNo ask price from snapshot, doing nothing\n")
36
+
37
+
38
+ async def main():
39
+ client = await connect_async_client()
40
+
41
+ asyncio.create_task(send_orders(client))
42
+
43
+ async for event in client.stream_orderflow():
44
+ print(f" --> {event}")
45
+
46
+
47
+ asyncio.run(main())
@@ -2,7 +2,7 @@ import asyncio
2
2
 
3
3
  from architect_py import AsyncClient, TradableProduct
4
4
 
5
- from .common import connect_async_client
5
+ from .config import connect_async_client
6
6
 
7
7
 
8
8
  async def main():
@@ -2,7 +2,7 @@ import asyncio
2
2
 
3
3
  from architect_py import AsyncClient, TradableProduct
4
4
 
5
- from .common import connect_async_client
5
+ from .config import connect_async_client
6
6
 
7
7
  buy_columns = "{:>15} {:>15}"
8
8
  sell_columns = "{:<15} {:<15}"