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.
Files changed (41) hide show
  1. architect_py/__init__.py +24 -4
  2. architect_py/async_client.py +66 -57
  3. architect_py/async_cpty.py +422 -0
  4. architect_py/client.pyi +2 -34
  5. architect_py/grpc/models/Accounts/ResetPaperAccountRequest.py +59 -0
  6. architect_py/grpc/models/Accounts/ResetPaperAccountResponse.py +20 -0
  7. architect_py/grpc/models/Boss/OptionsTransactionsRequest.py +42 -0
  8. architect_py/grpc/models/Boss/OptionsTransactionsResponse.py +27 -0
  9. architect_py/grpc/models/OptionsMarketdata/OptionsChain.py +5 -5
  10. architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeks.py +5 -5
  11. architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeksRequest.py +5 -1
  12. architect_py/grpc/models/OptionsMarketdata/OptionsChainRequest.py +5 -1
  13. architect_py/grpc/models/OptionsMarketdata/OptionsContract.py +45 -0
  14. architect_py/grpc/models/OptionsMarketdata/OptionsContractGreeksRequest.py +40 -0
  15. architect_py/grpc/models/OptionsMarketdata/OptionsContractRequest.py +40 -0
  16. architect_py/grpc/models/OptionsMarketdata/OptionsExpirations.py +4 -1
  17. architect_py/grpc/models/OptionsMarketdata/OptionsExpirationsRequest.py +8 -1
  18. architect_py/grpc/models/OptionsMarketdata/OptionsGreeks.py +58 -0
  19. architect_py/grpc/models/OptionsMarketdata/OptionsWraps.py +28 -0
  20. architect_py/grpc/models/OptionsMarketdata/OptionsWrapsRequest.py +40 -0
  21. architect_py/grpc/models/__init__.py +11 -1
  22. architect_py/grpc/models/definitions.py +37 -86
  23. architect_py/grpc/orderflow.py +3 -7
  24. architect_py/grpc/server.py +1 -3
  25. architect_py/tests/test_order_entry.py +120 -1
  26. architect_py/tests/test_positions.py +208 -17
  27. {architect_py-5.1.5.dist-info → architect_py-5.2.0.dist-info}/METADATA +1 -1
  28. {architect_py-5.1.5.dist-info → architect_py-5.2.0.dist-info}/RECORD +41 -30
  29. examples/external_cpty.py +72 -66
  30. examples/funding_rate_mean_reversion_algo.py +4 -4
  31. examples/order_sending.py +3 -3
  32. examples/orderflow_channel.py +75 -56
  33. examples/stream_l1_marketdata.py +3 -1
  34. examples/stream_l2_marketdata.py +3 -1
  35. examples/tutorial_async.py +3 -2
  36. examples/tutorial_sync.py +4 -3
  37. scripts/add_imports_to_inits.py +6 -2
  38. scripts/generate_functions_md.py +2 -1
  39. {architect_py-5.1.5.dist-info → architect_py-5.2.0.dist-info}/WHEEL +0 -0
  40. {architect_py-5.1.5.dist-info → architect_py-5.2.0.dist-info}/licenses/LICENSE +0 -0
  41. {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.grpc.models.definitions import OrderType
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.async_client import AsyncClient, OrderDir, OrderType
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
- account_id = accounts[0].account.id
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="CME",
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="CME",
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="CME",
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="CME",
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="CME",
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="CME",
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="CME",
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="CME",
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="CME",
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="CME",
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,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: architect-py
3
- Version: 5.1.5
3
+ Version: 5.2.0
4
4
  Summary: Python SDK for the Architect trading platform and brokerage.
5
5
  Author-email: "Architect Financial Technologies, Inc." <hello@architect.co>
6
6
  License-Expression: Apache-2.0
@@ -1,7 +1,8 @@
1
- architect_py/__init__.py,sha256=jrffx1fAChnV8djCoFdEmsTwyHTCkw0_P3RvSimjcx8,16666
2
- architect_py/async_client.py,sha256=jU_P4McMXGsKhUIov0CEXG27qi4SdfIVZkU3uFc-md8,65827
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=w8yM9u2TQvm12DHoEunq0CKTQ0EVOqrkh_iuNMf1Dk8,26113
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=XKysE11lK7yKXMctLvNTqq4g5F_DoKJT_8Jx37bgTLE,4836
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=Abmdfe1eYbctVgzoJYBBBLpd7UD70FbYQLtJImSyRzs,1934
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=DVsP-OURNPSlFKWxQGShF7ytvOUJc2_fQ-ng5kOh1X8,9366
32
- architect_py/grpc/models/definitions.py,sha256=fWVidMJ4pEzP7Z6bLhyYlSYxGttfH40Vgki1P9b47ow,82836
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=8Sdp57aUXlW13X1POlBKxxaEZofwRZ7VGDLzq1l9GoU,732
132
- architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeks.py,sha256=Jhb5CM4t84EdETDO3SOakHkuaWG30Dm4lREpKgBFzFM,742
133
- architect_py/grpc/models/OptionsMarketdata/OptionsChainGreeksRequest.py,sha256=Mmwv-3IGp7TpyogwLqh0HDgdrvuJjVdmKdnGJwlP_vQ,1145
134
- architect_py/grpc/models/OptionsMarketdata/OptionsChainRequest.py,sha256=LE2MkLUCLKdYpSjqrP3DdZiCB31mv4KEnsNYKZD3TQw,1088
135
- architect_py/grpc/models/OptionsMarketdata/OptionsExpirations.py,sha256=JwHKc6aaSrSL5HTFMuV_BSdPdipCevj8WfS214iHIQw,702
136
- architect_py/grpc/models/OptionsMarketdata/OptionsExpirationsRequest.py,sha256=m_7ZIQk7O1WZLoEd-euoNgKFin13S2bFO4oBWbpApJg,1018
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=5HDjzNJOC7lSx4driP4mDJr9HuR2cFTwO8s1haGXl9E,1284
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=zVO6qmYVn7heQt2C17deYUUCAmJ-u6cnekTmqKm8Vh0,5925
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.1.5.dist-info/licenses/LICENSE,sha256=6P0_5gYN8iPWPZeqA9nxiO3tRQmcSA1ijAVR7C8j1SI,11362
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=xxGXONXwoWIS8ys0SgxHLSmntAi1BlwV2NR9WD1kvpc,2527
185
- examples/funding_rate_mean_reversion_algo.py,sha256=gv35eKiJeyU7-A6hPtFLsXxmgUxFQSMPYKV-gh2afo0,5650
186
- examples/order_sending.py,sha256=0M5eK20nDO5KXJZV-yidC7HR_RHP3uJL9f-q9FF0BIs,3313
187
- examples/orderflow_channel.py,sha256=L6W9aZS95Xmjl1IvrKA1Cp06r9-QOERsBETLOg3EImk,1891
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=ZkXcm5XOpG6epPn3EhmqlVJyYBwh87I0QHtuOmKjRpg,728
190
- examples/stream_l2_marketdata.py,sha256=AeVOBBLdg-0OQE0gouHiLaUfGAAmUoVxif9XBrRo1tQ,1091
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=FNMjP2WmszRB0OXoMbshJ775LoPDzm55UZICa9ztr5w,2639
194
- examples/tutorial_sync.py,sha256=w5Sqa0YFh0XnpoXuhD3WsKRKpR5cuTTNb7pCp-Aqnz0,2846
195
- scripts/add_imports_to_inits.py,sha256=bryhz6RpKAJsSieVMnXnRyLp8evNkpOsNUkBUPkk1WQ,4518
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=-rVRhbHlDodGH2a32UCsMLIpgXtDvOhBmkHa0RqDpCA,6232
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.1.5.dist-info/METADATA,sha256=mUUxF_AZbqF0dHqRcn1mivlye9rkUi1KMogf-Qqw9jQ,2638
204
- architect_py-5.1.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
205
- architect_py-5.1.5.dist-info/top_level.txt,sha256=UjtO97OACFQ9z5MzS-X2wBlt5Ovk1vxakQPKfokI454,40
206
- architect_py-5.1.5.dist-info/RECORD,,
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,,