summaryrefslogtreecommitdiff
path: root/services
diff options
context:
space:
mode:
Diffstat (limited to 'services')
-rw-r--r--services/api/tests/test_orders_router.py3
-rw-r--r--services/api/tests/test_portfolio_router.py4
-rw-r--r--services/order-executor/src/order_executor/main.py12
-rw-r--r--services/portfolio-manager/src/portfolio_manager/main.py9
-rw-r--r--services/portfolio-manager/tests/test_portfolio.py112
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")