architect-py 3.2.2__py3-none-any.whl → 5.0.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. architect_py/__init__.py +18 -2
  2. architect_py/async_client.py +1069 -647
  3. architect_py/client.py +25 -26
  4. architect_py/client_interface.py +63 -0
  5. architect_py/common_types/__init__.py +6 -0
  6. architect_py/common_types/order_dir.py +91 -0
  7. architect_py/common_types/scalars.py +25 -0
  8. architect_py/common_types/tradable_product.py +59 -0
  9. architect_py/graphql_client/__init__.py +2 -0
  10. architect_py/graphql_client/client.py +3 -6
  11. architect_py/graphql_client/enums.py +5 -0
  12. architect_py/graphql_client/fragments.py +3 -6
  13. architect_py/graphql_client/get_fills_query.py +2 -1
  14. architect_py/graphql_client/search_symbols_query.py +2 -1
  15. architect_py/graphql_client/subscribe_orderflow.py +2 -1
  16. architect_py/graphql_client/subscribe_trades.py +2 -1
  17. architect_py/grpc/__init__.py +145 -0
  18. architect_py/grpc/client.py +94 -0
  19. architect_py/{grpc_client → grpc/models}/Accounts/AccountsRequest.py +6 -3
  20. architect_py/{grpc_client → grpc/models}/Accounts/AccountsResponse.py +1 -1
  21. architect_py/{grpc_client → grpc/models}/Accounts/__init__.py +1 -1
  22. architect_py/grpc/models/Algo/AlgoOrder.py +114 -0
  23. architect_py/grpc/models/Algo/AlgoOrderRequest.py +46 -0
  24. architect_py/grpc/models/Algo/AlgoOrdersRequest.py +72 -0
  25. architect_py/grpc/models/Algo/AlgoOrdersResponse.py +27 -0
  26. architect_py/grpc/models/Algo/CreateAlgoOrderRequest.py +56 -0
  27. architect_py/grpc/models/Algo/PauseAlgoRequest.py +42 -0
  28. architect_py/grpc/models/Algo/PauseAlgoResponse.py +20 -0
  29. architect_py/grpc/models/Algo/StartAlgoRequest.py +42 -0
  30. architect_py/grpc/models/Algo/StartAlgoResponse.py +20 -0
  31. architect_py/grpc/models/Algo/StopAlgoRequest.py +42 -0
  32. architect_py/grpc/models/Algo/StopAlgoResponse.py +20 -0
  33. architect_py/{grpc_client → grpc/models}/Algo/__init__.py +1 -1
  34. architect_py/grpc/models/Auth/CreateJwtRequest.py +47 -0
  35. architect_py/grpc/models/Auth/CreateJwtResponse.py +23 -0
  36. architect_py/{grpc_client/Cpty → grpc/models/Auth}/__init__.py +1 -1
  37. architect_py/grpc/models/Boss/DepositsRequest.py +40 -0
  38. architect_py/grpc/models/Boss/DepositsResponse.py +27 -0
  39. architect_py/grpc/models/Boss/RqdAccountStatisticsRequest.py +42 -0
  40. architect_py/grpc/models/Boss/RqdAccountStatisticsResponse.py +25 -0
  41. architect_py/grpc/models/Boss/StatementUrlRequest.py +40 -0
  42. architect_py/grpc/models/Boss/StatementUrlResponse.py +23 -0
  43. architect_py/grpc/models/Boss/StatementsRequest.py +40 -0
  44. architect_py/grpc/models/Boss/StatementsResponse.py +27 -0
  45. architect_py/grpc/models/Boss/WithdrawalsRequest.py +40 -0
  46. architect_py/grpc/models/Boss/WithdrawalsResponse.py +27 -0
  47. architect_py/{grpc_client/Folio → grpc/models/Boss}/__init__.py +1 -1
  48. architect_py/grpc/models/Core/ConfigRequest.py +37 -0
  49. architect_py/grpc/models/Core/ConfigResponse.py +25 -0
  50. architect_py/grpc/models/Core/__init__.py +2 -0
  51. architect_py/{grpc_client → grpc/models}/Cpty/CptyRequest.py +2 -2
  52. architect_py/{grpc_client → grpc/models}/Cpty/CptyResponse.py +3 -3
  53. architect_py/{grpc_client → grpc/models}/Cpty/CptyStatus.py +1 -1
  54. architect_py/{grpc_client → grpc/models}/Cpty/CptyStatusRequest.py +2 -2
  55. architect_py/{grpc_client → grpc/models}/Cpty/CptysRequest.py +2 -2
  56. architect_py/{grpc_client → grpc/models}/Cpty/CptysResponse.py +1 -1
  57. architect_py/grpc/models/Cpty/__init__.py +2 -0
  58. architect_py/{grpc_client → grpc/models}/Folio/AccountHistoryRequest.py +2 -2
  59. architect_py/{grpc_client → grpc/models}/Folio/AccountHistoryResponse.py +1 -1
  60. architect_py/{grpc_client → grpc/models}/Folio/AccountSummariesRequest.py +2 -2
  61. architect_py/{grpc_client → grpc/models}/Folio/AccountSummariesResponse.py +1 -1
  62. architect_py/{grpc_client → grpc/models}/Folio/AccountSummary.py +1 -1
  63. architect_py/{grpc_client → grpc/models}/Folio/AccountSummaryRequest.py +2 -2
  64. architect_py/{grpc_client → grpc/models}/Folio/HistoricalFillsRequest.py +7 -4
  65. architect_py/{grpc_client → grpc/models}/Folio/HistoricalFillsResponse.py +1 -1
  66. architect_py/{grpc_client → grpc/models}/Folio/HistoricalOrdersRequest.py +3 -3
  67. architect_py/{grpc_client → grpc/models}/Folio/HistoricalOrdersResponse.py +1 -1
  68. architect_py/grpc/models/Folio/__init__.py +2 -0
  69. architect_py/{grpc_client → grpc/models}/Health/HealthCheckRequest.py +2 -2
  70. architect_py/{grpc_client → grpc/models}/Health/HealthCheckResponse.py +1 -1
  71. architect_py/grpc/models/Health/__init__.py +2 -0
  72. architect_py/{grpc_client → grpc/models}/Marketdata/Candle.py +1 -1
  73. architect_py/{grpc_client → grpc/models}/Marketdata/HistoricalCandlesRequest.py +11 -8
  74. architect_py/{grpc_client → grpc/models}/Marketdata/HistoricalCandlesResponse.py +1 -1
  75. architect_py/{grpc_client → grpc/models}/Marketdata/L1BookSnapshot.py +52 -5
  76. architect_py/{grpc_client → grpc/models}/Marketdata/L1BookSnapshotRequest.py +8 -3
  77. architect_py/{grpc_client → grpc/models}/Marketdata/L1BookSnapshotsRequest.py +6 -3
  78. architect_py/{grpc_client → grpc/models}/Marketdata/L2BookSnapshot.py +1 -1
  79. architect_py/{grpc_client → grpc/models}/Marketdata/L2BookSnapshotRequest.py +2 -2
  80. architect_py/{grpc_client → grpc/models}/Marketdata/Liquidation.py +2 -2
  81. architect_py/{grpc_client → grpc/models}/Marketdata/MarketStatus.py +1 -1
  82. architect_py/{grpc_client → grpc/models}/Marketdata/MarketStatusRequest.py +2 -2
  83. architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeCandlesRequest.py +2 -2
  84. architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeCurrentCandlesRequest.py +3 -4
  85. architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeL1BookSnapshotsRequest.py +6 -3
  86. architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeL2BookUpdatesRequest.py +2 -2
  87. architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeLiquidationsRequest.py +2 -2
  88. architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeManyCandlesRequest.py +2 -2
  89. architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeTickersRequest.py +2 -2
  90. architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeTradesRequest.py +2 -2
  91. architect_py/{grpc_client → grpc/models}/Marketdata/Ticker.py +1 -1
  92. architect_py/{grpc_client → grpc/models}/Marketdata/TickerRequest.py +2 -2
  93. architect_py/{grpc_client → grpc/models}/Marketdata/TickersRequest.py +2 -2
  94. architect_py/{grpc_client → grpc/models}/Marketdata/TickersResponse.py +1 -1
  95. architect_py/{grpc_client → grpc/models}/Marketdata/Trade.py +2 -2
  96. architect_py/grpc/models/Marketdata/__init__.py +2 -0
  97. architect_py/grpc/models/Oms/Cancel.py +90 -0
  98. architect_py/{grpc_client → grpc/models}/Oms/CancelAllOrdersRequest.py +2 -2
  99. architect_py/{grpc_client → grpc/models}/Oms/CancelAllOrdersResponse.py +1 -1
  100. architect_py/{grpc_client → grpc/models}/Oms/CancelOrderRequest.py +2 -2
  101. architect_py/{grpc_client → grpc/models}/Oms/OpenOrdersRequest.py +2 -2
  102. architect_py/{grpc_client → grpc/models}/Oms/OpenOrdersResponse.py +1 -1
  103. architect_py/{grpc_client → grpc/models}/Oms/Order.py +6 -13
  104. architect_py/{grpc_client → grpc/models}/Oms/PendingCancelsRequest.py +2 -2
  105. architect_py/{grpc_client → grpc/models}/Oms/PendingCancelsResponse.py +1 -1
  106. architect_py/{grpc_client → grpc/models}/Oms/PlaceOrderRequest.py +16 -23
  107. architect_py/grpc/models/Oms/__init__.py +2 -0
  108. architect_py/grpc/models/OptionsMarketdata/OptionsChain.py +30 -0
  109. architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeks.py +30 -0
  110. architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeksRequest.py +47 -0
  111. architect_py/grpc/models/OptionsMarketdata/OptionsChainRequest.py +45 -0
  112. architect_py/grpc/models/OptionsMarketdata/OptionsExpirations.py +29 -0
  113. architect_py/grpc/models/OptionsMarketdata/OptionsExpirationsRequest.py +42 -0
  114. architect_py/grpc/models/OptionsMarketdata/__init__.py +2 -0
  115. architect_py/{grpc_client → grpc/models}/Orderflow/DropcopyRequest.py +2 -2
  116. architect_py/{grpc_client → grpc/models}/Orderflow/OrderflowRequest.py +1 -1
  117. architect_py/{grpc_client → grpc/models}/Orderflow/SubscribeOrderflowRequest.py +2 -2
  118. architect_py/grpc/models/Orderflow/__init__.py +2 -0
  119. architect_py/grpc/models/Symbology/DownloadProductCatalogRequest.py +42 -0
  120. architect_py/grpc/models/Symbology/DownloadProductCatalogResponse.py +27 -0
  121. architect_py/grpc/models/Symbology/ExecutionInfoRequest.py +47 -0
  122. architect_py/grpc/models/Symbology/ExecutionInfoResponse.py +27 -0
  123. architect_py/{grpc_client → grpc/models}/Symbology/PruneExpiredSymbolsRequest.py +2 -2
  124. architect_py/{grpc_client → grpc/models}/Symbology/PruneExpiredSymbolsResponse.py +1 -1
  125. architect_py/{grpc_client → grpc/models}/Symbology/SubscribeSymbology.py +1 -1
  126. architect_py/{grpc_client → grpc/models}/Symbology/SymbologyRequest.py +2 -2
  127. architect_py/{grpc_client → grpc/models}/Symbology/SymbologySnapshot.py +7 -2
  128. architect_py/{grpc_client → grpc/models}/Symbology/SymbologyUpdate.py +9 -2
  129. architect_py/{grpc_client → grpc/models}/Symbology/SymbolsRequest.py +2 -2
  130. architect_py/{grpc_client → grpc/models}/Symbology/SymbolsResponse.py +1 -1
  131. architect_py/grpc/models/Symbology/UploadProductCatalogRequest.py +49 -0
  132. architect_py/grpc/models/Symbology/UploadProductCatalogResponse.py +20 -0
  133. architect_py/{grpc_client → grpc/models}/Symbology/UploadSymbologyRequest.py +2 -2
  134. architect_py/{grpc_client → grpc/models}/Symbology/UploadSymbologyResponse.py +1 -1
  135. architect_py/grpc/models/Symbology/__init__.py +2 -0
  136. architect_py/grpc/models/__init__.py +2 -0
  137. architect_py/{grpc_client → grpc/models}/definitions.py +690 -841
  138. architect_py/grpc/resolve_endpoint.py +70 -0
  139. architect_py/{grpc_client/grpc_server.py → grpc/server.py} +9 -6
  140. architect_py/grpc/utils.py +32 -0
  141. architect_py/internal_utils/__init__.py +0 -0
  142. architect_py/internal_utils/no_pandas.py +3 -0
  143. architect_py/tests/conftest.py +91 -87
  144. architect_py/tests/test_book_building.py +49 -50
  145. architect_py/tests/test_marketdata.py +168 -0
  146. architect_py/tests/test_order_entry.py +37 -0
  147. architect_py/tests/test_orderflow.py +41 -0
  148. architect_py/tests/test_portfolio_management.py +23 -0
  149. architect_py/tests/test_rounding.py +28 -28
  150. architect_py/tests/test_symbology.py +37 -30
  151. architect_py/utils/nearest_tick.py +2 -5
  152. architect_py/utils/nearest_tick_2.py +1 -2
  153. architect_py/utils/orderbook.py +35 -0
  154. architect_py/utils/pandas.py +44 -0
  155. architect_py/utils/price_bands.py +0 -3
  156. architect_py/utils/symbol_parsing.py +29 -0
  157. architect_py-5.0.0.dist-info/METADATA +54 -0
  158. architect_py-5.0.0.dist-info/RECORD +214 -0
  159. {architect_py-3.2.2.dist-info → architect_py-5.0.0.dist-info}/WHEEL +2 -1
  160. architect_py-5.0.0.dist-info/top_level.txt +4 -0
  161. examples/__init__.py +0 -0
  162. examples/book_subscription.py +52 -0
  163. examples/candles.py +30 -0
  164. examples/common.py +116 -0
  165. examples/external_cpty.py +77 -0
  166. examples/funding_rate_mean_reversion_algo.py +186 -0
  167. examples/order_sending.py +91 -0
  168. examples/stream_l1_marketdata.py +25 -0
  169. examples/stream_l2_marketdata.py +38 -0
  170. examples/trades.py +21 -0
  171. examples/tutorial_async.py +86 -0
  172. examples/tutorial_sync.py +95 -0
  173. scripts/generate_functions_md.py +166 -0
  174. scripts/generate_sync_interface.py +226 -0
  175. scripts/postprocess_grpc.py +604 -0
  176. scripts/preprocess_grpc_schema.py +708 -0
  177. templates/exceptions.py +83 -0
  178. templates/juniper_base_client.py +371 -0
  179. architect_py/client_protocol.py +0 -53
  180. architect_py/grpc_client/Algo/AlgoOrderForTwapAlgo.py +0 -61
  181. architect_py/grpc_client/Algo/CreateAlgoOrderRequestForTwapAlgo.py +0 -59
  182. architect_py/grpc_client/Algo/ModifyAlgoOrderRequestForTwapAlgo.py +0 -45
  183. architect_py/grpc_client/Health/__init__.py +0 -2
  184. architect_py/grpc_client/Marketdata/__init__.py +0 -2
  185. architect_py/grpc_client/Oms/Cancel.py +0 -42
  186. architect_py/grpc_client/Oms/__init__.py +0 -2
  187. architect_py/grpc_client/Orderflow/__init__.py +0 -2
  188. architect_py/grpc_client/Symbology/__init__.py +0 -2
  189. architect_py/grpc_client/__init__.py +0 -2
  190. architect_py/grpc_client/grpc_client.py +0 -413
  191. architect_py/scalars.py +0 -172
  192. architect_py/tests/test_accounts.py +0 -31
  193. architect_py/tests/test_client.py +0 -29
  194. architect_py/tests/test_grpc_client.py +0 -30
  195. architect_py/tests/test_order_sending.py +0 -65
  196. architect_py/tests/test_snapshots.py +0 -52
  197. architect_py/tests/test_subscriptions.py +0 -126
  198. architect_py-3.2.2.dist-info/METADATA +0 -191
  199. architect_py-3.2.2.dist-info/RECORD +0 -148
  200. /architect_py/{grpc_client → grpc/models}/Marketdata/ArrayOfL1BookSnapshot.py +0 -0
  201. /architect_py/{grpc_client → grpc/models}/Marketdata/L2BookUpdate.py +0 -0
  202. /architect_py/{grpc_client → grpc/models}/Marketdata/TickerUpdate.py +0 -0
  203. /architect_py/{grpc_client → grpc/models}/Orderflow/Dropcopy.py +0 -0
  204. /architect_py/{grpc_client → grpc/models}/Orderflow/Orderflow.py +0 -0
  205. {architect_py-3.2.2.dist-info → architect_py-5.0.0.dist-info/licenses}/LICENSE +0 -0
@@ -1,30 +0,0 @@
1
- import pytest
2
-
3
- from architect_py.async_client import AsyncClient
4
- from architect_py.scalars import TradableProduct
5
-
6
-
7
- @pytest.mark.asyncio
8
- async def test_grpc(async_client: AsyncClient, front_ES_future: str):
9
-
10
- endpoint = "binance.marketdata.architect.co"
11
- endpoint = "bybit.marketdata.architect.co"
12
- endpoint = "binance-futures-usd-m.marketdata.architect.co"
13
- endpoint = "cme.marketdata.architect.co"
14
-
15
- tp = TradableProduct(front_ES_future, "USD")
16
- snapshot = await async_client.grpc_client.request_l2_book_snapshot("CME", tp)
17
- assert snapshot is not None
18
-
19
- snapshot = await async_client.grpc_client.request_l1_book_snapshot(tp)
20
- assert snapshot is not None
21
-
22
- i = 0
23
- async for update in await async_client.grpc_client.subscribe_l1_books_stream(
24
- [front_ES_future]
25
- ):
26
- assert update is not None
27
- if i == 100:
28
- break
29
- i += 1
30
- return True
@@ -1,65 +0,0 @@
1
- import asyncio
2
- from decimal import Decimal
3
-
4
- import pytest
5
-
6
- from architect_py.async_client import AsyncClient, OrderDir
7
- from architect_py.scalars import TradableProduct
8
- from architect_py.utils.nearest_tick_2 import TickRoundMethod
9
-
10
-
11
- @pytest.mark.asyncio
12
- @pytest.mark.timeout(3)
13
- async def test_live_far_order_cancel(async_client: AsyncClient, front_ES_future: str):
14
- """
15
- Places a bid order far below best bid, waits for placement, then should successfully cancel order
16
- """
17
- venue = "CME"
18
- tp = TradableProduct(front_ES_future, "USD")
19
-
20
- # Get snapshot
21
- execution_info = await async_client.get_execution_info(tp, venue)
22
- assert (
23
- execution_info is not None
24
- ), f"execution_info does not exist for {tp}, {venue}"
25
-
26
- assert execution_info.min_order_quantity is not None
27
- assert execution_info.tick_size is not None
28
-
29
- snapshot = await async_client.get_market_snapshot(tp, venue)
30
- assert snapshot is not None, f"Snapshot does not exist for {tp} at venue {venue}"
31
-
32
- min_qty = Decimal(execution_info.min_order_quantity)
33
-
34
- if bid_price := snapshot.bid_price:
35
- far_price = bid_price * Decimal("0.9")
36
- else:
37
- raise ValueError(f"No bid price in snapshot for {tp} at venue {venue}")
38
- limit_price = TickRoundMethod.FLOOR(far_price, execution_info.tick_size)
39
-
40
- accounts = await async_client.list_accounts()
41
-
42
- account = accounts[0]
43
- print(account)
44
-
45
- # Make a very cheap bid
46
- order = await async_client.send_limit_order(
47
- symbol=tp,
48
- odir=OrderDir.BUY,
49
- execution_venue=venue,
50
- quantity=min_qty,
51
- limit_price=limit_price,
52
- account=str(account.account.id),
53
- )
54
-
55
- assert order is not None
56
-
57
- await asyncio.sleep(1)
58
-
59
- order_query = await async_client.get_order(order.id)
60
- if order_query is None:
61
- raise ValueError("Order is None")
62
- else:
63
- if order_query.reject_reason is None and order_query.reject_message is None:
64
- cancel = await async_client.cancel_order(order.id)
65
- assert cancel
@@ -1,52 +0,0 @@
1
- import pytest
2
-
3
- from architect_py.async_client import AsyncClient
4
- from architect_py.scalars import TradableProduct
5
-
6
- from pytest_lazy_fixtures import lf
7
-
8
-
9
- @pytest.mark.asyncio
10
- @pytest.mark.parametrize(
11
- "symbol,venue",
12
- [
13
- (lf("front_ES_future"), "CME"),
14
- # (
15
- # "BTC-USDT BINANCE Perpetual/USDT Crypto*BINANCE-FUTURES-USD-M/DIRECT",
16
- # "BINANCE",
17
- # ),
18
- # (
19
- # "BTC-USDT BYBIT Perpetual/USDT Crypto*BYBIT/DIRECT",
20
- # "BYBIT",
21
- # ),
22
- ],
23
- )
24
- async def test_l2_snapshot(async_client: AsyncClient, symbol: str, venue: str):
25
- tp = TradableProduct(symbol, "USD")
26
-
27
- market_status = await async_client.get_market_status(tp, venue)
28
- if not market_status.is_trading:
29
- pytest.skip("market is not trading")
30
-
31
- snap = await async_client.get_l2_book_snapshot(
32
- tp,
33
- venue,
34
- )
35
- assert snap is not None, "snapshot should not be None"
36
-
37
-
38
- @pytest.mark.asyncio
39
- @pytest.mark.timeout(3)
40
- async def test_marketdata_snapshots(async_client: AsyncClient, front_ES_future: str):
41
- venue = "CME"
42
-
43
- market = TradableProduct(front_ES_future, "USD")
44
- market_status = await async_client.get_market_status(market, venue)
45
-
46
- if not market_status.is_trading:
47
- pytest.skip("market is not trading")
48
-
49
- snap = await async_client.get_market_snapshot(
50
- symbol=TradableProduct(market), venue="CME"
51
- )
52
- assert snap is not None, "snapshot should not be None"
@@ -1,126 +0,0 @@
1
- import asyncio
2
- from datetime import datetime
3
- import pytest
4
- from architect_py.async_client import AsyncClient
5
- from architect_py.scalars import TradableProduct
6
-
7
- from zoneinfo import ZoneInfo
8
-
9
- from pytest_lazy_fixtures import lf
10
-
11
-
12
- @pytest.mark.asyncio
13
- @pytest.mark.timeout(10)
14
- @pytest.mark.parametrize(
15
- "endpoint,symbol,venue",
16
- [
17
- ("cme.marketdata.architect.co", lf("front_ES_future_tp"), "CME"),
18
- # (
19
- # "https://usdm.binance.marketdata.architect.co",
20
- # "BTC-USDT BINANCE Perpetual/USDT Crypto",
21
- # "BINANCE",
22
- # ),
23
- # (
24
- # "https://bybit.marketdata.architect.co",
25
- # "BTC-USDT BYBIT Perpetual/USDT Crypto",
26
- # "BYBIT",
27
- # ),
28
- ],
29
- )
30
- @pytest.mark.asyncio
31
- async def test_subscribe_l1_stream(
32
- async_client: AsyncClient,
33
- endpoint: str,
34
- symbol: str,
35
- venue: str,
36
- ):
37
- tp = TradableProduct(symbol)
38
-
39
- await async_client.grpc_client.change_channel(endpoint)
40
-
41
- market_status = await async_client.get_market_status(tp, venue)
42
- if not market_status.is_trading:
43
- pytest.skip("market is not trading")
44
-
45
- symbols = [tp]
46
-
47
- [l1_book] = await async_client.subscribe_l1_book(symbols)
48
-
49
- i = 0
50
- async for snap in async_client.subscribe_l1_book_stream(symbols, venue):
51
- assert snap.best_bid is not None, f"{symbol} should always be bid"
52
- assert snap.best_ask is not None, f"{symbol} should always be offered"
53
- assert snap.best_bid[0] > 1_000, f"{symbol} should be > $1000"
54
- assert snap.best_ask[0] < 10_000_000, f"{symbol} should be < $10000000"
55
- i += 1
56
- if i > 5:
57
- break
58
-
59
- if l1_book.timestamp == 0:
60
- raise ValueError(f"Timestamp should be increasing {l1_book}")
61
-
62
-
63
- @pytest.mark.asyncio
64
- @pytest.mark.timeout(10)
65
- @pytest.mark.parametrize(
66
- "endpoint,symbol,venue",
67
- [
68
- ("cme.marketdata.architect.co", lf("front_ES_future_tp"), "CME"),
69
- # (
70
- # "https://usdm.binance.marketdata.architect.co",
71
- # "BTC-USDT BINANCE Perpetual/USDT Crypto",
72
- # "BINANCE",
73
- # ),
74
- # (
75
- # "https://bybit.marketdata.architect.co",
76
- # "BTC-USDT BYBIT Perpetual/USDT Crypto",
77
- # "BYBIT",
78
- # ),
79
- ],
80
- )
81
- @pytest.mark.asyncio
82
- @pytest.mark.timeout(10)
83
- async def test_subscribe_l2_stream(
84
- async_client: AsyncClient, endpoint: str, symbol: str, venue: str
85
- ):
86
- tp = TradableProduct(symbol)
87
-
88
- market_status = await async_client.get_market_status(tp, venue)
89
- if not market_status.is_trading:
90
- pytest.skip("market is not trading")
91
-
92
- l2_book = await async_client.subscribe_l2_book(tp, venue)
93
- ts = l2_book.timestamp
94
-
95
- i = 0
96
- async for snap in async_client.grpc_client.subscribe_l2_books_stream(
97
- symbol=tp, venue=venue
98
- ):
99
- assert snap is not None
100
- if i > 5:
101
- break
102
- i += 1
103
- await asyncio.sleep(1)
104
-
105
- if ts >= l2_book.timestamp:
106
- raise ValueError(f"Timestamp should be increasing {l2_book}")
107
-
108
-
109
- @pytest.mark.asyncio
110
- @pytest.mark.timeout(15)
111
- async def test_subscribe_cme_trades(async_client: AsyncClient, front_ES_future_tp: str):
112
- venue = "CME"
113
- market = TradableProduct(front_ES_future_tp)
114
- market_status = await async_client.get_market_status(market, venue)
115
-
116
- if not market_status.is_trading:
117
- pytest.skip("market is not trading")
118
- elif not 9 <= datetime.now(ZoneInfo("America/Chicago")).hour < 17:
119
- pytest.skip("market is not liquid")
120
-
121
- i = 0
122
- async for trade in async_client.subscribe_trades_stream(market, venue):
123
- assert trade is not None, "trade from stream was None"
124
- if i > 3:
125
- break
126
- i += 1
@@ -1,191 +0,0 @@
1
- Metadata-Version: 2.3
2
- Name: architect-py
3
- Version: 3.2.2
4
- Summary: Client library for the Architect trading platform.
5
- Author: Architect Financial Technologies, Inc.
6
- Author-email: hello@architect.xyz
7
- Requires-Python: >=3.10,<4
8
- Classifier: Development Status :: 3 - Alpha
9
- Classifier: License :: OSI Approved :: Apache Software License
10
- Classifier: Operating System :: OS Independent
11
- Classifier: Programming Language :: Python :: 3
12
- Classifier: Programming Language :: Python :: 3.10
13
- Classifier: Programming Language :: Python :: 3.11
14
- Classifier: Programming Language :: Python :: 3.12
15
- Classifier: Programming Language :: Python :: 3.13
16
- Requires-Dist: asyncio (>=3)
17
- Requires-Dist: dnspython (>=2.0)
18
- Requires-Dist: gql[httpx] (>=3.5.0,<4.0.0)
19
- Requires-Dist: grpcio (>=1.66.1)
20
- Requires-Dist: msgspec (>=0.19,<0.20)
21
- Requires-Dist: pydantic (>=2.10,<3.0)
22
- Requires-Dist: websockets (>=11)
23
- Description-Content-Type: text/markdown
24
-
25
- # [![Architect](https://avatars.githubusercontent.com/u/116864654?s=29&v=2)](https://architect.co) architect_py
26
- [![PyPI version](https://img.shields.io/pypi/v/architect-py.svg)](https://pypi.org/project/architect-py/)
27
-
28
- A Python API for [Architect](https://architect.co).
29
-
30
- Just some of the features of this API:
31
- symbology, market snapshots, past trades, account queries, order management (including sending advanced algos!), and market feed subscriptions.
32
-
33
- This repo heavily uses type hinting, so using a type checker such as Pylance or mypy is suggestible to reduce potential for error.
34
-
35
-
36
- ## Example usage
37
-
38
- `AsyncClient` and `Client` are the entryways into making calls to the Architect backend.
39
- Note that the sync `Client` does not have access to any subscription functions, because they are async by nature.
40
-
41
-
42
- ```python
43
- import asyncio
44
-
45
- from architect_py.async_client import AsyncClient
46
- from architect_py.scalars import TradableProduct
47
-
48
- async def main():
49
- c = await AsyncClient.connect(
50
- host="<your installation domain>", # e.g. app.architect.co for the brokerage
51
- api_key="<api key>",
52
- api_secret="<api secret>"
53
- paper_trading=True,
54
- )
55
- print(await c.who_am_i())
56
-
57
- series = await async_client.get_cme_futures_series("ES CME Futures")
58
- front_ES_future = series[0][1]
59
-
60
- s = c.subscribe_trades_stream(front_ES_future)
61
- async for trade in s:
62
- print(trade)
63
-
64
- asyncio.run(main())
65
- ```
66
-
67
- ```python
68
- from architect_py.client import Client
69
-
70
- def main():
71
- c = Client(
72
- host="<your installation domain>",
73
- api_key="<api key>",
74
- api_secret="<api secret>"
75
- paper_trading=True,
76
- )
77
- print(c.who_am_i())
78
-
79
- print(client.get_account_summaries())
80
-
81
- print(client.search_symbols("ES"))
82
- ```
83
-
84
- While the AsyncClient is the recommended way to use the Architect API, the Client instead without any familiarity with `async/await`.
85
- The sync clients and async clients usage is identical, except one removes the `await` before the call. The only exception to this is that the sync client does not support any subscriptions, because they are inherently asynchronous.
86
-
87
- Check the `examples` folder or the `architect_py/tests` folders for example usages.
88
-
89
-
90
- ## Function Breakdown
91
-
92
-
93
- The `async` client has the following functions
94
-
95
- ### 🚀 Initialization
96
-
97
- - **`connect`**: The main way to create an AsyncClient object.
98
- - **`__init__`**: Users should not be using this constructor directly, unless they do not want to use any subscription methods.
99
-
100
- ---
101
-
102
- ### 🔍 Symbology
103
-
104
- - **`search_symbols`**: Search for symbols in the Architect database.
105
- - **`get_product_info`**: Get the product information (product_type, underlying, multiplier, etc.) for a symbol.
106
- - **`get_product_infos`**: Get the product information (product_type, underlying, multiplier, etc.) for a list of symbols.
107
- - **`get_execution_info`**: Get the execution information (tick_size, step_size, margin, etc.) for a symbol.
108
- - **`get_execution_infos`**: Get the execution information (tick_size, step_size, etc.) for a list of symbols.
109
- - **`get_cme_first_notice_date`**: Get the first notice date for a CME future.
110
- - **`get_future_series`**: Get the series of futures for a given series symbol.
111
- - **`get_expiration_from_CME_name`**: Get the expiration date from a CME future name.
112
- - **`get_cme_futures_series`**: Get the futures in a series from the CME.
113
- - **`get_cme_future_from_root_month_year`**: Get the symbol for a CME future from the root, month, and year.
114
-
115
- ---
116
-
117
- ### 👤 Account Management
118
-
119
- - **`who_am_i`**: Gets the user_id and user_email for the user that the API key belongs to.
120
- - **`list_accounts`**: List accounts for the user that the API key belongs to.
121
- - **`get_account_summary`**: Gets the account summary for the given account.
122
- - **`get_account_summaries`**: Gets the account summaries for the given accounts and trader.
123
- - **`get_account_history`**: Gets the account history for the given account and dates.
124
-
125
- ---
126
-
127
- ### 📑 Order Management
128
-
129
- - **`get_open_orders`**: Returns a list of open orders for the user that match the filters.
130
- - **`get_all_open_orders`**: Returns a list of all open orders for the user.
131
- - **`get_historical_orders`**: Gets the historical orders that match the filters.
132
- - **`get_order`**: Returns the OrderFields object for the specified order.
133
- - **`get_orders`**: Returns a list of OrderFields objects for the specified orders.
134
- - **`get_fills`**: Returns a list of fills for the given filters.
135
-
136
- ---
137
-
138
- ### 📈 Market Data
139
-
140
- - **`get_market_status`**: Returns market status for symbol (ie if it is quoting and trading).
141
- - **`get_market_snapshot`**: This is an alias for l1_book_snapshot.
142
- - **`get_market_snapshots`**: This is an alias for l1_book_snapshot.
143
- - **`get_historical_candles`**: Gets the historical candles for a symbol.
144
- - **`get_l1_book_snapshot`**: Gets the L1 book snapshot for a symbol.
145
- - **`get_l1_book_snapshots`**: Gets the L1 book snapshots for a list of symbols.
146
- - **`get_l2_book_snapshot`**: Gets the L2 book snapshot for a symbol.
147
- - **`subscribe_l1_book_stream`**: Subscribe to the stream of L1BookSnapshots for a symbol.
148
- - **`subscribe_l2_book_stream`**: Subscribe to the stream of L2BookUpdates for a symbol.
149
- - **`subscribe_l1_book`**: Returns a L1BookSnapshot object that is constantly updating in the background.
150
- - **`subscribe_l2_book`**: Returns a L2BookSnapshot object that is constantly updating in the background.
151
- - **`subscribe_trades_stream`**: Subscribe to a stream of trades for a symbol.
152
- - **`subscribe_candles_stream`**: Subscribe to a stream of candles for a symbol.
153
-
154
- ---
155
-
156
- ### 📝 Order Entry and Cancellation
157
-
158
- - **`send_limit_order`**: Sends a regular limit order.
159
- - **`send_market_pro_order`**: Sends a market-order like limit price based on the BBO.
160
- - **`cancel_order`**: Cancels an order by order id.
161
- - **`cancel_all_orders`**: Cancels all open orders.
162
-
163
-
164
- ### Running examples from this package
165
-
166
- Clone this repository to run examples in the `examples` directory. This package
167
- uses poetry for dependency management. To enter a poetry virtual environment, make
168
- sure you have [poetry](https://python-poetry.org/docs/) installed and run the
169
- following from the repository root.
170
-
171
- ```bash
172
- poetry shell
173
- poetry install --sync
174
-
175
- export ARCHITECT_HOST="<your installation domain>"
176
- export ARCHITECT_API_KEY="<api key>"
177
- export ARCHITECT_API_SECRET="<api secret>"
178
-
179
- python -m examples.trades
180
- ```
181
-
182
- You can exit the poetry shell by running `exit`. Environment variables set
183
- within the shell are not persisted.
184
-
185
-
186
- ## API keys for the brokerage
187
-
188
- API keys/secrets for the brokerage can be generated on the [user account page](https://app.architect.co/user/account).
189
-
190
-
191
-
@@ -1,148 +0,0 @@
1
- architect_py/__init__.py,sha256=CGBtXmnPoqtLM61z3z8lsS6Lw1khL2xwgyf2BeNo9J8,98
2
- architect_py/async_client.py,sha256=coQJ12Y_mvphqnQ6yxNynLS7YYl4FjfBiH66Q8OMX18,41944
3
- architect_py/client.py,sha256=re5TBQnjniEUnXMrpO9-Hj8V6cP4KpczTOqXdZGxFOg,5663
4
- architect_py/client_protocol.py,sha256=iII5v9pSm4mG6rikgOYQpDeN6WcH5oENDjGlWmHql90,4904
5
- architect_py/graphql_client/__init__.py,sha256=HscnI0xDeyLY2SveYrtDPJyA4Qir1sfoHC1JxuHWQZE,8955
6
- architect_py/graphql_client/base_model.py,sha256=o2d-DixASFCGztr3rTiGX0AwgFu7Awr7EgD70FI8a-I,620
7
- architect_py/graphql_client/cancel_all_orders_mutation.py,sha256=h8S_lUy7rdSu1UgcUloiX2CCnuPIDaPCmfL2X2MOq8Y,352
8
- architect_py/graphql_client/cancel_order_mutation.py,sha256=FGCNrbLFmPXAYQ1vmpGC44viu2K2lZSCtXiO3O214ic,499
9
- architect_py/graphql_client/client.py,sha256=2BFPLLPmLZ5FU4Oj4zzWqaMoUfmnqEq3RwVU9jg3nek,43190
10
- architect_py/graphql_client/create_jwt.py,sha256=PiiOOjGnHLXro8AU7FSu_vQA_adEK1iZM6XAzHpJP5E,285
11
- architect_py/graphql_client/enums.py,sha256=FRcMJma0Rgjh9FY_gGGcXuuezAPy69yqFaXr4ZQwOZE,1468
12
- architect_py/graphql_client/exceptions.py,sha256=OQu-ZYCCV4VyMWTd1HR8gIjIK2CrA_JMlFxqOAJugWY,2411
13
- architect_py/graphql_client/fragments.py,sha256=bE-4W31jjwkiJCxsw2_PhE-YKBaifV-atwIfgiMYqwI,6398
14
- architect_py/graphql_client/get_account_history_query.py,sha256=eRx07b_vAroTOMvIxnigtSguQ3GmGBL8l8veS-ABRAM,605
15
- architect_py/graphql_client/get_account_query.py,sha256=l3eUIFkWJXxDWDKmqltJC3qT0UcOlO4BPMRJZ24El8M,478
16
- architect_py/graphql_client/get_account_summaries_query.py,sha256=3ZKIvNFqb4xLOLYuMg4Z4ZGQGZAd7W31yBIyqgKkhbA,627
17
- architect_py/graphql_client/get_account_summary_query.py,sha256=15MgJMzNG8mmDd1-NFZK65E8vvR6LoMRe_5wwRBuXnE,574
18
- architect_py/graphql_client/get_candle_snapshot_query.py,sha256=KjY1gCkfVTIJ-JXmHc2CzHgi9LB51w66Lvc0qHZ-Bok,633
19
- architect_py/graphql_client/get_execution_info_query.py,sha256=SFrCAAI3nBOezy0uz7VViWcyLlDgfWjbjdR66-lqSF8,585
20
- architect_py/graphql_client/get_execution_infos_query.py,sha256=fa5_sVw2xghrZiX8uSDx5rPbbV4wW_XpE5LxeaTID78,627
21
- architect_py/graphql_client/get_fills_query.py,sha256=ICu8pJM_Ezfl0EBGRZG5MJzFlibkGJqJBCOjryqhfjs,2242
22
- architect_py/graphql_client/get_first_notice_date_query.py,sha256=YT9nzW0GihGwr3eQ1_NULnb68RezVnT3xUnQNYcDTn0,665
23
- architect_py/graphql_client/get_future_series_query.py,sha256=pRfdJ31gW2bxYotmXvll6PtwFz8K6eNAZSo3DYBj1jI,383
24
- architect_py/graphql_client/get_historical_orders_query.py,sha256=FwxWPICnnfvdcQ7zftOLiROWOvaCrBLEibtaLsG_bnk,609
25
- architect_py/graphql_client/get_l_1_book_snapshot_query.py,sha256=UVfuPb7Rw62S5xwyS2Z8ynpNzY8WKroEmyCcFQ-HUWg,501
26
- architect_py/graphql_client/get_l_1_book_snapshots_query.py,sha256=CejehYMtqbibcat8pO8CICZo3Vhl1N1zRaiPaJWMhVw,542
27
- architect_py/graphql_client/get_l_2_book_snapshot_query.py,sha256=paAIdFw-YWZEFrbD1YdidzgTIyYHuG3AUmxEn3x8oOM,590
28
- architect_py/graphql_client/get_market_status_query.py,sha256=0O5KqC1kgbB5uHqESmZ505ORE5SZdCZT7h2kI0riEVY,578
29
- architect_py/graphql_client/get_open_orders_query.py,sha256=23Qk_RwXrDK8Ub_r-ma3N_YYwm_FWnVjv7QKuVuZE5Y,517
30
- architect_py/graphql_client/get_product_info_query.py,sha256=oxDDx3J2jGSnNXQZw-lDHdzZO33XCOC0hpNSofjqKQ0,598
31
- architect_py/graphql_client/get_product_infos_query.py,sha256=vZImiKh19LCG0yKiw9aP9y1lnUgxgywW7whj1FeSnGk,601
32
- architect_py/graphql_client/input_types.py,sha256=6Obe-vvDm4TDgH3oRZUzbEvkbquaQOHYRK_62B1_0FA,57
33
- architect_py/graphql_client/juniper_base_client.py,sha256=njikUx3G2PLqYmx6PGhT_EHALUwD9EHlI2o4W1XMnMk,12609
34
- architect_py/graphql_client/list_accounts_query.py,sha256=C-CpCZfbIfrT_4KJbvQlLIRKQb2DWGQCNWYFJy-K87g,487
35
- architect_py/graphql_client/place_order_mutation.py,sha256=KG45qNafDPvbuy3gfrBtre1zdLanam_gBKMmdf6GtFs,486
36
- architect_py/graphql_client/search_symbols_query.py,sha256=3YFDNoFmci-dGMuYQBoQpElqMqE16uRvBF3QKgwBaDQ,555
37
- architect_py/graphql_client/subscribe_candles.py,sha256=IWc1Rjs8aAPR4nDhDe_IzMYRVjdSSy5k7MpvSsTIH6w,295
38
- architect_py/graphql_client/subscribe_orderflow.py,sha256=5iB5nKa1YGFB8FfEdxKd8eGvKpyBm9LINGMQg_ZMhek,3350
39
- architect_py/graphql_client/subscribe_trades.py,sha256=XNIG5a0FaDPskHyDbV6WB75i5VhJP1wLrZ8xZ_LEiLM,602
40
- architect_py/graphql_client/user_email_query.py,sha256=KDFLFfLW5YtAptBm6CMQ_dVpcuEBofv4XlaYkW-VmcA,305
41
- architect_py/graphql_client/user_id_query.py,sha256=tWKJJLgEINzd8e7rYlGklQCnwcwHzYFpCGQvhxQGX20,334
42
- architect_py/grpc_client/Accounts/AccountsRequest.py,sha256=bxnUHm9VuyCWxMj5HzWnplIF5Vf_XTL5kxu54j1dDRk,1424
43
- architect_py/grpc_client/Accounts/AccountsResponse.py,sha256=UMK3OkB6wE50z_sXeFGzCW9mJIbVt75uWoSy3mHd218,647
44
- architect_py/grpc_client/Accounts/__init__.py,sha256=PdhPxuRZD3EWWUOG4cnz3WqTKn7jOOBeUZ_BzeELbNc,67
45
- architect_py/grpc_client/Algo/AlgoOrderForTwapAlgo.py,sha256=0wy8x1SdmtakFwLccFxmXwfqEK1ZqrTGFRdxibOwm-k,2073
46
- architect_py/grpc_client/Algo/CreateAlgoOrderRequestForTwapAlgo.py,sha256=Xl0yzCYMRITPb13HUFSpGJL_DwUSNxE0LTF8lPTHcS4,1809
47
- architect_py/grpc_client/Algo/ModifyAlgoOrderRequestForTwapAlgo.py,sha256=qZ_osRuqnbrWprDmjA7I6hw7r1dmuMvDdAhYZ6bthyM,1205
48
- architect_py/grpc_client/Algo/__init__.py,sha256=PdhPxuRZD3EWWUOG4cnz3WqTKn7jOOBeUZ_BzeELbNc,67
49
- architect_py/grpc_client/Cpty/CptyRequest.py,sha256=2ZaPHL0MsnN28Oo5dwBboG-pY-rJWm5HaSTRR2XeK_0,1722
50
- architect_py/grpc_client/Cpty/CptyResponse.py,sha256=ro0pyU3J8G4pMx9SxAkJIzYj3L5l4Q273fflCi7OiYM,2898
51
- architect_py/grpc_client/Cpty/CptyStatus.py,sha256=ZsuFuj761n82HCIX1x5ptA9J13u-FtaQwYKdsmgurC8,1434
52
- architect_py/grpc_client/Cpty/CptyStatusRequest.py,sha256=PvDplhmzZPNcuy2OBH2BfHG109xsCrCpW_kLq5j-THg,1038
53
- architect_py/grpc_client/Cpty/CptysRequest.py,sha256=Yo1vebJZkv52B-w2ABkxmwXCT_d-PplDktHzdBvxlwM,812
54
- architect_py/grpc_client/Cpty/CptysResponse.py,sha256=x6xRw14sfDY3vsBMQbOy9xQiAS-JcHrtYWHeIRG34bU,579
55
- architect_py/grpc_client/Cpty/__init__.py,sha256=PdhPxuRZD3EWWUOG4cnz3WqTKn7jOOBeUZ_BzeELbNc,67
56
- architect_py/grpc_client/Folio/AccountHistoryRequest.py,sha256=kvzs3IewDe5XKnntqrNEx1dm1NCehdgE-wOoDFtvq0Q,1418
57
- architect_py/grpc_client/Folio/AccountHistoryResponse.py,sha256=YXjoM4yoJSVV9sC514hfNscVnSk46yWV39bAAvkV_Wg,633
58
- architect_py/grpc_client/Folio/AccountSummariesRequest.py,sha256=ZSOxFC9yErHj-iCTazb77J5m0C9zFowwMd2ozBJGags,1606
59
- architect_py/grpc_client/Folio/AccountSummariesResponse.py,sha256=bdkgXndmG06q94bkJRVsmJSqBTODMcOUqf6fcniufWA,689
60
- architect_py/grpc_client/Folio/AccountSummary.py,sha256=6-vpF_rTCDQyo5yRcrecIS6Lpdr6Fw8L3fUyI4joapU,3644
61
- architect_py/grpc_client/Folio/AccountSummaryRequest.py,sha256=an_dgK-vupkKJvDtm8bNtPJP-7eETXn9H03gAHkj590,1013
62
- architect_py/grpc_client/Folio/HistoricalFillsRequest.py,sha256=cKkipWnPYcK9d_YZa3Z5A0ymOV00--qzC9ryOvzZKmU,2146
63
- architect_py/grpc_client/Folio/HistoricalFillsResponse.py,sha256=Wtds3tCbX_7XnkLgH_77Qns0PXKptMww1wop1VUZVJY,786
64
- architect_py/grpc_client/Folio/HistoricalOrdersRequest.py,sha256=_4KhbT5D_C-f6_oIs0q_AmRMkNog_kSedGcQyT867b0,2575
65
- architect_py/grpc_client/Folio/HistoricalOrdersResponse.py,sha256=44X3M7PGcEOZLFUcXSJ6U5lzGzJArUlyXygCCFxbNa0,603
66
- architect_py/grpc_client/Folio/__init__.py,sha256=PdhPxuRZD3EWWUOG4cnz3WqTKn7jOOBeUZ_BzeELbNc,67
67
- architect_py/grpc_client/Health/HealthCheckRequest.py,sha256=TDW71w8jvNF4U-sZmtdcA_r49xlfzVpkggtUhHKX7BY,1804
68
- architect_py/grpc_client/Health/HealthCheckResponse.py,sha256=7fQQfNGTn4xXBofWE94uUf9NJfJ22ICUTtplOG4mVWI,766
69
- architect_py/grpc_client/Health/__init__.py,sha256=PdhPxuRZD3EWWUOG4cnz3WqTKn7jOOBeUZ_BzeELbNc,67
70
- architect_py/grpc_client/Marketdata/ArrayOfL1BookSnapshot.py,sha256=Os13kKncZgwoCqrorTspvcj8EO7u4Xr3fNQV8mWONFM,329
71
- architect_py/grpc_client/Marketdata/Candle.py,sha256=W1ErJf7_Elf3o3voNYT4zOGwGkJ3Aqjob12iWxShA7E,8270
72
- architect_py/grpc_client/Marketdata/HistoricalCandlesRequest.py,sha256=TV0Lti-oOxZN7W-Mg0KvDOShKf4Eo-4Nol5x6cwa-xI,1425
73
- architect_py/grpc_client/Marketdata/HistoricalCandlesResponse.py,sha256=i6Ena2a572ywWAyMLq0R3RPdxQkwZTNCqw7FJN9az1Q,615
74
- architect_py/grpc_client/Marketdata/L1BookSnapshot.py,sha256=tH2gVk9TEL3o0l-rO__FhGyhqieI64qYgf1JeSa0zY0,2320
75
- architect_py/grpc_client/Marketdata/L1BookSnapshotRequest.py,sha256=TQeCKRNDfz_sQoeIEDQf3uhsdNHd0LVab6chkTRj9oY,947
76
- architect_py/grpc_client/Marketdata/L1BookSnapshotsRequest.py,sha256=1BfZd83R_ewDezjO8HHmte9T4Z8f_4yP0ZT-cmD1yYY,1093
77
- architect_py/grpc_client/Marketdata/L2BookSnapshot.py,sha256=dP4SnEK9HLYRbVg6zQjIbsfjZ3PIO7lGmQfnXPGkZ6k,2583
78
- architect_py/grpc_client/Marketdata/L2BookSnapshotRequest.py,sha256=Wc4MAVYWDKFn6oObpqxsndnnw7ntv2Uaw5LyeHwK11A,1083
79
- architect_py/grpc_client/Marketdata/L2BookUpdate.py,sha256=i-kWdJZvAoYEI280TfC3sTH46VIpMoj8N2UxWAkTDLs,2602
80
- architect_py/grpc_client/Marketdata/Liquidation.py,sha256=spPYu2QormVQRhFsjR2Ua1CFWEMY-9izebD8EUnn_ng,2453
81
- architect_py/grpc_client/Marketdata/MarketStatus.py,sha256=wyfjynbsqN-raeKKJDFU-xf7Qtv89TptzHzIs0V-2Aw,988
82
- architect_py/grpc_client/Marketdata/MarketStatusRequest.py,sha256=EBDYuz32PYbG9ARpFe7DV1LYK0Rmsfufn3wHTTu0iT4,1067
83
- architect_py/grpc_client/Marketdata/SubscribeCandlesRequest.py,sha256=DzL_eb2hycqjm04fE22W8bRRWD9CeevoKKvcWSAaXCY,1519
84
- architect_py/grpc_client/Marketdata/SubscribeCurrentCandlesRequest.py,sha256=GgoJPdriRaHVCv8La7v6jJcUqTOtGwncOgnfDzZK54Y,1964
85
- architect_py/grpc_client/Marketdata/SubscribeL1BookSnapshotsRequest.py,sha256=qHXC-2REIuD_W6vABUcE7wkamMm47X1K_XHAVyistGE,1288
86
- architect_py/grpc_client/Marketdata/SubscribeL2BookUpdatesRequest.py,sha256=_y5HbIra5IZlZLinGv0okSLy5Y0fxmBmpEQyKbWCI88,1144
87
- architect_py/grpc_client/Marketdata/SubscribeLiquidationsRequest.py,sha256=RDRkSXNq7KFnQPLZ0z_7Ac_A1qNptA7CLJJSou5Yirw,1050
88
- architect_py/grpc_client/Marketdata/SubscribeManyCandlesRequest.py,sha256=6YF3eVPH64iHWO5FcfezR7PZP3mDCn8OhnsJGkQUPgU,1523
89
- architect_py/grpc_client/Marketdata/SubscribeTickersRequest.py,sha256=2bxGr4jXwMrCcR2nzJtOfO5kJTHckVN4YLEJofYC4iA,1448
90
- architect_py/grpc_client/Marketdata/SubscribeTradesRequest.py,sha256=GPKWAgZBAGHx1StLZABZhS5akSAuzt-iGo1v_qqVBTM,1310
91
- architect_py/grpc_client/Marketdata/Ticker.py,sha256=vtmJI1FXzDFoIjQNTy02eMmcC7XQTwfc38ksWBpPsV8,11102
92
- architect_py/grpc_client/Marketdata/TickerRequest.py,sha256=8tBrA3Qf-iaVcidZYzXM4Y3EYr3loOeJy-Fz7gXICAk,1019
93
- architect_py/grpc_client/Marketdata/TickerUpdate.py,sha256=sJ4wvCeGckMV30HwAcAsEMQbCzjN31OxF19q70jdxok,437
94
- architect_py/grpc_client/Marketdata/TickersRequest.py,sha256=2AXUtlpHoFEFL2-3tSIWxl6XW03-5k_4mmaz4twUa7s,1449
95
- architect_py/grpc_client/Marketdata/TickersResponse.py,sha256=6vQP9THIZLB4Wg6qsyxHyiwcNqJZqX1YdM_mDquxDQQ,585
96
- architect_py/grpc_client/Marketdata/Trade.py,sha256=ulehhycY8zc7c7rOaIA518FkiDyPHFScCiFFNY3YKnI,2509
97
- architect_py/grpc_client/Marketdata/__init__.py,sha256=PdhPxuRZD3EWWUOG4cnz3WqTKn7jOOBeUZ_BzeELbNc,67
98
- architect_py/grpc_client/Oms/Cancel.py,sha256=SnsTUrHxcw-KrOZ2FkosS6lBhvCCLGqhU5V8CI_wv74,945
99
- architect_py/grpc_client/Oms/CancelAllOrdersRequest.py,sha256=pPEqfDLIsp-5Q-6GugKwcH7rKUGO4Dyfh5E3ASmAEgk,1485
100
- architect_py/grpc_client/Oms/CancelAllOrdersResponse.py,sha256=CwMzd4bUHZPSb4huU7uLXE_abb7mMvafrOvzFmDJ748,449
101
- architect_py/grpc_client/Oms/CancelOrderRequest.py,sha256=X7VwVNvNOTyOVXKD_Urt4R71LZC0qYGEzwVaF0qEdik,1950
102
- architect_py/grpc_client/Oms/OpenOrdersRequest.py,sha256=J6JJetxfDtFxS9iuYRJBsC_KFqThqNgZVXYXkSpGmKQ,1815
103
- architect_py/grpc_client/Oms/OpenOrdersResponse.py,sha256=-0IhdvACdbnawPlv65m3x00VYTuIQu0bF-fQKFPyx1o,603
104
- architect_py/grpc_client/Oms/Order.py,sha256=wBGU656WhT-axd19sFSwGMEOm76aHSIfi1HCQAB8-jk,9810
105
- architect_py/grpc_client/Oms/PendingCancelsRequest.py,sha256=sl3yaAXckZOFIOLJ6hGw1n4SfHerifyVbym3vyxODUM,1631
106
- architect_py/grpc_client/Oms/PendingCancelsResponse.py,sha256=-fo9aD3w-vMADJtYm4t0oQO3u-dERA_diXH6X3iIEHc,639
107
- architect_py/grpc_client/Oms/PlaceOrderRequest.py,sha256=CI_DjpvbBzfqh7a0J3Jb9yTg_R_FO-51zmzbngE04Uk,8088
108
- architect_py/grpc_client/Oms/__init__.py,sha256=PdhPxuRZD3EWWUOG4cnz3WqTKn7jOOBeUZ_BzeELbNc,67
109
- architect_py/grpc_client/Orderflow/Dropcopy.py,sha256=hjcGXX1V-pWJNjirLW2a2-oLbb9WUw_h1nhFh-hPthM,621
110
- architect_py/grpc_client/Orderflow/DropcopyRequest.py,sha256=vPrmiXke5VZsWTy7qFz8eLe89sFUdrtXdz7uffPCN-o,1842
111
- architect_py/grpc_client/Orderflow/Orderflow.py,sha256=5y8d33GvVspOg5Nn_kXrV3VYKCts-MXiiFevrpRTORA,1894
112
- architect_py/grpc_client/Orderflow/OrderflowRequest.py,sha256=RePxrbg3_PP3DQOTQvEztG5zd9RcukQ8yutaGXQt334,1646
113
- architect_py/grpc_client/Orderflow/SubscribeOrderflowRequest.py,sha256=kqQMIB75k9MzqlrAu0ScQKw2huOWePlScQRN02HkoqQ,2100
114
- architect_py/grpc_client/Orderflow/__init__.py,sha256=PdhPxuRZD3EWWUOG4cnz3WqTKn7jOOBeUZ_BzeELbNc,67
115
- architect_py/grpc_client/Symbology/PruneExpiredSymbolsRequest.py,sha256=AUEDzBLmUKVfedG5c-U62EH4fJase1BfUlX5rvLt_0k,1442
116
- architect_py/grpc_client/Symbology/PruneExpiredSymbolsResponse.py,sha256=KckBKxq5W-IVzrFIhg32p9SfxUT8bOPnURIDG-ClrJQ,467
117
- architect_py/grpc_client/Symbology/SubscribeSymbology.py,sha256=Wu2MnLmwFbTKJRQsioXv6Vt1NQLrr3rTRlkJDxebaP8,440
118
- architect_py/grpc_client/Symbology/SymbologyRequest.py,sha256=MLTn2wYT9PSyFXZCReJYY76WCn-OA0f59s33MfWgm2M,859
119
- architect_py/grpc_client/Symbology/SymbologySnapshot.py,sha256=iBFcbDCURL1CWRAJ1O9dlrJ8VkjdiVlMojNjP4kBn-Y,1939
120
- architect_py/grpc_client/Symbology/SymbologyUpdate.py,sha256=VHvjUvAcbTSNX70BzPgqjZKIIB1nO7F4m2bitjG8InM,2381
121
- architect_py/grpc_client/Symbology/SymbolsRequest.py,sha256=j34Xd6u04nVMgACsownYYAR0kSq5DM9sDy21qw5iUMs,871
122
- architect_py/grpc_client/Symbology/SymbolsResponse.py,sha256=tkDlM6EcyzfZ0BKaVN3TXe-RmXwhVeQDkzopidxFwYw,550
123
- architect_py/grpc_client/Symbology/UploadSymbologyRequest.py,sha256=gbx9MpQvjCenP0aKogtCWZ21p-sqfvUKa5oI31sCx78,1851
124
- architect_py/grpc_client/Symbology/UploadSymbologyResponse.py,sha256=icEsRoE4g9hANqQjzsQm3SG8mMYAFTx9GgIvP-ST9qw,455
125
- architect_py/grpc_client/Symbology/__init__.py,sha256=PdhPxuRZD3EWWUOG4cnz3WqTKn7jOOBeUZ_BzeELbNc,67
126
- architect_py/grpc_client/__init__.py,sha256=LhTJC_UL_Ke_5CB_QtXwenh9z5ZMMrL_BKqi_bRkWls,117
127
- architect_py/grpc_client/definitions.py,sha256=2ygMVs_4hSH_nIllqhXZRQhHuebiRnYMMTDi9XFlcQU,79661
128
- architect_py/grpc_client/grpc_client.py,sha256=wMike5O8_Bej5glbpEVQpMy3vEfUy9QKZwr8J-r6TB0,14544
129
- architect_py/grpc_client/grpc_server.py,sha256=j8WmtwLqEOixp9PRL03z3biWy7kaFQgd50SKI6vhI3k,1842
130
- architect_py/scalars.py,sha256=fPGkAC9MWUaTyCj7N7jXBPoPJk5yWPkcC7a-XUMN-u4,4948
131
- architect_py/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
132
- architect_py/tests/conftest.py,sha256=DkDfPkw1XxIgSuIrqZcOpYVctUwP6ASAy3WbCq-sV8s,3490
133
- architect_py/tests/test_accounts.py,sha256=DyYZBcxc9x5aRNOLwUjEHGZQcdKRcQEMv7-zG4ddn-c,849
134
- architect_py/tests/test_book_building.py,sha256=eb1DcTuwo8dEQDkxpboh9zl7ApjB901Q7IbqH3jSbqo,1139
135
- architect_py/tests/test_client.py,sha256=_EfRGRLGR5mIqbUM7ez32JBzFMd16htIf0523E-tu-0,916
136
- architect_py/tests/test_grpc_client.py,sha256=4W_3dsbO2HawizT_6uItToGnhFn5ZwVoO-TSiRNzdSE,914
137
- architect_py/tests/test_order_sending.py,sha256=NblWQOeH8-vBqDRtNz82ItNTQQWRGjaT14wA3TTWdsM,2044
138
- architect_py/tests/test_rounding.py,sha256=OU4-vbr5UWx8d8V5OSNKPsCrfOXuePCupCn4sKkYyAc,1361
139
- architect_py/tests/test_snapshots.py,sha256=quSEdeG6nTXfqVauGrSYs82YSX7kTVHjc4HPLzb24Yg,1470
140
- architect_py/tests/test_subscriptions.py,sha256=zjTnwnrgMHC74Q3gU9Y5HtqbViIflvqZVcXKQjRiGUg,3717
141
- architect_py/tests/test_symbology.py,sha256=tLRFyUkcKWQka0RGZIvy71oJ1vxzL412ws1hyw2eFA4,2536
142
- architect_py/utils/nearest_tick.py,sha256=RUww8pv0WioPJ5ilP9un68JIpqN_3HdEUskk2H6ePTI,4813
143
- architect_py/utils/nearest_tick_2.py,sha256=CpcR3OnAsiBYrUlw--fRdkSRY4q_ADrmfWXB4uJixHo,3642
144
- architect_py/utils/price_bands.py,sha256=AKln6uZlLy4AVOaBBnn-ZvhxuTpWFjtyTbfJJ4NpSHQ,21951
145
- architect_py-3.2.2.dist-info/LICENSE,sha256=6P0_5gYN8iPWPZeqA9nxiO3tRQmcSA1ijAVR7C8j1SI,11362
146
- architect_py-3.2.2.dist-info/METADATA,sha256=tu4EfbwdC4X8Kn-2BkSuApYYvN7ack_gZwiow--5iw4,7571
147
- architect_py-3.2.2.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
148
- architect_py-3.2.2.dist-info/RECORD,,