Skip to content

Commit 2e97971

Browse files
authored
Add receive-gridpool-trades command to CLI tool (#104)
Similarly to list-gridpool-orders this list trades for a given gridpool ID and optionally contract delivery start.
2 parents 72fa1dc + 17250a1 commit 2e97971

File tree

3 files changed

+97
-4
lines changed

3 files changed

+97
-4
lines changed

RELEASE_NOTES.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
## New Features
1212

1313
* Add helper function to support creating quantities that conform to the API expectations.
14+
* Add `receive-gridpool-trades` command to CLI tool.
1415

1516
<!-- Here goes the main new features and examples or instructions on how to use them -->
1617

src/frequenz/client/electricity_trading/cli/__main__.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
from frequenz.client.electricity_trading.cli.etrading import (
1717
create_order as run_create_order,
1818
)
19+
from frequenz.client.electricity_trading.cli.etrading import (
20+
list_gridpool_trades as run_list_gridpool_trades,
21+
)
1922
from frequenz.client.electricity_trading.cli.etrading import (
2023
list_orders as run_list_orders,
2124
)
@@ -50,6 +53,18 @@ def receive_trades(url: str, key: str, *, start: datetime) -> None:
5053
asyncio.run(run_list_trades(url=url, key=key, delivery_start=start))
5154

5255

56+
@cli.command()
57+
@click.option("--url", required=True, type=str)
58+
@click.option("--key", required=True, type=str)
59+
@click.option("--gid", required=True, type=int)
60+
@click.option("--start", default=None, type=iso)
61+
def receive_gridpool_trades(url: str, key: str, gid: int, *, start: datetime) -> None:
62+
"""List and/or stream orders."""
63+
asyncio.run(
64+
run_list_gridpool_trades(url=url, key=key, gid=gid, delivery_start=start)
65+
)
66+
67+
5368
@cli.command()
5469
@click.option("--url", required=True, type=str)
5570
@click.option("--key", required=True, type=str)

src/frequenz/client/electricity_trading/cli/etrading.py

Lines changed: 81 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
Power,
2222
Price,
2323
PublicTrade,
24+
Trade,
2425
)
2526

2627

@@ -54,7 +55,7 @@ async def list_trades(url: str, key: str, *, delivery_start: datetime) -> None:
5455
"""
5556
client = Client(server_url=url, auth_key=key)
5657

57-
print_trade_header()
58+
print_public_trade_header()
5859

5960
delivery_period = None
6061
# If delivery period is selected, list historical trades also
@@ -67,12 +68,50 @@ async def list_trades(url: str, key: str, *, delivery_start: datetime) -> None:
6768
lst = client.list_public_trades(delivery_period=delivery_period)
6869

6970
async for trade in lst:
70-
print_trade(trade)
71+
print_public_trade(trade)
7172

7273
if delivery_start <= datetime.now(timezone.utc):
7374
return
7475

7576
stream = await client.stream_public_trades(delivery_period=delivery_period)
77+
async for trade in stream:
78+
print_public_trade(trade)
79+
80+
81+
async def list_gridpool_trades(
82+
url: str, key: str, gid: int, *, delivery_start: datetime
83+
) -> None:
84+
"""List gridpool trades and stream new gridpool trades.
85+
86+
Optionally a delivery_start can be provided to filter the trades by delivery period.
87+
88+
Args:
89+
url: URL of the trading API.
90+
key: API key.
91+
gid: Gridpool ID.
92+
delivery_start: Start of the delivery period or None.
93+
"""
94+
client = Client(server_url=url, auth_key=key)
95+
96+
print_trade_header()
97+
98+
delivery_period = None
99+
# If delivery period is selected, list historical trades also
100+
if delivery_start is not None:
101+
check_delivery_start(delivery_start)
102+
delivery_period = DeliveryPeriod(
103+
start=delivery_start,
104+
duration=timedelta(minutes=15),
105+
)
106+
lst = client.list_gridpool_trades(gid, delivery_period=delivery_period)
107+
108+
async for trade in lst:
109+
print_trade(trade)
110+
111+
if delivery_start and delivery_start <= datetime.now(timezone.utc):
112+
return
113+
114+
stream = await client.stream_gridpool_trades(gid, delivery_period=delivery_period)
76115
async for trade in stream:
77116
print_trade(trade)
78117

@@ -197,7 +236,7 @@ async def cancel_order(
197236
await client.cancel_gridpool_order(gridpool_id, order_id)
198237

199238

200-
def print_trade_header() -> None:
239+
def print_public_trade_header() -> None:
201240
"""Print trade header in CSV format."""
202241
header = (
203242
"public_trade_id,"
@@ -216,7 +255,7 @@ def print_trade_header() -> None:
216255
print(header)
217256

218257

219-
def print_trade(trade: PublicTrade) -> None:
258+
def print_public_trade(trade: PublicTrade) -> None:
220259
"""Print trade details to stdout in CSV format."""
221260
values = (
222261
trade.public_trade_id,
@@ -235,6 +274,44 @@ def print_trade(trade: PublicTrade) -> None:
235274
print(",".join(v.name if isinstance(v, Enum) else str(v) for v in values))
236275

237276

277+
def print_trade_header() -> None:
278+
"""Print trade header in CSV format."""
279+
header = (
280+
"trade_id,"
281+
"order_id,"
282+
"execution_time,"
283+
"delivery_period_start,"
284+
"delivery_period_duration,"
285+
"delivery_area_code,"
286+
"delivery_area_code_type,"
287+
"side,"
288+
"quantity_mw,"
289+
"currency,"
290+
"price,"
291+
"state "
292+
)
293+
print(header)
294+
295+
296+
def print_trade(trade: Trade) -> None:
297+
"""Print trade details to stdout in CSV format."""
298+
values = (
299+
trade.id,
300+
trade.order_id,
301+
trade.execution_time.isoformat(),
302+
trade.delivery_period.start.isoformat(),
303+
trade.delivery_period.duration,
304+
trade.delivery_area.code,
305+
trade.delivery_area.code_type,
306+
trade.side,
307+
trade.quantity.mw,
308+
trade.price.currency,
309+
trade.price.amount,
310+
trade.state,
311+
)
312+
print(",".join(v.name if isinstance(v, Enum) else str(v) for v in values))
313+
314+
238315
def print_order_header() -> None:
239316
"""Print order header in CSV format."""
240317
header = (

0 commit comments

Comments
 (0)