|
21 | 21 | Power, |
22 | 22 | Price, |
23 | 23 | PublicTrade, |
| 24 | + Trade, |
24 | 25 | ) |
25 | 26 |
|
26 | 27 |
|
@@ -77,6 +78,44 @@ async def list_trades(url: str, key: str, *, delivery_start: datetime) -> None: |
77 | 78 | print_public_trade(trade) |
78 | 79 |
|
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) |
| 115 | + async for trade in stream: |
| 116 | + print_trade(trade) |
| 117 | + |
| 118 | + |
80 | 119 | async def list_orders( |
81 | 120 | url: str, key: str, *, delivery_start: datetime, gid: int |
82 | 121 | ) -> None: |
@@ -235,6 +274,44 @@ def print_public_trade(trade: PublicTrade) -> None: |
235 | 274 | print(",".join(v.name if isinstance(v, Enum) else str(v) for v in values)) |
236 | 275 |
|
237 | 276 |
|
| 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 | + |
238 | 315 | def print_order_header() -> None: |
239 | 316 | """Print order header in CSV format.""" |
240 | 317 | header = ( |
|
0 commit comments