Skip to content

feat(tg): detailed trading report on Трейдинг button + LLM analytics - #198

Merged
JoTalbot merged 1 commit into
mainfrom
agent/20260819-tg-trading-report
Aug 19, 2026
Merged

feat(tg): detailed trading report on Трейдинг button + LLM analytics#198
JoTalbot merged 1 commit into
mainfrom
agent/20260819-tg-trading-report

Conversation

@JoTalbot

Copy link
Copy Markdown
Owner

Кнопка Трейдинг: детальный отчёт всех портфелей + LLM-аналитика и сценарии (paper-only, дисклеймер). Данные мгновенно, LLM в фоновом потоке.

… (A/B, DCA, basket, T2, freqtrade, MM, scoreboard, services) + LLM analytics/scenarios via balancer (async send, honest framing: paper-only, no financial advice)
@JoTalbot
JoTalbot merged commit b2362aa into main Aug 19, 2026
@JoTalbot
JoTalbot deleted the agent/20260819-tg-trading-report branch August 19, 2026 10:56
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@github-actions github-actions Bot added documentation Improvements or additions to documentation tests labels Aug 19, 2026
Comment thread tg_bot/callbacks.py
threading.Thread(target=_bg_llm, args=(api, chat_id, snap), daemon=True).start()
elif data == "crypto_refresh":
from tg_bot.treasury import _handle_treasury_intent as _hti
_hti(api, chat_id, "крипто заработок")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 The Roast: Вы разделили nav_trading и crypto_refresh, но зачем-то поменяли текст у crypto_refresh с "казначайство и резервы" на "крипто заработок". Это не в scope PR про кнопку «Трейдинг». Пользователь нажимает "обновить крипту" — а ему прилетает отчёт о заработке. Сюрприз!

🩹 The Fix: Либо верните прежний текст "казначайство и резервы", либо вынесите смену текста в отдельный коммит с обоснованием. В PR описание должно отражать все изменения поведения.

📏 Severity: warning


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Comment thread tg_bot/trading_report.py
realized = sum(float(v.get("realized_pnl_usd", 0.0) or 0.0) for v in exchanges)
gross = sum(float(v.get("gross_pnl_usd", 0.0) or 0.0) for v in exchanges)
fees = sum(float(v.get("fees_paid_usd", 0.0) or 0.0) for v in exchanges)
positions = [(ex, pos) for ex, v in zip(

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 The Roast: zip здесь работает как телепорт: ключи фильтруются только по имени, а значения ещё и по типу dict. Если в JSON окажется не-дикт для не-исключённого ключа, zip обрежет список, и позиции посчитаются криво. Молча. Пользователь увидит открытых: 0 там, где их 5.

🩹 The Fix: Добавьте isinstance(v2, dict) в список ключей, чтобы фильтрация была одинаковой:

        positions = [(ex, pos) for ex, v in zip(
            [k for k, v2 in data.items() if k not in ("cross_arbitrage", "_risk_state") and isinstance(v2, dict)],
            exchanges) for pos in (v.get("positions") or {}).values() if pos]

📏 Severity: warning


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Comment thread tg_bot/trading_report.py
w += " ⚠️"
basket = sb.get("top10_basket_pct")
basket_s = f"{basket:+.2f}%" if basket is not None else "—"
lines.append(f"🏆 <b>Scoreboard {sb['date']}</b>: DV2 {sb['dv2']['pnl_pct']:+.2f}% | "

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 The Roast: sb['date'], sb['dv2']['pnl_pct'], sb['market_mean_pct'] — три прямых доступа к внешнему JSON. Если scoreboard-файл окажется без поля date или dv2, отчёт упадёт с KeyError вместо graceful-сообщения "нет данных". Надежда на идеальные данные — это не стратегия обработки ошибок.

🩹 The Fix: Замените прямые доступы на безопасные .get() с дефолтами, чтобы падение внешнего JSON не убило весь отчёт.

📏 Severity: suggestion


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Comment thread tg_bot/trading_report.py
sb = snap["scoreboard"]
if sb:
v = sb.get("verdict") or {}
parts.append(f"Scoreboard {sb['date']}: победитель {v.get('winner')}")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔥 The Roast: sb['date'] снова в плюс-доступе. Если prompt_for_llm получит scoreboard без date, LLM-промпт упадёт, и пользователь не получит вообще никакого отчёта. Надежда на то, что JSON никогда не сломается, — это не план.

🩹 The Fix: Замените sb['date'] на sb.get('date', '—'), чтобы отсутствие поля в scoreboard не сломало LLM-промпт.

📏 Severity: suggestion


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

@kilo-code-bot

kilo-code-bot Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Code Review Roast 🔥

Verdict: 4 Issues Found | Recommendation: Address before merge

Overview

Severity Count
🚨 critical 0
⚠️ warning 2
💡 suggestion 2
🤏 nitpick 0
Issue Details (click to expand)
File Line Roast
tg_bot/callbacks.py 1195 Незадокументированное изменение поведения crypto_refresh
tg_bot/trading_report.py 79 Несоответствие фильтров zip в snap_directional
tg_bot/trading_report.py 350 Прямой доступ к ключам scoreboard без .get()
tg_bot/trading_report.py 400 Прямой доступ к ключам scoreboard без .get()

🏆 Best part: Модуль trading_report.py собрал все портфели в одном месте и добавил LLM-аналитику в фоновом потоке — бот не блокируется, это правильно.

💀 Worst part: Случайное изменение текста кнопки crypto_refresh в PR про «Трейдинг». Если это опечатка, пользователи получают не тот отчёт. Если это фикс — она должна быть в отдельном коммите.

📊 Overall: Как первый пул-реквест нового разработчика — много полезного кода, но пара случайных изменений в соседних кнопках, от которых веет хаосом.

Fix these issues in Kilo Cloud

Files Reviewed (3 files)
  • tg_bot/trading_report.py - 3 issues
  • tg_bot/callbacks.py - 1 issue

Reviewed by free · Input: 75.6K · Output: 29.5K · Cached: 488.3K

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant