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.
- architect_py/__init__.py +18 -2
- architect_py/async_client.py +1069 -647
- architect_py/client.py +25 -26
- architect_py/client_interface.py +63 -0
- architect_py/common_types/__init__.py +6 -0
- architect_py/common_types/order_dir.py +91 -0
- architect_py/common_types/scalars.py +25 -0
- architect_py/common_types/tradable_product.py +59 -0
- architect_py/graphql_client/__init__.py +2 -0
- architect_py/graphql_client/client.py +3 -6
- architect_py/graphql_client/enums.py +5 -0
- architect_py/graphql_client/fragments.py +3 -6
- architect_py/graphql_client/get_fills_query.py +2 -1
- architect_py/graphql_client/search_symbols_query.py +2 -1
- architect_py/graphql_client/subscribe_orderflow.py +2 -1
- architect_py/graphql_client/subscribe_trades.py +2 -1
- architect_py/grpc/__init__.py +145 -0
- architect_py/grpc/client.py +94 -0
- architect_py/{grpc_client → grpc/models}/Accounts/AccountsRequest.py +6 -3
- architect_py/{grpc_client → grpc/models}/Accounts/AccountsResponse.py +1 -1
- architect_py/{grpc_client → grpc/models}/Accounts/__init__.py +1 -1
- architect_py/grpc/models/Algo/AlgoOrder.py +114 -0
- architect_py/grpc/models/Algo/AlgoOrderRequest.py +46 -0
- architect_py/grpc/models/Algo/AlgoOrdersRequest.py +72 -0
- architect_py/grpc/models/Algo/AlgoOrdersResponse.py +27 -0
- architect_py/grpc/models/Algo/CreateAlgoOrderRequest.py +56 -0
- architect_py/grpc/models/Algo/PauseAlgoRequest.py +42 -0
- architect_py/grpc/models/Algo/PauseAlgoResponse.py +20 -0
- architect_py/grpc/models/Algo/StartAlgoRequest.py +42 -0
- architect_py/grpc/models/Algo/StartAlgoResponse.py +20 -0
- architect_py/grpc/models/Algo/StopAlgoRequest.py +42 -0
- architect_py/grpc/models/Algo/StopAlgoResponse.py +20 -0
- architect_py/{grpc_client → grpc/models}/Algo/__init__.py +1 -1
- architect_py/grpc/models/Auth/CreateJwtRequest.py +47 -0
- architect_py/grpc/models/Auth/CreateJwtResponse.py +23 -0
- architect_py/{grpc_client/Cpty → grpc/models/Auth}/__init__.py +1 -1
- architect_py/grpc/models/Boss/DepositsRequest.py +40 -0
- architect_py/grpc/models/Boss/DepositsResponse.py +27 -0
- architect_py/grpc/models/Boss/RqdAccountStatisticsRequest.py +42 -0
- architect_py/grpc/models/Boss/RqdAccountStatisticsResponse.py +25 -0
- architect_py/grpc/models/Boss/StatementUrlRequest.py +40 -0
- architect_py/grpc/models/Boss/StatementUrlResponse.py +23 -0
- architect_py/grpc/models/Boss/StatementsRequest.py +40 -0
- architect_py/grpc/models/Boss/StatementsResponse.py +27 -0
- architect_py/grpc/models/Boss/WithdrawalsRequest.py +40 -0
- architect_py/grpc/models/Boss/WithdrawalsResponse.py +27 -0
- architect_py/{grpc_client/Folio → grpc/models/Boss}/__init__.py +1 -1
- architect_py/grpc/models/Core/ConfigRequest.py +37 -0
- architect_py/grpc/models/Core/ConfigResponse.py +25 -0
- architect_py/grpc/models/Core/__init__.py +2 -0
- architect_py/{grpc_client → grpc/models}/Cpty/CptyRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Cpty/CptyResponse.py +3 -3
- architect_py/{grpc_client → grpc/models}/Cpty/CptyStatus.py +1 -1
- architect_py/{grpc_client → grpc/models}/Cpty/CptyStatusRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Cpty/CptysRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Cpty/CptysResponse.py +1 -1
- architect_py/grpc/models/Cpty/__init__.py +2 -0
- architect_py/{grpc_client → grpc/models}/Folio/AccountHistoryRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Folio/AccountHistoryResponse.py +1 -1
- architect_py/{grpc_client → grpc/models}/Folio/AccountSummariesRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Folio/AccountSummariesResponse.py +1 -1
- architect_py/{grpc_client → grpc/models}/Folio/AccountSummary.py +1 -1
- architect_py/{grpc_client → grpc/models}/Folio/AccountSummaryRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Folio/HistoricalFillsRequest.py +7 -4
- architect_py/{grpc_client → grpc/models}/Folio/HistoricalFillsResponse.py +1 -1
- architect_py/{grpc_client → grpc/models}/Folio/HistoricalOrdersRequest.py +3 -3
- architect_py/{grpc_client → grpc/models}/Folio/HistoricalOrdersResponse.py +1 -1
- architect_py/grpc/models/Folio/__init__.py +2 -0
- architect_py/{grpc_client → grpc/models}/Health/HealthCheckRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Health/HealthCheckResponse.py +1 -1
- architect_py/grpc/models/Health/__init__.py +2 -0
- architect_py/{grpc_client → grpc/models}/Marketdata/Candle.py +1 -1
- architect_py/{grpc_client → grpc/models}/Marketdata/HistoricalCandlesRequest.py +11 -8
- architect_py/{grpc_client → grpc/models}/Marketdata/HistoricalCandlesResponse.py +1 -1
- architect_py/{grpc_client → grpc/models}/Marketdata/L1BookSnapshot.py +52 -5
- architect_py/{grpc_client → grpc/models}/Marketdata/L1BookSnapshotRequest.py +8 -3
- architect_py/{grpc_client → grpc/models}/Marketdata/L1BookSnapshotsRequest.py +6 -3
- architect_py/{grpc_client → grpc/models}/Marketdata/L2BookSnapshot.py +1 -1
- architect_py/{grpc_client → grpc/models}/Marketdata/L2BookSnapshotRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Marketdata/Liquidation.py +2 -2
- architect_py/{grpc_client → grpc/models}/Marketdata/MarketStatus.py +1 -1
- architect_py/{grpc_client → grpc/models}/Marketdata/MarketStatusRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeCandlesRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeCurrentCandlesRequest.py +3 -4
- architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeL1BookSnapshotsRequest.py +6 -3
- architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeL2BookUpdatesRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeLiquidationsRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeManyCandlesRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeTickersRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Marketdata/SubscribeTradesRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Marketdata/Ticker.py +1 -1
- architect_py/{grpc_client → grpc/models}/Marketdata/TickerRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Marketdata/TickersRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Marketdata/TickersResponse.py +1 -1
- architect_py/{grpc_client → grpc/models}/Marketdata/Trade.py +2 -2
- architect_py/grpc/models/Marketdata/__init__.py +2 -0
- architect_py/grpc/models/Oms/Cancel.py +90 -0
- architect_py/{grpc_client → grpc/models}/Oms/CancelAllOrdersRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Oms/CancelAllOrdersResponse.py +1 -1
- architect_py/{grpc_client → grpc/models}/Oms/CancelOrderRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Oms/OpenOrdersRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Oms/OpenOrdersResponse.py +1 -1
- architect_py/{grpc_client → grpc/models}/Oms/Order.py +6 -13
- architect_py/{grpc_client → grpc/models}/Oms/PendingCancelsRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Oms/PendingCancelsResponse.py +1 -1
- architect_py/{grpc_client → grpc/models}/Oms/PlaceOrderRequest.py +16 -23
- architect_py/grpc/models/Oms/__init__.py +2 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsChain.py +30 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeks.py +30 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeksRequest.py +47 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsChainRequest.py +45 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsExpirations.py +29 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsExpirationsRequest.py +42 -0
- architect_py/grpc/models/OptionsMarketdata/__init__.py +2 -0
- architect_py/{grpc_client → grpc/models}/Orderflow/DropcopyRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Orderflow/OrderflowRequest.py +1 -1
- architect_py/{grpc_client → grpc/models}/Orderflow/SubscribeOrderflowRequest.py +2 -2
- architect_py/grpc/models/Orderflow/__init__.py +2 -0
- architect_py/grpc/models/Symbology/DownloadProductCatalogRequest.py +42 -0
- architect_py/grpc/models/Symbology/DownloadProductCatalogResponse.py +27 -0
- architect_py/grpc/models/Symbology/ExecutionInfoRequest.py +47 -0
- architect_py/grpc/models/Symbology/ExecutionInfoResponse.py +27 -0
- architect_py/{grpc_client → grpc/models}/Symbology/PruneExpiredSymbolsRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Symbology/PruneExpiredSymbolsResponse.py +1 -1
- architect_py/{grpc_client → grpc/models}/Symbology/SubscribeSymbology.py +1 -1
- architect_py/{grpc_client → grpc/models}/Symbology/SymbologyRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Symbology/SymbologySnapshot.py +7 -2
- architect_py/{grpc_client → grpc/models}/Symbology/SymbologyUpdate.py +9 -2
- architect_py/{grpc_client → grpc/models}/Symbology/SymbolsRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Symbology/SymbolsResponse.py +1 -1
- architect_py/grpc/models/Symbology/UploadProductCatalogRequest.py +49 -0
- architect_py/grpc/models/Symbology/UploadProductCatalogResponse.py +20 -0
- architect_py/{grpc_client → grpc/models}/Symbology/UploadSymbologyRequest.py +2 -2
- architect_py/{grpc_client → grpc/models}/Symbology/UploadSymbologyResponse.py +1 -1
- architect_py/grpc/models/Symbology/__init__.py +2 -0
- architect_py/grpc/models/__init__.py +2 -0
- architect_py/{grpc_client → grpc/models}/definitions.py +690 -841
- architect_py/grpc/resolve_endpoint.py +70 -0
- architect_py/{grpc_client/grpc_server.py → grpc/server.py} +9 -6
- architect_py/grpc/utils.py +32 -0
- architect_py/internal_utils/__init__.py +0 -0
- architect_py/internal_utils/no_pandas.py +3 -0
- architect_py/tests/conftest.py +91 -87
- architect_py/tests/test_book_building.py +49 -50
- architect_py/tests/test_marketdata.py +168 -0
- architect_py/tests/test_order_entry.py +37 -0
- architect_py/tests/test_orderflow.py +41 -0
- architect_py/tests/test_portfolio_management.py +23 -0
- architect_py/tests/test_rounding.py +28 -28
- architect_py/tests/test_symbology.py +37 -30
- architect_py/utils/nearest_tick.py +2 -5
- architect_py/utils/nearest_tick_2.py +1 -2
- architect_py/utils/orderbook.py +35 -0
- architect_py/utils/pandas.py +44 -0
- architect_py/utils/price_bands.py +0 -3
- architect_py/utils/symbol_parsing.py +29 -0
- architect_py-5.0.0.dist-info/METADATA +54 -0
- architect_py-5.0.0.dist-info/RECORD +214 -0
- {architect_py-3.2.2.dist-info → architect_py-5.0.0.dist-info}/WHEEL +2 -1
- architect_py-5.0.0.dist-info/top_level.txt +4 -0
- examples/__init__.py +0 -0
- examples/book_subscription.py +52 -0
- examples/candles.py +30 -0
- examples/common.py +116 -0
- examples/external_cpty.py +77 -0
- examples/funding_rate_mean_reversion_algo.py +186 -0
- examples/order_sending.py +91 -0
- examples/stream_l1_marketdata.py +25 -0
- examples/stream_l2_marketdata.py +38 -0
- examples/trades.py +21 -0
- examples/tutorial_async.py +86 -0
- examples/tutorial_sync.py +95 -0
- scripts/generate_functions_md.py +166 -0
- scripts/generate_sync_interface.py +226 -0
- scripts/postprocess_grpc.py +604 -0
- scripts/preprocess_grpc_schema.py +708 -0
- templates/exceptions.py +83 -0
- templates/juniper_base_client.py +371 -0
- architect_py/client_protocol.py +0 -53
- architect_py/grpc_client/Algo/AlgoOrderForTwapAlgo.py +0 -61
- architect_py/grpc_client/Algo/CreateAlgoOrderRequestForTwapAlgo.py +0 -59
- architect_py/grpc_client/Algo/ModifyAlgoOrderRequestForTwapAlgo.py +0 -45
- architect_py/grpc_client/Health/__init__.py +0 -2
- architect_py/grpc_client/Marketdata/__init__.py +0 -2
- architect_py/grpc_client/Oms/Cancel.py +0 -42
- architect_py/grpc_client/Oms/__init__.py +0 -2
- architect_py/grpc_client/Orderflow/__init__.py +0 -2
- architect_py/grpc_client/Symbology/__init__.py +0 -2
- architect_py/grpc_client/__init__.py +0 -2
- architect_py/grpc_client/grpc_client.py +0 -413
- architect_py/scalars.py +0 -172
- architect_py/tests/test_accounts.py +0 -31
- architect_py/tests/test_client.py +0 -29
- architect_py/tests/test_grpc_client.py +0 -30
- architect_py/tests/test_order_sending.py +0 -65
- architect_py/tests/test_snapshots.py +0 -52
- architect_py/tests/test_subscriptions.py +0 -126
- architect_py-3.2.2.dist-info/METADATA +0 -191
- architect_py-3.2.2.dist-info/RECORD +0 -148
- /architect_py/{grpc_client → grpc/models}/Marketdata/ArrayOfL1BookSnapshot.py +0 -0
- /architect_py/{grpc_client → grpc/models}/Marketdata/L2BookUpdate.py +0 -0
- /architect_py/{grpc_client → grpc/models}/Marketdata/TickerUpdate.py +0 -0
- /architect_py/{grpc_client → grpc/models}/Orderflow/Dropcopy.py +0 -0
- /architect_py/{grpc_client → grpc/models}/Orderflow/Orderflow.py +0 -0
- {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
|
-
# [](https://architect.co) architect_py
|
26
|
-
[](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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|