Commit Graph

14 Commits

Author SHA1 Message Date
agentson
70701bf73a feat: implement trading control commands /stop and /resume (issue #65)
Some checks failed
CI / test (pull_request) Has been cancelled
Add pause/resume functionality for remote trading control via Telegram.

Changes:
- Add pause_trading Event to main.py
- Implement /stop handler (pause trading)
- Implement /resume handler (resume trading)
- Integrate pause logic into both daily and realtime trading loops
- Add 4 comprehensive tests for trading control

Features:
- /stop: Pauses all trading operations
- /resume: Resumes trading operations
- Idempotent: Handles repeated stop/resume gracefully
- Status feedback: Informs if already paused/active
- Works in both daily and realtime trading modes

Security:
- Commands verified by TelegramCommandHandler chat_id check
- Only authorized users can control trading

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 14:40:19 +09:00
agentson
48a99962e3 feat: implement basic commands /start and /help (issue #63)
Some checks failed
CI / test (pull_request) Has been cancelled
Integrate TelegramCommandHandler into main.py and implement
welcome and help commands.

Changes:
- Import TelegramCommandHandler in main.py
- Initialize command handler and register /start and /help
- Start/stop command handler with proper lifecycle management
- Add tests for command content validation

Features:
- /start: Welcome message with bot introduction
- /help: Complete command reference
- Handlers respond with HTML-formatted messages
- Clean startup/shutdown integration

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 13:55:52 +09:00
agentson
0057de4d12 feat: implement daily trading mode with batch decisions (issue #57)
Some checks failed
CI / test (pull_request) Has been cancelled
Add API-efficient daily trading mode for Gemini Free tier compatibility:

## Features

- **Batch Decisions**: GeminiClient.decide_batch() analyzes multiple stocks
  in a single API call using compressed JSON format
- **Daily Trading Mode**: run_daily_session() executes N sessions per day
  at configurable intervals (default: 4 sessions, 6 hours apart)
- **Mode Selection**: TRADE_MODE env var switches between daily (batch)
  and realtime (per-stock) modes
- **Requirements Log**: docs/requirements-log.md tracks user feedback
  chronologically for project evolution

## Configuration

- TRADE_MODE: "daily" (default) | "realtime"
- DAILY_SESSIONS: 1-10 (default: 4)
- SESSION_INTERVAL_HOURS: 1-24 (default: 6)

## API Efficiency

- 2 markets × 4 sessions = 8 API calls/day (within Free tier 20 calls)
- 3 markets × 4 sessions = 12 API calls/day (within Free tier 20 calls)

## Testing

- 9 new batch decision tests (all passing)
- All existing tests maintained (298 passed)

## Documentation

- docs/architecture.md: Trading Modes section with daily vs realtime
- CLAUDE.md: Requirements Management section
- docs/requirements-log.md: Initial entries for API efficiency needs

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 09:28:10 +09:00
agentson
71ac59794e fix: implement comprehensive KIS API rate limiting solution
Some checks failed
CI / test (push) Has been cancelled
Root cause analysis revealed 3 critical issues causing EGW00201 errors:

1. **Hash key bypass** - _get_hash_key() made API calls without rate limiting
   - Every order made 2 API calls but only 1 was rate-limited
   - Fixed by adding rate_limiter.acquire() to _get_hash_key()

2. **Scanner concurrent burst** - scan_market() launched all stocks via asyncio.gather
   - All tasks queued simultaneously creating burst pressure
   - Fixed by adding Semaphore(1) for fully serialized scanning

3. **RPS too aggressive** - 5.0 RPS exceeded KIS API's real ~2 RPS limit
   - Lowered to 2.0 RPS (500ms interval) for maximum safety

Changes:
- src/broker/kis_api.py: Add rate limiter to _get_hash_key()
- src/analysis/scanner.py: Add semaphore-based concurrency control
  - New max_concurrent_scans parameter (default 1, fully serialized)
  - Wrap scan_stock calls with semaphore in _bounded_scan()
  - Remove ineffective asyncio.sleep(0.2) from scan_stock()
- src/config.py: Lower RATE_LIMIT_RPS from 5.0 to 2.0
- tests/test_broker.py: Add 2 tests for hash key rate limiting
- tests/test_volatility.py: Add test for scanner concurrency limit

Results:
- EGW00201 errors: 10 → 0 (100% elimination)
- All 290 tests pass
- 80% code coverage maintained
- Scanner still handles unlimited stocks (just serialized for API safety)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 01:09:34 +09:00
agentson
db0d966a6a fix: properly close telegram client session to prevent resource leak (issue #52)
Some checks failed
CI / test (pull_request) Has been cancelled
Adds telegram.close() to finally block to ensure aiohttp session cleanup.

Changes:
- src/main.py:553 - Add await telegram.close() in shutdown

Before:
- broker.close() called 
- telegram.close() NOT called 
- "Unclosed client session" error on shutdown

After:
- broker.close() called 
- telegram.close() called 
- Clean shutdown, no resource leak errors

Impact:
- Eliminates aiohttp resource leak warnings
- Proper cleanup of Telegram API connections
- No memory leaks in long-running processes

Related:
- KISBroker.close() already handles broker session
- OverseasBroker reuses KISBroker session (no separate close needed)
- TelegramClient has separate session that needs cleanup

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 00:40:31 +09:00
agentson
c57ccc4bca fix: add safe_float() to handle empty string conversions (issue #44)
Some checks failed
CI / test (pull_request) Has been cancelled
Add safe_float() helper function to safely convert API response values
to float, handling empty strings, None, and invalid values that cause
ValueError: "could not convert string to float: ''".

Changes:
- Add safe_float() function in src/main.py with full docstring
- Replace all float() calls with safe_float() in trading_cycle()
  - Domestic market: orderbook prices, balance amounts
  - Overseas market: price data, balance info
- Add 6 comprehensive unit tests for safe_float()

The function handles:
- Empty strings ("") → default (0.0)
- None values → default (0.0)
- Invalid strings ("abc") → default (0.0)
- Valid strings ("123.45") → parsed float
- Float inputs (123.45) → pass through

This prevents crashes when KIS API returns empty strings during
market closed hours or data unavailability.

Fixes: #44

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 00:15:04 +09:00
agentson
3dfd7c0935 fix: handle dict and list formats in overseas balance output2 (issue #41)
Some checks failed
CI / test (pull_request) Has been cancelled
Add type checking for output2 response from get_overseas_balance API.
The API can return either list format [{}] or dict format {}, causing
KeyError when accessing output2[0].

Changes:
- Check isinstance before accessing output2[0]
- Handle list, dict, and empty cases
- Add safe fallback with "or" for empty strings
- Add 3 test cases for list/dict/empty formats

Fixes: #41

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-05 00:04:36 +09:00
agentson
972e71a2f1 feat: integrate TelegramClient into main trading loop (issue #34)
Some checks failed
CI / test (pull_request) Has been cancelled
Integrate Telegram notifications throughout the main trading loop to provide
real-time alerts for critical events and trading activities.

Changes:
- Add TelegramClient initialization in run() function
- Send system startup notification on agent start
- Send market open/close notifications when markets change state
- Send trade execution notifications for BUY/SELL orders
- Send fat finger rejection notifications when orders are blocked
- Send circuit breaker notifications when loss threshold is exceeded
- Pass telegram client to trading_cycle() function
- Add tests for all notification scenarios in test_main.py

All notifications wrapped in try/except to ensure trading continues even
if Telegram API fails. Notifications are non-blocking and do not affect
core trading logic.

Test coverage: 273 tests passed, overall coverage 79%

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 23:42:31 +09:00
agentson
61f5aaf4a3 fix: resolve linting issues in token efficiency implementation
Some checks failed
CI / test (pull_request) Has been cancelled
- Fix ambiguous variable names (l → layer)
- Remove unused imports and variables
- Organize import statements

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 18:35:55 +09:00
agentson
ce952d97b2 feat: implement latency control system with criticality-based prioritization
Some checks failed
CI / test (pull_request) Has been cancelled
Add urgency-based response system to react faster in critical market situations.

Components:
- CriticalityAssessor: Evaluates market conditions (P&L, volatility, volume surge)
  and assigns urgency levels (CRITICAL <5s, HIGH <30s, NORMAL <60s, LOW batch)
- PriorityTaskQueue: Thread-safe priority queue with timeout enforcement,
  metrics tracking, and graceful degradation when full
- Integration with main.py: Assess criticality at trading cycle start,
  monitor latency per criticality level, log queue metrics

Auto-elevate to CRITICAL when:
- P&L < -2.5% (near circuit breaker at -3.0%)
- Stock moves >5% in 1 minute
- Volume surge >10x average

Integration with Volatility Hunter:
- Uses VolatilityAnalyzer.calculate_momentum() for assessment
- Pulls volatility scores from Context Tree L7_REALTIME
- Auto-detects market conditions for criticality

Tests:
- 30 comprehensive tests covering criticality assessment, priority queue,
  timeout enforcement, metrics tracking, and integration scenarios
- Coverage: criticality.py 100%, priority_queue.py 96%
- All 157 tests pass

Resolves issue #21 - Pillar 1: 속도와 시의성의 최적화

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 16:45:16 +09:00
agentson
62b1a1f37a feat: implement Volatility Hunter for real-time market scanning
Some checks failed
CI / test (pull_request) Has been cancelled
Implements issue #20 - Behavioral Rule: Volatility Hunter

Components:
1. src/analysis/volatility.py
   - VolatilityAnalyzer with ATR calculation
   - Price change tracking (1m, 5m, 15m intervals)
   - Volume surge detection (ratio vs average)
   - Price-volume divergence analysis
   - Momentum scoring (0-100 scale)
   - Breakout/breakdown detection

2. src/analysis/scanner.py
   - MarketScanner for real-time stock scanning
   - Scans all available stocks every 60 seconds
   - Ranks by momentum score
   - Identifies top 5 movers per market
   - Dynamic watchlist updates

3. Integration with src/main.py
   - Auto-adjust WATCHLISTS dynamically
   - Replace laggards with leaders (max 2 per scan)
   - Volume confirmation required
   - Integrated with Context Tree L7 (real-time layer)

4. Comprehensive tests
   - 22 tests in tests/test_volatility.py
   - 99% coverage for analysis module
   - Tests for all volatility calculations
   - Tests for scanner ranking and watchlist updates
   - All tests passing

Key Features:
- Scan ALL stocks, not just current watchlist
- Dynamic watchlist that adapts to market leaders
- Context Tree integration for real-time data storage
- Breakout detection with volume confirmation
- Multi-timeframe momentum analysis

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 16:29:06 +09:00
agentson
2f9efdad64 feat: integrate decision logger with main trading loop
Some checks failed
CI / test (pull_request) Has been cancelled
- Add DecisionLogger to main.py trading cycle
- Log all decisions with context snapshot (L1-L2 layers)
- Capture market data and balance info in context
- Add comprehensive tests (9 tests, 100% coverage)
- All tests passing (63 total)

Implements issue #17 acceptance criteria:
-  decision_logs table with proper schema
-  DecisionLogger class with all required methods
-  Automatic logging in trading loop
-  Tests achieve 100% coverage of decision_logger.py
- ⚠️  Context snapshot uses L1-L2 data (L3-L7 pending issue #15)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 15:47:53 +09:00
agentson
b26ff0c1b8 feat: implement timezone-based global market auto-selection
Some checks failed
CI / test (pull_request) Has been cancelled
Implement comprehensive multi-market trading system with automatic
market selection based on timezone and trading hours.

## New Features
- Market schedule module with 10 global markets (KR, US, JP, HK, CN, VN)
- Overseas broker for KIS API international stock trading
- Automatic market detection based on current time and timezone
- Next market open waiting logic when all markets closed
- ConnectionError retry with exponential backoff (max 3 attempts)

## Architecture Changes
- Market-aware trading cycle with domestic/overseas broker routing
- Market context in AI prompts for better decision making
- Database schema extended with market and exchange_code columns
- Config setting ENABLED_MARKETS for market selection

## Testing
- 19 new tests for market schedule (timezone, DST, lunch breaks)
- All 54 tests passing
- Lint fixes with ruff

## Files Added
- src/markets/schedule.py - Market schedule and timezone logic
- src/broker/overseas.py - KIS overseas stock API client
- tests/test_market_schedule.py - Market schedule test suite

## Files Modified
- src/main.py - Multi-market main loop with retry logic
- src/config.py - ENABLED_MARKETS setting
- src/db.py - market/exchange_code columns with migration
- src/brain/gemini_client.py - Dynamic market context in prompts

Resolves #5

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-04 09:29:25 +09:00
d1750af80f Add complete Ouroboros trading system with TDD test suite
Some checks failed
CI / test (push) Has been cancelled
Implement the full autonomous trading agent architecture:
- KIS broker with async API, token refresh, leaky bucket rate limiter, and hash key signing
- Gemini-powered decision engine with JSON parsing and confidence threshold enforcement
- Risk manager with circuit breaker (-3% P&L) and fat finger protection (30% cap)
- Evolution engine for self-improving strategy generation via failure analysis
- 35 passing tests written TDD-first covering risk, broker, and brain modules
- CI/CD pipeline, Docker multi-stage build, and AI agent context docs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 02:08:48 +09:00