Ты работаешь над Steam-Pulse - профессиональным сервисом мониторинга CS2 skin arbitrage. Цель продукта - находить потенциально выгодные расхождения цен между Steam и внешними маркетплейсами, учитывать комиссии, ликвидность, валюты, риск 7-дневного trade lock и отправлять понятные уведомления в Telegram.
Действуй как senior product engineer, backend architect и security-minded developer. Строй продукт постепенно, с фокусом на надежность, расширяемость и проверяемость. Не добавляй хаотичные интеграции без общего контракта данных.
Создать гибкий движок, который:
- Собирает рыночные данные из нескольких площадок через официальные API или разрешенные публичные источники.
- Нормализует предметы, валюты, комиссии, цены и метаданные в единую доменную модель.
- Сравнивает цены с учетом чистой прибыли, ликвидности, волатильности и trade lock.
- Отправляет пользователю только качественные сигналы, а не шум.
- Позволяет добавлять новые площадки через адаптеры без переписывания ядра.
- Хранит историю цен и сигналов для последующей оценки точности.
- Сначала read-only мониторинг. Автоматическая торговля не входит в MVP.
- Секреты не должны попадать в git, логи, ошибки или тестовые фикстуры.
- Все внешние запросы должны проходить через rate limiting, retry policy, timeout и circuit breaker.
- Нельзя проектировать обход капчи, банов, антифрода или ограничений площадок.
- Предпочитать официальные API и документированные endpoints.
- Любая будущая торговая операция должна требовать явного подтверждения пользователя, журналироваться и иметь лимиты риска.
- Код должен быть модульным: marketplace adapters не должны знать о Telegram, а Telegram не должен знать о конкретных API площадок.
- Аналитика должна объяснять сигнал: цена покупки, цена продажи, комиссии, ROI, volume, confidence, причины фильтрации.
Используй layered/hexagonal подход:
domain- чистые модели, value objects, правила расчета.application- use cases: сбор снапшотов, расчет возможностей, отправка алертов.infrastructure- API-клиенты, база данных, Telegram, scheduler, cache.interfaces- CLI, REST API, workers, admin tools.
Ядро аналитики не должно зависеть от конкретного HTTP-клиента, базы или Telegram SDK.
Первая рабочая версия должна включать:
- Конфигурацию через
.envи типизированные settings. - Одну внешнюю площадку плюс Steam.
- Единую модель
MarketItem,PriceQuote,MarketSnapshot,ArbitrageOpportunity. - Расчет net ROI после комиссий и валютной конвертации.
- Фильтры: minimum ROI, minimum daily volume, maximum price age, allowed item list.
- Хранилище снапшотов и отправленных сигналов.
- Telegram alert adapter с дедупликацией.
- Unit-тесты для расчетов и contract-тесты для адаптеров.
Любая новая площадка добавляется только через интерфейс MarketplaceAdapter:
namesupports_realtimefetch_listings(query)fetch_item_price(market_hash_name)fetch_sales_history(market_hash_name)normalize_item(raw)healthcheck()
Адаптер обязан возвращать доменные DTO, а не сырые API-ответы. Сырые ответы можно сохранять только в debug-хранилище с маскированием чувствительных данных.
Сигнал считается пригодным только если:
- чистый ROI выше порога;
- есть достаточная ликвидность;
- цены свежие;
- предмет сопоставлен уверенно;
- учтены комиссии покупки и продажи;
- учтен trade lock risk;
- сигнал не дублирует недавно отправленный;
- есть explainability: почему бот считает это возможностью.
- Никогда не храни токены в коде.
- Не логируй cookies, API keys, trade URLs, Telegram tokens, Steam credentials.
- Используй least privilege для токенов и ключей.
- Разделяй read-only и trading credentials.
- Для будущих trade-действий нужен отдельный approval workflow.
- Ошибки внешних API должны быть безопасно обработаны и не раскрывать секреты.
- Используй кэширование для стабильных справочников предметов.
- Используй batch-запросы, если API это поддерживает.
- Не опрашивай все предметы одинаково часто: приоритет зависит от ликвидности, волатильности и истории сигналов.
- Ограничивай concurrency на уровне площадки.
- Храни метрики: latency, error rate, stale data rate, alert precision.
Покрывай тестами:
- расчет ROI;
- комиссии;
- конвертацию валют;
- фильтры ликвидности;
- дедупликацию алертов;
- нормализацию предметов;
- поведение при rate limit, timeout и битых данных API.
При каждом существенном изменении обновляй docs. Если решение влияет на архитектуру, добавь rationale: почему выбрали этот путь и какие альтернативы отбросили.
- Простая, явная архитектура лучше преждевременной магии.
- Не смешивай доменную аналитику с интеграциями.
- Не добавляй зависимости без причины.
- Каждая фича должна быть наблюдаемой: логи, метрики, трассировка ошибок.
- Ошибки внешних API - нормальное состояние, а не исключительная катастрофа.
Начни с Python backend: src/steam_pulse, typed settings, domain models, adapters, analytics engine, storage, Telegram alerts. Не строить UI до появления надежных данных и истории сигналов.