fix: resolve async execution and position storage issues

- Fix async call in model_day_executor.py by wrapping with asyncio.run()
  Resolves RuntimeWarning where run_trading_session coroutine was never awaited
- Remove register_agent() call in API mode to prevent file-based position storage
  Position data is now stored exclusively in SQLite database (jobs.db)
- Update test mocks to use AsyncMock for async run_trading_session method

This fixes production deployment issues:
1. Trading sessions now execute properly (async bug)
2. No position files created, database-only storage
3. All tests pass

Closes issue with no trades being executed in production
This commit is contained in:
2025-11-02 17:16:55 -05:00
parent 71ec53db45
commit 396a2747d3
2 changed files with 9 additions and 5 deletions

View File

@@ -11,6 +11,7 @@ This module provides:
import logging import logging
import os import os
import asyncio
from typing import Dict, Any, Optional, List, TYPE_CHECKING from typing import Dict, Any, Optional, List, TYPE_CHECKING
from pathlib import Path from pathlib import Path
@@ -118,7 +119,7 @@ class ModelDayExecutor:
# Run trading session # Run trading session
logger.info(f"Running trading session for {self.model_sig} on {self.date}") logger.info(f"Running trading session for {self.model_sig} on {self.date}")
session_result = agent.run_trading_session(self.date) session_result = asyncio.run(agent.run_trading_session(self.date))
# Persist results to SQLite # Persist results to SQLite
self._write_results_to_db(agent, session_result) self._write_results_to_db(agent, session_result)
@@ -211,8 +212,10 @@ class ModelDayExecutor:
init_date=config.get("date_range", {}).get("init_date", "2025-10-13") init_date=config.get("date_range", {}).get("init_date", "2025-10-13")
) )
# Register agent (creates initial position if needed) # Note: In API mode, we don't call register_agent() because:
agent.register_agent() # - Position data is stored in SQLite database, not files
# - Database initialization is handled by JobManager
# - File-based position tracking is only for standalone/CLI mode
return agent return agent

View File

@@ -14,7 +14,7 @@ Tests verify:
import pytest import pytest
import json import json
from unittest.mock import Mock, patch, MagicMock from unittest.mock import Mock, patch, MagicMock, AsyncMock
from pathlib import Path from pathlib import Path
@@ -29,7 +29,8 @@ def create_mock_agent(positions=None, last_trade=None, current_prices=None,
mock_agent.get_current_prices.return_value = current_prices or {} mock_agent.get_current_prices.return_value = current_prices or {}
mock_agent.get_reasoning_steps.return_value = reasoning_steps or [] mock_agent.get_reasoning_steps.return_value = reasoning_steps or []
mock_agent.get_tool_usage.return_value = tool_usage or {} mock_agent.get_tool_usage.return_value = tool_usage or {}
mock_agent.run_trading_session.return_value = session_result or {"success": True} # run_trading_session is async, so use AsyncMock
mock_agent.run_trading_session = AsyncMock(return_value=session_result or {"success": True})
return mock_agent return mock_agent