architect-py 5.1.5__py3-none-any.whl → 5.2.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 +24 -4
- architect_py/async_client.py +66 -57
- architect_py/async_cpty.py +422 -0
- architect_py/client.pyi +2 -34
- architect_py/grpc/models/Accounts/ResetPaperAccountRequest.py +59 -0
- architect_py/grpc/models/Accounts/ResetPaperAccountResponse.py +20 -0
- architect_py/grpc/models/Boss/OptionsTransactionsRequest.py +42 -0
- architect_py/grpc/models/Boss/OptionsTransactionsResponse.py +27 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsChain.py +5 -5
- architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeks.py +5 -5
- architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeksRequest.py +5 -1
- architect_py/grpc/models/OptionsMarketdata/OptionsChainRequest.py +5 -1
- architect_py/grpc/models/OptionsMarketdata/OptionsContract.py +45 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsContractGreeksRequest.py +40 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsContractRequest.py +40 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsExpirations.py +4 -1
- architect_py/grpc/models/OptionsMarketdata/OptionsExpirationsRequest.py +8 -1
- architect_py/grpc/models/OptionsMarketdata/OptionsGreeks.py +58 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsWraps.py +28 -0
- architect_py/grpc/models/OptionsMarketdata/OptionsWrapsRequest.py +40 -0
- architect_py/grpc/models/__init__.py +11 -1
- architect_py/grpc/models/definitions.py +37 -86
- architect_py/grpc/orderflow.py +3 -7
- architect_py/grpc/server.py +1 -3
- architect_py/tests/test_order_entry.py +120 -1
- architect_py/tests/test_positions.py +208 -17
- {architect_py-5.1.5.dist-info → architect_py-5.2.0.dist-info}/METADATA +1 -1
- {architect_py-5.1.5.dist-info → architect_py-5.2.0.dist-info}/RECORD +41 -30
- examples/external_cpty.py +72 -66
- examples/funding_rate_mean_reversion_algo.py +4 -4
- examples/order_sending.py +3 -3
- examples/orderflow_channel.py +75 -56
- examples/stream_l1_marketdata.py +3 -1
- examples/stream_l2_marketdata.py +3 -1
- examples/tutorial_async.py +3 -2
- examples/tutorial_sync.py +4 -3
- scripts/add_imports_to_inits.py +6 -2
- scripts/generate_functions_md.py +2 -1
- {architect_py-5.1.5.dist-info → architect_py-5.2.0.dist-info}/WHEEL +0 -0
- {architect_py-5.1.5.dist-info → architect_py-5.2.0.dist-info}/licenses/LICENSE +0 -0
- {architect_py-5.1.5.dist-info → architect_py-5.2.0.dist-info}/top_level.txt +0 -0
@@ -4,7 +4,8 @@ from decimal import Decimal
|
|
4
4
|
import pytest
|
5
5
|
|
6
6
|
from architect_py import AsyncClient, OrderDir, TickRoundMethod
|
7
|
-
from architect_py.
|
7
|
+
from architect_py.common_types.tradable_product import TradableProduct
|
8
|
+
from architect_py.grpc.models.definitions import OrderType, SpreaderParams
|
8
9
|
|
9
10
|
|
10
11
|
@pytest.mark.asyncio
|
@@ -39,3 +40,121 @@ async def test_place_limit_order(async_client: AsyncClient):
|
|
39
40
|
await async_client.cancel_order(order.id)
|
40
41
|
|
41
42
|
await async_client.close()
|
43
|
+
|
44
|
+
|
45
|
+
@pytest.mark.asyncio
|
46
|
+
@pytest.mark.timeout(3)
|
47
|
+
async def test_place_market_order(async_client: AsyncClient):
|
48
|
+
venue = "CME"
|
49
|
+
front_future = await async_client.get_front_future("ES CME Futures", venue)
|
50
|
+
info = await async_client.get_execution_info(front_future, venue)
|
51
|
+
assert info is not None
|
52
|
+
assert info.tick_size is not None
|
53
|
+
snap = await async_client.get_ticker(front_future, venue)
|
54
|
+
assert snap is not None
|
55
|
+
assert snap.bid_price is not None
|
56
|
+
accounts = await async_client.list_accounts()
|
57
|
+
account = accounts[0]
|
58
|
+
|
59
|
+
# bid far below the best bid
|
60
|
+
order = await async_client.place_order(
|
61
|
+
symbol=front_future,
|
62
|
+
execution_venue=venue,
|
63
|
+
dir=OrderDir.BUY,
|
64
|
+
quantity=Decimal(1),
|
65
|
+
order_type=OrderType.MARKET,
|
66
|
+
account=str(account.account.id),
|
67
|
+
)
|
68
|
+
|
69
|
+
assert order is not None
|
70
|
+
|
71
|
+
await asyncio.sleep(1.5)
|
72
|
+
order = await async_client.get_order(order.id)
|
73
|
+
assert order is not None
|
74
|
+
|
75
|
+
await async_client.close()
|
76
|
+
|
77
|
+
|
78
|
+
@pytest.mark.asyncio
|
79
|
+
@pytest.mark.timeout(3)
|
80
|
+
async def test_equity_order(async_client: AsyncClient):
|
81
|
+
tradable_product = TradableProduct(base_or_value="AAPL US Equity/USD")
|
82
|
+
|
83
|
+
product_info = await async_client.get_product_info(tradable_product.base())
|
84
|
+
assert product_info is not None
|
85
|
+
venue = product_info.primary_venue
|
86
|
+
assert venue is not None
|
87
|
+
|
88
|
+
market_status = await async_client.get_market_status(tradable_product, venue)
|
89
|
+
if not market_status.is_trading:
|
90
|
+
pytest.skip(f"Market {venue} for {tradable_product} is not open")
|
91
|
+
|
92
|
+
info = await async_client.get_execution_info(tradable_product, venue)
|
93
|
+
assert info is not None
|
94
|
+
# assert info.tick_size is not None
|
95
|
+
|
96
|
+
tick_size = Decimal("0.01")
|
97
|
+
|
98
|
+
snap = await async_client.get_ticker(tradable_product, venue)
|
99
|
+
assert snap is not None
|
100
|
+
assert snap.bid_price is not None
|
101
|
+
accounts = await async_client.list_accounts()
|
102
|
+
account = accounts[0]
|
103
|
+
|
104
|
+
# bid far below the best bid
|
105
|
+
limit_price = TickRoundMethod.FLOOR(snap.bid_price * Decimal(0.9), tick_size)
|
106
|
+
order = await async_client.place_order(
|
107
|
+
symbol=tradable_product,
|
108
|
+
execution_venue=venue,
|
109
|
+
dir=OrderDir.BUY,
|
110
|
+
quantity=Decimal(1),
|
111
|
+
order_type=OrderType.LIMIT,
|
112
|
+
limit_price=limit_price,
|
113
|
+
post_only=False,
|
114
|
+
account=str(account.account.id),
|
115
|
+
)
|
116
|
+
|
117
|
+
assert order is not None
|
118
|
+
await asyncio.sleep(1)
|
119
|
+
await async_client.cancel_order(order.id)
|
120
|
+
|
121
|
+
await async_client.close()
|
122
|
+
|
123
|
+
|
124
|
+
@pytest.mark.asyncio
|
125
|
+
@pytest.mark.timeout(3)
|
126
|
+
async def test_spreader_algo(async_client: AsyncClient):
|
127
|
+
accounts = await async_client.list_accounts()
|
128
|
+
account = accounts[0]
|
129
|
+
|
130
|
+
venue = "CME"
|
131
|
+
|
132
|
+
front_ES_future = await async_client.get_front_future("ES CME Futures", venue)
|
133
|
+
front_NQ_future = await async_client.get_front_future("NQ CME Futures", venue)
|
134
|
+
|
135
|
+
params = SpreaderParams(
|
136
|
+
dir=OrderDir.BUY, # or OrderDir.SELL
|
137
|
+
leg1_marketdata_venue=venue,
|
138
|
+
leg1_price_offset=Decimal("0"),
|
139
|
+
leg1_price_ratio=Decimal("1"),
|
140
|
+
leg1_quantity_ratio=Decimal("1"),
|
141
|
+
leg1_symbol=front_ES_future,
|
142
|
+
leg2_marketdata_venue=venue,
|
143
|
+
leg2_price_offset=Decimal("0"),
|
144
|
+
leg2_price_ratio=Decimal("-1"),
|
145
|
+
leg2_quantity_ratio=Decimal("-1"),
|
146
|
+
leg2_symbol=front_NQ_future,
|
147
|
+
limit_price=Decimal("0.25"),
|
148
|
+
order_lockout="1s",
|
149
|
+
quantity=Decimal("10"),
|
150
|
+
leg1_account=account.account.id,
|
151
|
+
leg1_execution_venue=venue,
|
152
|
+
leg2_account=account.account.id,
|
153
|
+
leg2_execution_venue=venue,
|
154
|
+
)
|
155
|
+
|
156
|
+
order = await async_client.place_algo_order(params=params)
|
157
|
+
|
158
|
+
print(order)
|
159
|
+
|
160
|
+
await async_client.close()
|
@@ -3,32 +3,126 @@ from decimal import Decimal
|
|
3
3
|
|
4
4
|
import pytest
|
5
5
|
|
6
|
-
from architect_py
|
6
|
+
from architect_py import AsyncClient, OrderDir, OrderType, TradableProduct
|
7
7
|
|
8
|
+
ES_MULTIPLIER = Decimal("50.0") # ES futures multiplier
|
8
9
|
|
9
|
-
@pytest.mark.asyncio
|
10
|
-
@pytest.mark.timeout(10)
|
11
|
-
async def test_positions(async_client: AsyncClient):
|
12
|
-
if not async_client.paper_trading:
|
13
|
-
return
|
14
10
|
|
11
|
+
@pytest.mark.asyncio
|
12
|
+
async def test_paper_setup(async_client: AsyncClient):
|
15
13
|
accounts = await async_client.list_accounts()
|
16
14
|
|
17
15
|
assert len(accounts) == 1, (
|
18
16
|
f"Expected exactly one account in paper trading mode, got {len(accounts)}"
|
19
17
|
)
|
20
|
-
|
18
|
+
|
19
|
+
front_ES_future = await async_client.get_front_future("ES CME Futures", "CME")
|
20
|
+
|
21
|
+
product_info = await async_client.get_product_info(front_ES_future.base())
|
22
|
+
assert product_info is not None, (
|
23
|
+
f"Expected product info for {front_ES_future.base()} to be not None"
|
24
|
+
)
|
25
|
+
assert product_info.multiplier == ES_MULTIPLIER, (
|
26
|
+
f"Expected multiplier for {front_ES_future.base()} to be {ES_MULTIPLIER}, got {product_info.multiplier}"
|
27
|
+
)
|
28
|
+
await async_client.close()
|
29
|
+
|
30
|
+
|
31
|
+
@pytest.mark.asyncio
|
32
|
+
async def test_flattening_position(async_client: AsyncClient):
|
33
|
+
if not async_client.paper_trading:
|
34
|
+
return
|
35
|
+
|
21
36
|
front_ES_future = await async_client.get_front_future("ES CME Futures", "CME")
|
37
|
+
[account] = await async_client.list_accounts()
|
38
|
+
account_id = account.account.id
|
39
|
+
|
40
|
+
market_status = await async_client.get_market_status(front_ES_future, "CME")
|
41
|
+
if not market_status.is_trading:
|
42
|
+
await async_client.close()
|
43
|
+
pytest.skip(
|
44
|
+
f"Market for {front_ES_future} is not trading, skipping test_flattening_position"
|
45
|
+
)
|
46
|
+
|
47
|
+
await async_client.place_order(
|
48
|
+
symbol=front_ES_future,
|
49
|
+
venue="CME",
|
50
|
+
dir=OrderDir.BUY,
|
51
|
+
quantity=Decimal(value="100"),
|
52
|
+
account=account_id,
|
53
|
+
order_type=OrderType.MARKET,
|
54
|
+
)
|
55
|
+
|
56
|
+
positions = await async_client.get_positions(accounts=[account_id])
|
57
|
+
|
58
|
+
for tp, position in positions.items():
|
59
|
+
tradable_product = TradableProduct(tp)
|
60
|
+
product_info = await async_client.get_product_info(tradable_product.base())
|
61
|
+
assert product_info is not None, (
|
62
|
+
f"Expected product info for {tradable_product.base()} to be not None"
|
63
|
+
)
|
64
|
+
venue = product_info.primary_venue
|
65
|
+
assert venue is not None, (
|
66
|
+
f"Expected primary venue for {tradable_product.base()} to be not None"
|
67
|
+
)
|
68
|
+
|
69
|
+
market_status = await async_client.get_market_status(
|
70
|
+
symbol=tp,
|
71
|
+
venue=venue,
|
72
|
+
)
|
73
|
+
if not market_status.is_trading:
|
74
|
+
continue
|
75
|
+
|
76
|
+
if position != Decimal(0):
|
77
|
+
flatten_direction = OrderDir.SELL if position > Decimal(0) else OrderDir.BUY
|
78
|
+
|
79
|
+
await async_client.place_order(
|
80
|
+
symbol=tp,
|
81
|
+
dir=flatten_direction,
|
82
|
+
quantity=abs(position),
|
83
|
+
account=account_id,
|
84
|
+
order_type=OrderType.MARKET,
|
85
|
+
)
|
86
|
+
|
87
|
+
await asyncio.sleep(1.5) # wait for orders to be processed
|
88
|
+
|
89
|
+
positions = await async_client.get_positions(accounts=[account_id])
|
90
|
+
assert len(positions) == 0, (
|
91
|
+
f"Expected no positions in paper trading mode, got {len(positions)}"
|
92
|
+
)
|
93
|
+
await async_client.close()
|
94
|
+
|
95
|
+
|
96
|
+
@pytest.mark.asyncio
|
97
|
+
@pytest.mark.timeout(10)
|
98
|
+
async def test_paper_positions(async_client: AsyncClient):
|
99
|
+
venue = "CME"
|
100
|
+
if not async_client.paper_trading:
|
101
|
+
return
|
102
|
+
|
103
|
+
[account] = await async_client.list_accounts()
|
104
|
+
account_id = account.account.id
|
105
|
+
front_ES_future = await async_client.get_front_future("ES CME Futures", venue)
|
22
106
|
positions = await async_client.get_positions(accounts=[account_id])
|
23
107
|
ES_position = positions.get(front_ES_future)
|
24
108
|
|
109
|
+
market_status = await async_client.get_market_status(
|
110
|
+
symbol=front_ES_future,
|
111
|
+
venue=venue,
|
112
|
+
)
|
113
|
+
if not market_status.is_trading:
|
114
|
+
await async_client.close()
|
115
|
+
pytest.skip(
|
116
|
+
f"Market for {front_ES_future} is not trading, skipping test_paper_pnl"
|
117
|
+
)
|
118
|
+
|
25
119
|
# flatten position
|
26
120
|
if ES_position is not None:
|
27
121
|
flatten_direction = OrderDir.SELL if ES_position > Decimal(0) else OrderDir.BUY
|
28
122
|
|
29
123
|
order = await async_client.place_order(
|
30
124
|
symbol=front_ES_future,
|
31
|
-
venue=
|
125
|
+
venue=venue,
|
32
126
|
dir=flatten_direction,
|
33
127
|
quantity=Decimal(value="1"),
|
34
128
|
account=account_id,
|
@@ -49,7 +143,7 @@ async def test_positions(async_client: AsyncClient):
|
|
49
143
|
# go long
|
50
144
|
order = await async_client.place_order(
|
51
145
|
symbol=front_ES_future,
|
52
|
-
venue=
|
146
|
+
venue=venue,
|
53
147
|
dir=OrderDir.BUY,
|
54
148
|
quantity=Decimal(value="5"),
|
55
149
|
account=account_id,
|
@@ -63,7 +157,7 @@ async def test_positions(async_client: AsyncClient):
|
|
63
157
|
# go long to flat
|
64
158
|
order = await async_client.place_order(
|
65
159
|
symbol=front_ES_future,
|
66
|
-
venue=
|
160
|
+
venue=venue,
|
67
161
|
dir=OrderDir.SELL,
|
68
162
|
quantity=Decimal(value="5"),
|
69
163
|
account=account_id,
|
@@ -77,7 +171,7 @@ async def test_positions(async_client: AsyncClient):
|
|
77
171
|
# go long
|
78
172
|
order = await async_client.place_order(
|
79
173
|
symbol=front_ES_future,
|
80
|
-
venue=
|
174
|
+
venue=venue,
|
81
175
|
dir=OrderDir.BUY,
|
82
176
|
quantity=Decimal(value="8"),
|
83
177
|
account=account_id,
|
@@ -91,7 +185,7 @@ async def test_positions(async_client: AsyncClient):
|
|
91
185
|
# go long to short
|
92
186
|
order = await async_client.place_order(
|
93
187
|
symbol=front_ES_future,
|
94
|
-
venue=
|
188
|
+
venue=venue,
|
95
189
|
dir=OrderDir.SELL,
|
96
190
|
quantity=Decimal(value="10"),
|
97
191
|
account=account_id,
|
@@ -105,7 +199,7 @@ async def test_positions(async_client: AsyncClient):
|
|
105
199
|
# go flat
|
106
200
|
order = await async_client.place_order(
|
107
201
|
symbol=front_ES_future,
|
108
|
-
venue=
|
202
|
+
venue=venue,
|
109
203
|
dir=OrderDir.BUY,
|
110
204
|
quantity=Decimal(value="2"),
|
111
205
|
account=account_id,
|
@@ -119,7 +213,7 @@ async def test_positions(async_client: AsyncClient):
|
|
119
213
|
# go short
|
120
214
|
order = await async_client.place_order(
|
121
215
|
symbol=front_ES_future,
|
122
|
-
venue=
|
216
|
+
venue=venue,
|
123
217
|
dir=OrderDir.SELL,
|
124
218
|
quantity=Decimal(value="5"),
|
125
219
|
account=account_id,
|
@@ -133,7 +227,7 @@ async def test_positions(async_client: AsyncClient):
|
|
133
227
|
# go short to flat
|
134
228
|
order = await async_client.place_order(
|
135
229
|
symbol=front_ES_future,
|
136
|
-
venue=
|
230
|
+
venue=venue,
|
137
231
|
dir=OrderDir.BUY,
|
138
232
|
quantity=Decimal(value="5"),
|
139
233
|
account=account_id,
|
@@ -147,7 +241,7 @@ async def test_positions(async_client: AsyncClient):
|
|
147
241
|
# go short
|
148
242
|
order = await async_client.place_order(
|
149
243
|
symbol=front_ES_future,
|
150
|
-
venue=
|
244
|
+
venue=venue,
|
151
245
|
dir=OrderDir.SELL,
|
152
246
|
quantity=Decimal(value="5"),
|
153
247
|
account=account_id,
|
@@ -161,7 +255,7 @@ async def test_positions(async_client: AsyncClient):
|
|
161
255
|
# go short to long
|
162
256
|
order = await async_client.place_order(
|
163
257
|
symbol=front_ES_future,
|
164
|
-
venue=
|
258
|
+
venue=venue,
|
165
259
|
dir=OrderDir.BUY,
|
166
260
|
quantity=Decimal(value="10"),
|
167
261
|
account=account_id,
|
@@ -171,3 +265,100 @@ async def test_positions(async_client: AsyncClient):
|
|
171
265
|
assert positions.get(front_ES_future) == Decimal(5), (
|
172
266
|
f"Expected position in {front_ES_future} to be 5, got {positions.get(front_ES_future)}"
|
173
267
|
)
|
268
|
+
await async_client.close()
|
269
|
+
|
270
|
+
|
271
|
+
@pytest.mark.asyncio
|
272
|
+
@pytest.mark.timeout(10)
|
273
|
+
async def test_paper_pnl(async_client: AsyncClient):
|
274
|
+
if not async_client.paper_trading:
|
275
|
+
return
|
276
|
+
|
277
|
+
[account] = await async_client.list_accounts()
|
278
|
+
account_id = account.account.id
|
279
|
+
front_ES_future = await async_client.get_front_future("ES CME Futures", "CME")
|
280
|
+
positions = await async_client.get_positions(accounts=[account_id])
|
281
|
+
ES_position = positions.get(front_ES_future)
|
282
|
+
|
283
|
+
market_status = await async_client.get_market_status(
|
284
|
+
symbol=front_ES_future,
|
285
|
+
venue="CME",
|
286
|
+
)
|
287
|
+
if not market_status.is_trading:
|
288
|
+
await async_client.close()
|
289
|
+
pytest.skip(
|
290
|
+
f"Market for {front_ES_future} is not trading, skipping test_paper_pnl"
|
291
|
+
)
|
292
|
+
|
293
|
+
# flatten position
|
294
|
+
if ES_position is not None:
|
295
|
+
flatten_direction = OrderDir.SELL if ES_position > Decimal(0) else OrderDir.BUY
|
296
|
+
|
297
|
+
quantity = abs(ES_position)
|
298
|
+
|
299
|
+
order = await async_client.place_order(
|
300
|
+
symbol=front_ES_future,
|
301
|
+
venue="CME",
|
302
|
+
dir=flatten_direction,
|
303
|
+
quantity=quantity,
|
304
|
+
account=account_id,
|
305
|
+
order_type=OrderType.MARKET,
|
306
|
+
)
|
307
|
+
while True:
|
308
|
+
open_orders = await async_client.get_open_orders(order_ids=[order.id])
|
309
|
+
if not open_orders:
|
310
|
+
break
|
311
|
+
await asyncio.sleep(0.2)
|
312
|
+
|
313
|
+
position = await async_client.get_positions(accounts=[account_id])
|
314
|
+
assert len(position) == 0, (
|
315
|
+
f"Expected no positions in paper trading mode, got {position}"
|
316
|
+
)
|
317
|
+
|
318
|
+
account_summary = await async_client.get_account_summary(account_id)
|
319
|
+
assert account_summary.purchasing_power is not None, (
|
320
|
+
"Expected purchasing power after trades to be set, got None"
|
321
|
+
)
|
322
|
+
|
323
|
+
pre_purchasing_power = account_summary.purchasing_power
|
324
|
+
|
325
|
+
quantity = Decimal(value="7")
|
326
|
+
|
327
|
+
sell_order = await async_client.place_order(
|
328
|
+
symbol=front_ES_future,
|
329
|
+
venue="CME",
|
330
|
+
dir=OrderDir.SELL,
|
331
|
+
quantity=quantity,
|
332
|
+
account=account_id,
|
333
|
+
order_type=OrderType.MARKET,
|
334
|
+
)
|
335
|
+
|
336
|
+
buy_order = await async_client.place_order(
|
337
|
+
symbol=front_ES_future,
|
338
|
+
venue="CME",
|
339
|
+
dir=OrderDir.BUY,
|
340
|
+
quantity=quantity,
|
341
|
+
account=account_id,
|
342
|
+
order_type=OrderType.MARKET,
|
343
|
+
)
|
344
|
+
await asyncio.sleep(1.5) # wait for order to be processed
|
345
|
+
|
346
|
+
sell_fill = await async_client.get_fills(order_id=sell_order.id)
|
347
|
+
sell_fill_price = sell_fill.fills[0].price
|
348
|
+
|
349
|
+
buy_fill = await async_client.get_fills(order_id=buy_order.id)
|
350
|
+
buy_fill_price = buy_fill.fills[0].price
|
351
|
+
|
352
|
+
pnl = (sell_fill_price - buy_fill_price) * ES_MULTIPLIER * quantity
|
353
|
+
|
354
|
+
account_summary = await async_client.get_account_summary(account_id)
|
355
|
+
assert account_summary.purchasing_power is not None, (
|
356
|
+
"Expected purchasing power after trades to be set, got None"
|
357
|
+
)
|
358
|
+
post_purchasing_power = account_summary.purchasing_power
|
359
|
+
|
360
|
+
assert post_purchasing_power == pre_purchasing_power + pnl, (
|
361
|
+
f"Expected purchasing power to be {pre_purchasing_power + pnl}, got {post_purchasing_power}.\n"
|
362
|
+
f"Buy fill price: {buy_fill_price}, Sell fill price: {sell_fill_price}, quantity: {quantity}, pnl: {pnl}, pre_purchasing_power: {pre_purchasing_power}, post_purchasing_power: {post_purchasing_power}"
|
363
|
+
)
|
364
|
+
await async_client.close()
|
@@ -1,7 +1,8 @@
|
|
1
|
-
architect_py/__init__.py,sha256=
|
2
|
-
architect_py/async_client.py,sha256
|
1
|
+
architect_py/__init__.py,sha256=5xGB6lMxCkHVyUr-arPUPaZ4mhI9hqK--_yUdCxByt8,17760
|
2
|
+
architect_py/async_client.py,sha256=-8SotKjmDwDaM5yVw7PF4NT8lKk9A1DAnN5gywwehWc,66378
|
3
|
+
architect_py/async_cpty.py,sha256=f5Wudp2dKGhaJFwU_orwcWzQH0NjL5HbE9OGWbnImpM,14955
|
3
4
|
architect_py/client.py,sha256=y8w17ZLo_Y2-knH-46qqVGlSJyQHB9qwOPodI9pzN-Q,5192
|
4
|
-
architect_py/client.pyi,sha256=
|
5
|
+
architect_py/client.pyi,sha256=9GFL2Ei4Q6YUf-en6Z7kWJhdO-ayeKfT4VS_Yt2W4lA,25093
|
5
6
|
architect_py/common_types/__init__.py,sha256=fzOdIlKGWVN9V2Onc5z1v2bpvtZ4H9RSFA9ymJcBi3k,197
|
6
7
|
architect_py/common_types/order_dir.py,sha256=ebyWTcXzJWrotkc2D9wNGc6JXbE5I3NLLuAz3I7FTZ8,2191
|
7
8
|
architect_py/common_types/time_in_force.py,sha256=gEDYcNp014Eeb98zJDytiV0hGxHu_QsQndeM6Hk0Wa8,3132
|
@@ -24,14 +25,16 @@ architect_py/graphql_client/search_symbols_query.py,sha256=hbGa6gF-gMWtRYQm2vlCT
|
|
24
25
|
architect_py/graphql_client/user_id_query.py,sha256=tWKJJLgEINzd8e7rYlGklQCnwcwHzYFpCGQvhxQGX20,334
|
25
26
|
architect_py/grpc/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
26
27
|
architect_py/grpc/client.py,sha256=qoH-bb-sDjoDlYYmByQVbzYBbCimFY_AmoOLEBDxEtA,4096
|
27
|
-
architect_py/grpc/orderflow.py,sha256=
|
28
|
+
architect_py/grpc/orderflow.py,sha256=4ZvJeiFsD9We8pmiWcGYp003NKapcyhr0KbYCBxSX38,4732
|
28
29
|
architect_py/grpc/resolve_endpoint.py,sha256=r_PBWANIJJ47N5uyPcnefZ21ZE1-mzgACfCBfQpekg8,2621
|
29
|
-
architect_py/grpc/server.py,sha256=
|
30
|
+
architect_py/grpc/server.py,sha256=f-LOSFry40U1a8iHUEAb2JOgIk7NorGC3UbbRk4MUe0,1888
|
30
31
|
architect_py/grpc/utils.py,sha256=5sykLExUNZbcQHcxLCCM9DdOOiJJZcpputGrDtaMifY,667
|
31
|
-
architect_py/grpc/models/__init__.py,sha256=
|
32
|
-
architect_py/grpc/models/definitions.py,sha256=
|
32
|
+
architect_py/grpc/models/__init__.py,sha256=mhtKrrIgjgLZu6JdcgXRNwS4BURm9tWcq9FB_BbIW0U,10325
|
33
|
+
architect_py/grpc/models/definitions.py,sha256=pT1S_f6nO3-OE9Lp6L5hT3w7PFf4yJOgiHq1Yu_v7oU,81615
|
33
34
|
architect_py/grpc/models/Accounts/AccountsRequest.py,sha256=1a88cltSebOb53EdJ0hKEGR7FlmBiibrCtGzLTKqDBY,1524
|
34
35
|
architect_py/grpc/models/Accounts/AccountsResponse.py,sha256=DlXbkd3UbRybblBAfokw-K6nRvLNZgqz7cc0EKiW1zI,636
|
36
|
+
architect_py/grpc/models/Accounts/ResetPaperAccountRequest.py,sha256=PmoU9SPYWSwnD-hEOE3rkJeiRZyQ2k7LT4JYn5Fl6dM,1544
|
37
|
+
architect_py/grpc/models/Accounts/ResetPaperAccountResponse.py,sha256=-49so1Qxl-9QIRByiZ9gj-md3mt-S5oyiuy3vgolCZY,449
|
35
38
|
architect_py/grpc/models/Accounts/__init__.py,sha256=sIyaEvJdP-VmGTGPPqZuRjKn4bc7NUClJ76Gd5uq-5s,57
|
36
39
|
architect_py/grpc/models/Algo/AlgoOrder.py,sha256=ugkS9xU4ujHW3PcZpCKThw76NNkUDNakCVMf3ZnmPMw,3892
|
37
40
|
architect_py/grpc/models/Algo/AlgoOrderRequest.py,sha256=uDqxNv6vKxtkrXyO_8l1kOtVkqEsppq-wCupawmEde8,1022
|
@@ -54,6 +57,8 @@ architect_py/grpc/models/Auth/CreateJwtResponse.py,sha256=G1rsG7f4gMiWK4WVxTZMzF
|
|
54
57
|
architect_py/grpc/models/Auth/__init__.py,sha256=sIyaEvJdP-VmGTGPPqZuRjKn4bc7NUClJ76Gd5uq-5s,57
|
55
58
|
architect_py/grpc/models/Boss/DepositsRequest.py,sha256=DFf4InRz52RQt4tGrbHsDyb_9iyCNFFbQYJL922nNs4,922
|
56
59
|
architect_py/grpc/models/Boss/DepositsResponse.py,sha256=_qJvMEu9MAw-mreuRpUkbHMo7D_vSVJru_HZV2BYPmA,602
|
60
|
+
architect_py/grpc/models/Boss/OptionsTransactionsRequest.py,sha256=liTzqt4kPqZuaK4ajytdWjrWBYPGCyDyX8sbLIz1Z1k,1019
|
61
|
+
architect_py/grpc/models/Boss/OptionsTransactionsResponse.py,sha256=SKVi8OiGJyAWM-wsI3yStBTrGIh2DpwfyI6J5xAolCI,717
|
57
62
|
architect_py/grpc/models/Boss/RqdAccountStatisticsRequest.py,sha256=gp51kcbU-9Iv_7TG-jcIN2owg9NIJDxFl755TJVk2TM,1027
|
58
63
|
architect_py/grpc/models/Boss/RqdAccountStatisticsResponse.py,sha256=6eXUsphh7MwLrGsIq3nt2jRaIrGNozbZy22Fr5uRvww,697
|
59
64
|
architect_py/grpc/models/Boss/StatementUrlRequest.py,sha256=ffOWj7p_lMX9X7s3uB8PnH6hxFUnsHnjoQqu0hchnn8,974
|
@@ -128,12 +133,18 @@ architect_py/grpc/models/Oms/PendingCancelsRequest.py,sha256=jdbBOpCHBlZFAZfF6ur
|
|
128
133
|
architect_py/grpc/models/Oms/PendingCancelsResponse.py,sha256=mWRNRDa489Vdg-r7dJMOmfOO8l57yg8lBMynBDcY60A,628
|
129
134
|
architect_py/grpc/models/Oms/PlaceOrderRequest.py,sha256=DDMkKgsqWVlMhUeidxTlVDHyNdeuPLu29PUwOTd0ijo,9320
|
130
135
|
architect_py/grpc/models/Oms/__init__.py,sha256=sIyaEvJdP-VmGTGPPqZuRjKn4bc7NUClJ76Gd5uq-5s,57
|
131
|
-
architect_py/grpc/models/OptionsMarketdata/OptionsChain.py,sha256=
|
132
|
-
architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeks.py,sha256=
|
133
|
-
architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeksRequest.py,sha256=
|
134
|
-
architect_py/grpc/models/OptionsMarketdata/OptionsChainRequest.py,sha256=
|
135
|
-
architect_py/grpc/models/OptionsMarketdata/
|
136
|
-
architect_py/grpc/models/OptionsMarketdata/
|
136
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsChain.py,sha256=r9vvRUjxNaWz1fIn2ysTQ7A6tLVfetCLuQfrBLqWZY8,702
|
137
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeks.py,sha256=Nkn6dgzQAjU6ADgb-yUGDDn_oeD_pj82mV-KBvtwYMM,708
|
138
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeksRequest.py,sha256=uhJ4mSniTdyaC5KkrltIVu0BzMFrBu5qTzIIiOY5Lhs,1275
|
139
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsChainRequest.py,sha256=iHbFPyhQMeW92Thcp_zU9ycI3rf4J62YktHfj_pC6hU,1218
|
140
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsContract.py,sha256=umqW3PZV5jj5oNxtNxP3AV5r4iCNJWf5RVZ5bC-CrAg,1228
|
141
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsContractGreeksRequest.py,sha256=lBGX7qJGCrpVffHrRLid40BkvL_adK7R0EHwuH2vtWo,1031
|
142
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsContractRequest.py,sha256=LvrzB4nzkqncNGw2srSoWLw7STFvsZpl6EBd5_5Ilag,1015
|
143
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsExpirations.py,sha256=zNnkv5n7sv57HOGmonf5K32aUE_GSBT_fOOZj1JkIcg,770
|
144
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsExpirationsRequest.py,sha256=KDy9y_ibfzJndz8ZRYvxTcTP7bsgBBJyWeWaqTJMc4w,1173
|
145
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsGreeks.py,sha256=Po3KRAtw7l8BwH1-HNs28vq8vMRaX_ekHN-SgfEXzp8,1541
|
146
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsWraps.py,sha256=24ik_f_CQVv8tRohAd-XDyOllXftCByw9erprnkN-zE,626
|
147
|
+
architect_py/grpc/models/OptionsMarketdata/OptionsWrapsRequest.py,sha256=anfBQxFEtEIYehr7ektSZVUKH7ZyNeLPD6yt9nTp3p0,961
|
137
148
|
architect_py/grpc/models/OptionsMarketdata/__init__.py,sha256=sIyaEvJdP-VmGTGPPqZuRjKn4bc7NUClJ76Gd5uq-5s,57
|
138
149
|
architect_py/grpc/models/Orderflow/Dropcopy.py,sha256=hjcGXX1V-pWJNjirLW2a2-oLbb9WUw_h1nhFh-hPthM,621
|
139
150
|
architect_py/grpc/models/Orderflow/DropcopyRequest.py,sha256=LPJgD2wj4a7p1s8O32q6w7lU_pm4I2lqriPdLqyimUM,1831
|
@@ -163,10 +174,10 @@ architect_py/tests/conftest.py,sha256=XCeq44muZi6i9CxOe9lH7rCmt5pQViWJ_25gSowrLP
|
|
163
174
|
architect_py/tests/test_book_building.py,sha256=biqs8X9bw1YSb6mrCDS-ELesdD-P5F6bE3MYXP0BeQ4,1236
|
164
175
|
architect_py/tests/test_encoding.py,sha256=J61Lk2CDIqgdcsj0-KYBZweYh5EQ4XAXsRyM0fdMqfU,1085
|
165
176
|
architect_py/tests/test_marketdata.py,sha256=W26OrL51ONAclBjBcm7trS1QPXtLLjdgnsbDR2kqtIw,4963
|
166
|
-
architect_py/tests/test_order_entry.py,sha256=
|
177
|
+
architect_py/tests/test_order_entry.py,sha256=Jhot92d8nOg7gq-W99hKlABIBBbFJ7OIYSGYyiogfto,5069
|
167
178
|
architect_py/tests/test_orderflow.py,sha256=b4iohhs7YUoJMevlUfLQyIoVqjam7pl0BPs0dSfZhqM,3951
|
168
179
|
architect_py/tests/test_portfolio_management.py,sha256=Q4pburTDJ53hrq2_aRbNAOG3nwbCEsgZQGbI_AMHLxE,709
|
169
|
-
architect_py/tests/test_positions.py,sha256=
|
180
|
+
architect_py/tests/test_positions.py,sha256=fXtFs9xYJoS_BIRBfq4V_DZDYq3zANLfEQS0jY_EiEo,12551
|
170
181
|
architect_py/tests/test_rounding.py,sha256=qjuPIdX6TbfPtfrzotZx6-Aodf4et7j3AswgQ7DQtm4,1363
|
171
182
|
architect_py/tests/test_symbology.py,sha256=74fbUgoycuViMHHnurE2Dnfao75wWu_cmQMyU5XQcdY,3436
|
172
183
|
architect_py/tests/test_sync_client.py,sha256=teaHrp-CMpKIDsGPdnyxvmuW_a3hgFftnsnPsFHz9Tw,946
|
@@ -176,31 +187,31 @@ architect_py/utils/orderbook.py,sha256=JM02NhHbmK3sNaS2Ara8FBY4TvKvtMIzJW1oVd8KC
|
|
176
187
|
architect_py/utils/pandas.py,sha256=Jyiimf6Y5FbTLotUhSIgOnRHMGz7ZvAqNSCHEwZ9eQU,2599
|
177
188
|
architect_py/utils/price_bands.py,sha256=j7ioSA3dx025CD5E2Vg7XQvmjPvxQb-gzQBfQTovpTw,21874
|
178
189
|
architect_py/utils/symbol_parsing.py,sha256=OjJzk2c6QU2s0aJMSyVEzlWD5Vy-RlakJVW7jNHVDJk,845
|
179
|
-
architect_py-5.
|
190
|
+
architect_py-5.2.0.dist-info/licenses/LICENSE,sha256=6P0_5gYN8iPWPZeqA9nxiO3tRQmcSA1ijAVR7C8j1SI,11362
|
180
191
|
examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
181
192
|
examples/book_subscription.py,sha256=1WFQN_QCE8cRS_CIv2k0NxqpK37fA9-Ja2Kfxs8vsb8,1461
|
182
193
|
examples/candles.py,sha256=T71TsxbfXCT6mrJZmTgdTKesJFdQhYP_4AsiNK-8KyQ,756
|
183
194
|
examples/config.py,sha256=rv6x7QYJO6ckvpRcwghyJbkL_lTBPnK0u6nKgkYTvxQ,1858
|
184
|
-
examples/external_cpty.py,sha256=
|
185
|
-
examples/funding_rate_mean_reversion_algo.py,sha256=
|
186
|
-
examples/order_sending.py,sha256=
|
187
|
-
examples/orderflow_channel.py,sha256=
|
195
|
+
examples/external_cpty.py,sha256=r_dtjhImfWq9yrwp3Bp4llicSUgyz3RsVOqexVFy2co,2359
|
196
|
+
examples/funding_rate_mean_reversion_algo.py,sha256=ZAr16v_sP2egcRx1jzl2DxKa66XTgopl8ot30rDx4gc,5650
|
197
|
+
examples/order_sending.py,sha256=kHeXPDyWSjakGYT6ldO8aCw02Kzh6WG_bdHzeAUBUyE,3302
|
198
|
+
examples/orderflow_channel.py,sha256=nAvF1T12wpm2pDvdCQ2QtLWGQiBv3_uBSi97CfC0AzY,2270
|
188
199
|
examples/orderflow_streaming.py,sha256=BtVwCYWBCpytaAFN9u2WPgGCugyNMsGa6nA1dPWuVLs,1300
|
189
|
-
examples/stream_l1_marketdata.py,sha256=
|
190
|
-
examples/stream_l2_marketdata.py,sha256=
|
200
|
+
examples/stream_l1_marketdata.py,sha256=Ojbk0q7A2daPnwqTWSypVoLep9B_eumXuwEH4PbA-fA,781
|
201
|
+
examples/stream_l2_marketdata.py,sha256=lVZsLUJYAPYUpp0voryye2WFZkCzYWVLfb-T4XQ0_Bs,1144
|
191
202
|
examples/termutils.py,sha256=ZZrky5Ftn4UoLPKGffGvUl1Z8CtvDoNjEtUH4S1a_KY,1133
|
192
203
|
examples/trades.py,sha256=0OzWQVTuIrC0KlisY0Tc-3pmWNP0m0-eCSntCV6Qdh8,561
|
193
|
-
examples/tutorial_async.py,sha256=
|
194
|
-
examples/tutorial_sync.py,sha256=
|
195
|
-
scripts/add_imports_to_inits.py,sha256=
|
204
|
+
examples/tutorial_async.py,sha256=CB_VOOqeYp4Q9vJpmtZeaalQdLgm8yfFu9309P1QnX8,2684
|
205
|
+
examples/tutorial_sync.py,sha256=SAUhpR8z1sqjs6q7sse7X0trjdS3-SqhHyrIutcWRsY,2889
|
206
|
+
scripts/add_imports_to_inits.py,sha256=zlR0nkSkCQCMdGlmkfbKHpNk7l9jmr3HCSpC_bRKloU,4618
|
196
207
|
scripts/correct_sync_interface.py,sha256=gTSJLDAT8s-ayN_JqgKbeM6c3DYZOapduS_GIqrvD-A,4134
|
197
|
-
scripts/generate_functions_md.py,sha256
|
208
|
+
scripts/generate_functions_md.py,sha256=X0eS3Htbn3V15qJb6kT19bVHDZaUSGOzXi38k7dazDQ,6261
|
198
209
|
scripts/postprocess_grpc.py,sha256=1A8HCMG3aBAJaORlBTaYyADow8LOcm2EVeRm0xlF0Gc,23606
|
199
210
|
scripts/preprocess_grpc_schema.py,sha256=p9LdoMZzixBSsVx7Dy3_8uJzOy_QwCoVMkAABQKUsBA,22894
|
200
211
|
scripts/prune_graphql_schema.py,sha256=hmfw5FD_iKGKMFkq6H1neZiXXtljFFrOwi2fiusTWE4,6210
|
201
212
|
templates/exceptions.py,sha256=tIHbiO5Q114h9nPwJXsgHvW_bERLwxuNp9Oj41p6t3A,2379
|
202
213
|
templates/juniper_base_client.py,sha256=B8QF4IFSwqBK5UY2aFPbSdYnX9bcwnlxLK4ojPRaW0E,12705
|
203
|
-
architect_py-5.
|
204
|
-
architect_py-5.
|
205
|
-
architect_py-5.
|
206
|
-
architect_py-5.
|
214
|
+
architect_py-5.2.0.dist-info/METADATA,sha256=usXeVPkmQw44zcwfVfFxbtN8quuoUVACSyKCbmTDPXc,2638
|
215
|
+
architect_py-5.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
216
|
+
architect_py-5.2.0.dist-info/top_level.txt,sha256=UjtO97OACFQ9z5MzS-X2wBlt5Ovk1vxakQPKfokI454,40
|
217
|
+
architect_py-5.2.0.dist-info/RECORD,,
|