diff options
Diffstat (limited to 'services')
| -rw-r--r-- | services/api/tests/test_orders_router.py | 3 | ||||
| -rw-r--r-- | services/api/tests/test_portfolio_router.py | 4 | ||||
| -rw-r--r-- | services/order-executor/src/order_executor/main.py | 12 | ||||
| -rw-r--r-- | services/portfolio-manager/src/portfolio_manager/main.py | 9 | ||||
| -rw-r--r-- | services/portfolio-manager/tests/test_portfolio.py | 112 |
5 files changed, 85 insertions, 55 deletions
diff --git a/services/api/tests/test_orders_router.py b/services/api/tests/test_orders_router.py index 899fb27..0658619 100644 --- a/services/api/tests/test_orders_router.py +++ b/services/api/tests/test_orders_router.py @@ -1,7 +1,6 @@ """Tests for orders API router.""" + import pytest -from decimal import Decimal -from datetime import datetime, timezone from unittest.mock import AsyncMock, MagicMock from fastapi.testclient import TestClient from fastapi import FastAPI diff --git a/services/api/tests/test_portfolio_router.py b/services/api/tests/test_portfolio_router.py index 0993923..f2584ea 100644 --- a/services/api/tests/test_portfolio_router.py +++ b/services/api/tests/test_portfolio_router.py @@ -1,8 +1,8 @@ """Tests for portfolio API router.""" + import pytest from decimal import Decimal -from datetime import datetime, timezone -from unittest.mock import AsyncMock, MagicMock, patch +from unittest.mock import AsyncMock, MagicMock from fastapi.testclient import TestClient from fastapi import FastAPI diff --git a/services/order-executor/src/order_executor/main.py b/services/order-executor/src/order_executor/main.py index 930517e..3fe4c12 100644 --- a/services/order-executor/src/order_executor/main.py +++ b/services/order-executor/src/order_executor/main.py @@ -90,21 +90,15 @@ async def run() -> None: "processing_pending_signal", signal_id=str(signal.id), symbol=signal.symbol ) await executor.execute(signal) - metrics.events_processed.labels( - service="order-executor", event_type="signal" - ).inc() + metrics.events_processed.labels(service="order-executor", event_type="signal").inc() await broker.ack(stream, GROUP, msg_id) except Exception as exc: log.error("pending_process_failed", error=str(exc), msg_id=msg_id) - metrics.errors_total.labels( - service="order-executor", error_type="processing" - ).inc() + metrics.errors_total.labels(service="order-executor", error_type="processing").inc() try: while True: - messages = await broker.read_group( - stream, GROUP, CONSUMER, count=10, block=5000 - ) + messages = await broker.read_group(stream, GROUP, CONSUMER, count=10, block=5000) for msg_id, msg in messages: try: event = Event.from_dict(msg) diff --git a/services/portfolio-manager/src/portfolio_manager/main.py b/services/portfolio-manager/src/portfolio_manager/main.py index 87e4c64..a6823ae 100644 --- a/services/portfolio-manager/src/portfolio_manager/main.py +++ b/services/portfolio-manager/src/portfolio_manager/main.py @@ -1,7 +1,6 @@ """Portfolio Manager Service entry point.""" import asyncio -from decimal import Decimal from shared.broker import RedisBroker from shared.db import Database @@ -111,15 +110,11 @@ async def run() -> None: await broker.ack(ORDERS_STREAM, GROUP, msg_id) except Exception as exc: log.error("pending_process_failed", error=str(exc), msg_id=msg_id) - metrics.errors_total.labels( - service="portfolio-manager", error_type="processing" - ).inc() + metrics.errors_total.labels(service="portfolio-manager", error_type="processing").inc() try: while True: - messages = await broker.read_group( - ORDERS_STREAM, GROUP, CONSUMER, count=10, block=1000 - ) + messages = await broker.read_group(ORDERS_STREAM, GROUP, CONSUMER, count=10, block=1000) for msg_id, msg in messages: try: event = Event.from_dict(msg) diff --git a/services/portfolio-manager/tests/test_portfolio.py b/services/portfolio-manager/tests/test_portfolio.py index 5a7ac64..768e071 100644 --- a/services/portfolio-manager/tests/test_portfolio.py +++ b/services/portfolio-manager/tests/test_portfolio.py @@ -63,19 +63,31 @@ def test_realized_pnl_on_sell() -> None: tracker = PortfolioTracker() # Buy at 50000 - tracker.apply_order(Order( - signal_id="s1", symbol="BTCUSDT", side=OrderSide.BUY, - type=OrderType.MARKET, price=Decimal("50000"), - quantity=Decimal("0.1"), status=OrderStatus.FILLED, - )) + tracker.apply_order( + Order( + signal_id="s1", + symbol="BTCUSDT", + side=OrderSide.BUY, + type=OrderType.MARKET, + price=Decimal("50000"), + quantity=Decimal("0.1"), + status=OrderStatus.FILLED, + ) + ) assert tracker.realized_pnl == Decimal("0") # Sell at 55000 — profit of 500 - tracker.apply_order(Order( - signal_id="s2", symbol="BTCUSDT", side=OrderSide.SELL, - type=OrderType.MARKET, price=Decimal("55000"), - quantity=Decimal("0.1"), status=OrderStatus.FILLED, - )) + tracker.apply_order( + Order( + signal_id="s2", + symbol="BTCUSDT", + side=OrderSide.SELL, + type=OrderType.MARKET, + price=Decimal("55000"), + quantity=Decimal("0.1"), + status=OrderStatus.FILLED, + ) + ) assert tracker.realized_pnl == Decimal("500") @@ -83,16 +95,28 @@ def test_realized_pnl_on_loss() -> None: """Selling at a loss should track negative realized PnL.""" tracker = PortfolioTracker() - tracker.apply_order(Order( - signal_id="s1", symbol="BTCUSDT", side=OrderSide.BUY, - type=OrderType.MARKET, price=Decimal("50000"), - quantity=Decimal("0.1"), status=OrderStatus.FILLED, - )) - tracker.apply_order(Order( - signal_id="s2", symbol="BTCUSDT", side=OrderSide.SELL, - type=OrderType.MARKET, price=Decimal("45000"), - quantity=Decimal("0.1"), status=OrderStatus.FILLED, - )) + tracker.apply_order( + Order( + signal_id="s1", + symbol="BTCUSDT", + side=OrderSide.BUY, + type=OrderType.MARKET, + price=Decimal("50000"), + quantity=Decimal("0.1"), + status=OrderStatus.FILLED, + ) + ) + tracker.apply_order( + Order( + signal_id="s2", + symbol="BTCUSDT", + side=OrderSide.SELL, + type=OrderType.MARKET, + price=Decimal("45000"), + quantity=Decimal("0.1"), + status=OrderStatus.FILLED, + ) + ) assert tracker.realized_pnl == Decimal("-500") @@ -101,24 +125,42 @@ def test_realized_pnl_accumulates() -> None: tracker = PortfolioTracker() # Buy 0.2 at 50000 - tracker.apply_order(Order( - signal_id="s1", symbol="BTCUSDT", side=OrderSide.BUY, - type=OrderType.MARKET, price=Decimal("50000"), - quantity=Decimal("0.2"), status=OrderStatus.FILLED, - )) + tracker.apply_order( + Order( + signal_id="s1", + symbol="BTCUSDT", + side=OrderSide.BUY, + type=OrderType.MARKET, + price=Decimal("50000"), + quantity=Decimal("0.2"), + status=OrderStatus.FILLED, + ) + ) # Sell 0.1 at 55000 -> +500 - tracker.apply_order(Order( - signal_id="s2", symbol="BTCUSDT", side=OrderSide.SELL, - type=OrderType.MARKET, price=Decimal("55000"), - quantity=Decimal("0.1"), status=OrderStatus.FILLED, - )) + tracker.apply_order( + Order( + signal_id="s2", + symbol="BTCUSDT", + side=OrderSide.SELL, + type=OrderType.MARKET, + price=Decimal("55000"), + quantity=Decimal("0.1"), + status=OrderStatus.FILLED, + ) + ) # Sell 0.1 at 60000 -> +1000 - tracker.apply_order(Order( - signal_id="s3", symbol="BTCUSDT", side=OrderSide.SELL, - type=OrderType.MARKET, price=Decimal("60000"), - quantity=Decimal("0.1"), status=OrderStatus.FILLED, - )) + tracker.apply_order( + Order( + signal_id="s3", + symbol="BTCUSDT", + side=OrderSide.SELL, + type=OrderType.MARKET, + price=Decimal("60000"), + quantity=Decimal("0.1"), + status=OrderStatus.FILLED, + ) + ) assert tracker.realized_pnl == Decimal("1500") |
