Зміст
- Софт Блекрок «Аладдін»: ризик‑менеджмент і що беремо собі
- Workflow — критерії відбору стратегій
- Nasdaq / S&P 500 — перевірені стратегії (рейтинг)
- Intraday Index Strategies — повний ресерч (Golda)
- Волатіліті Брейкаут Ларі Вільямса — повний розбір
- Чому ми ще не institutional — і що треба добудувати
- Kachky DB / Dashboard Refactor Task
- Kachky DB Task — Short Technical Brief
Kachky DB / Dashboard Refactor Task
# Kachky DB / Dashboard Refactor Task
## Full task context
# Задача: зробити робочу базу трейдів і нормальний дашборд для kachky
## Де код
Репо:
- `/tmp/kachky-fresh`
Основні файли:
- `db.py`
- `api_dashboard.py`
- `webhook/handler.py`
- `exchanges/capital.py`
- `position_book.py`
- `app.py`
---
## Що зараз зламано
### 1. База “тупа”
Поточна модель погано зв’язує:
- `open` позиції
- `close` позиції
Через це одна й та сама позиція часто не живе як **один lifecycle = один row**, а розпадається на кілька записів.
---
### 2. Є цвинтар у БД
У базі накопичуються:
- `UNKNOWN` close rows
- пусті `closed` stub-и
- дублікати
- auto-closed rows після mismatch recovery
- manual close з біржі, які не зводяться з original open
У результаті дашборд показує сміття.
---
### 3. Manual close — реальний сценарій
Користувач реально іноді закриває позиції руками на Капіталком.
Система має це підтримувати як **нормальний сценарій**, а не як аварію.
Зараз цього нема:
- біржа має факт close
- база не вміє акуратно оновити той самий запис
- з’являються дублікати або пусті stub-и
---
### 4. Alert close теж має працювати
Закриття по алерту теж має:
- оновлювати той самий запис
- не створювати дубль
- не залишати пустий “труп”
---
### 5. Дашборд зараз не адмінка
Користувач хоче не просто “дивитися”, а **керувати базою руками**.
Треба, щоб у дашборді було:
- Add
- Edit
- Delete
І це має:
- реально писати в SQLite
- а не бути декоративним UI
---
### 6. Торгові кнопки теж потрібні
Користувач хоче:
- `Close` по кожній позиції
- `Panic Sell All`
Це теж має бути частиною нормального dashboard/backend flow.
---
## Що хоче користувач у результаті
### Головна ціль
**Робоча база + красивий дашборд.**
Не “розумні пояснення”, а система, яка:
- коректно веде трейди
- не плодить сміття
- дозволяє руками правити записи
- показує чисту картину в дашборді
---
## Продуктові вимоги
### База
Треба зробити так, щоб:
- один трейд = один запис
- при open створюється один row
- при close оновлюється той самий row
- manual close і alert close обидва сідають у той самий lifecycle
Потрібні нормальні поля зв’язку, типу:
- `deal_id`
- `deal_reference`
- `signal_uid`
- `close_source`
- можливо `updated_at`
- можливо `metadata/manual flags`
---
### Close source
Потрібно явно розрізняти:
- `alert`
- `manual`
- `sync`
- `repair` (якщо треба для службового)
---
### Dashboard API
Потрібні реальні DB-backed endpoint’и:
- Add trade
- Edit trade
- Delete trade
Опціонально окремо:
- close one
- panic sell all
- cleanup/reconcile helpers
---
### Dashboard read layer
Дашборд не повинен показувати сміття:
- порожні `closed` stub-и без `exit_price/pnl`
- broken internal rows
- дублікати, які є наслідком старої кривої моделі
Тобто або:
- cleanup у БД
- або safe filtering in queries
- або і те, і те
---
## Що вже було виявлено під час розслідування
### По сьогоднішніх close даних
Сьогоднішні закриті угоди з Капіталком **реально приходять**.
Тобто проблема не в тому, що біржа не віддає історію.
Проблема в тому, що:
- import/history
- sync
- mismatch recovery
- current trade journal model
разом дають сміттєву базу.
---
### Конкретний кейс
Було кілька сьогоднішніх close угод, які в базі вже існували як:
- нормальні close rows з `pnl`
але поруч лишались:
- старі `VBO_1H` closed stub-и без `pnl`
Тобто дані **не пропали**,
але модель БД **не може акуратно тримати правду в одному місці**.
---
### Важливий нюанс
Не всі сьогоднішні close були alert close.
Частина була manual close руками на біржі.
Тому не можна тупо припускати:
- “якщо сьогодні закрито, значить це alert close”
Потрібно нормально підтримувати обидва сценарії.
---
## Що треба зробити в коді
### 1. Переробити trade journal API в `db.py`
Потрібен більш нормальний шар роботи з trades:
- create trade on open
- close/update existing trade
- reconcile exchange close into existing trade
- manual insert/edit/delete
- maybe cleanup broken rows
Тобто не одна-дві функції “log entry / log exit”, а нормальні CRUD/reconcile helper-и.
---
### 2. Переробити Capital flow
У `webhook/handler.py` і суміжних місцях:
- при `OPEN` зберігати максимум reliable ids
- при `CLOSE` оновлювати existing row
- якщо close руками і бот про нього дізнається з історії біржі — намагатись знайти existing open row і закрити його
- не плодити separate closed rows, якщо можна update existing one
---
### 3. Переробити history/sync flow
`api_dashboard.py` зараз має різні sync/check/repair штуки, але вони стали костилями.
Потрібно:
- зробити sync/history більш акуратним
- використати його для enrichment/reconciliation
- але не для плодіння дубльованих реальностей
---
### 4. Додати real CRUD endpoints
Потрібно backend API для:
- `POST /api/trades`
- `PATCH /api/trades/<id>`
- `DELETE /api/trades/<id>`
щоб це реально писало в SQLite.
---
### 5. Додати/довести close controls
Потрібно мати:
- close one
- panic sell all
і щоб це було інтегровано:
- в торговий flow
- у базу
- у дашборд
---
### 6. Прибрати цвинтар із visible layer
Навіть якщо старі broken rows тимчасово залишаться,
дашборд не повинен відображати:
- пусті `closed` записи
- junk rows без сенсу
---
## Якщо frontend HTML не в репо
Це ок.
Тоді мінімум:
- зробити backend cleanly
- описати, які endpoint’и і payload’и потрібні фронту
- щоб потім UI можна було швидко довести
---
## Що вважається хорошим результатом
### Мінімум
- база більше не плодить сміття так легко
- manual close працює як supported flow
- дашборд не показує порожні stub-и
- є CRUD для ручного керування записами
### Добре
- один трейд = один row lifecycle
- close one / panic sell all працюють
- старі broken rows можна cleanup-нути окремо
### Ідеально
- після цього manual close / alert close / sync close більше не руйнують модель даних
---
## Що треба повернути у результаті
1. **Що саме змінено в коді**
2. **Який коміт**
3. **Який one-time cleanup ще потрібен, якщо потрібен**
4. **Як manual close працює після рефактору**
5. **Які endpoint’и готові для дашборда**
---
## Дуже важливо
Не треба ще один “майже-working repair”.
Потрібен **прагматичний, але справжній рефактор**.
Не лікувати симптоми.
Зробити так, щоб:
**база перестала бути тупою.**
---
## Short technical brief
# Task: Refactor Kachky trade DB + dashboard backend
Repo:
- `/tmp/kachky-fresh`
## Goal
Make the trade database and dashboard backend actually workable.
## Core requirements
1. One trade lifecycle should map to one DB row whenever possible.
2. Capital open/close flows must reconcile into the same trade row.
3. Manual close on exchange must be supported as a first-class workflow.
4. Alert close must also update the same row, not create junk duplicates.
5. Dashboard must stop showing empty/broken closed stub rows.
6. Add real DB-backed manual controls:
- Add trade
- Edit trade
- Delete trade
7. Keep/complete:
- Close one position
- Panic Sell All
## Current problems
- DB accumulates duplicate closed rows.
- Imported Capital history creates `UNKNOWN` rows.
- Mismatch/auto-close recovery creates empty closed stubs.
- Dashboard shows graveyard junk.
- Manual close and alert close are not reconciled cleanly.
## Files to inspect
- `db.py`
- `api_dashboard.py`
- `webhook/handler.py`
- `exchanges/capital.py`
- `position_book.py`
- `app.py`
## Required implementation direction
### DB model
Add/normalize fields needed to reconcile lifecycle, such as:
- `deal_id`
- `deal_reference`
- `signal_uid`
- `close_source`
- optional timestamps / metadata helpers
### Trade journal API
Replace fragile logging-only behavior with a more robust API in `db.py`:
- create/open trade
- close/update existing trade
- reconcile exchange/manual close into existing open row
- add/edit/delete trade
- cleanup helpers for broken rows if needed
### Open/close behavior
- On OPEN: persist reliable matching keys.
- On CLOSE by alert: update existing trade row.
- On manual close detected from Capital history: reconcile into existing trade row if possible.
- Avoid creating parallel closed rows unless absolutely necessary.
### Dashboard backend
Implement real endpoints that write to SQLite:
- `POST /api/trades`
- `PATCH /api/trades/<id>`
- `DELETE /api/trades/<id>`
Also ensure dashboard read endpoints do not surface broken empty closed stubs.
### Manual controls
Support backend flows for:
- close one position
- panic sell all
## Cleanup behavior
Need a pragmatic cleanup approach so old junk rows do not pollute dashboard output.
It is acceptable to:
- hide broken rows from dashboard queries
- add explicit cleanup helpers
- do a one-time cleanup path if needed
## Output requirements
When finished, provide:
1. Summary of code changes
2. Commit hash
3. Remaining one-time DB cleanup needed, if any
4. How manual close works after refactor
5. Which endpoints are ready for dashboard frontend
## Constraint
Do a real pragmatic refactor, not another narrow patch on the current graveyard.
Kachky DB Task — Short Technical Brief
# Task: Refactor Kachky trade DB + dashboard backend
Repo:
- `/tmp/kachky-fresh`
## Goal
Make the trade database and dashboard backend actually workable.
## Core requirements
1. One trade lifecycle should map to one DB row whenever possible.
2. Capital open/close flows must reconcile into the same trade row.
3. Manual close on exchange must be supported as a first-class workflow.
4. Alert close must also update the same row, not create junk duplicates.
5. Dashboard must stop showing empty/broken closed stub rows.
6. Add real DB-backed manual controls:
- Add trade
- Edit trade
- Delete trade
7. Keep/complete:
- Close one position
- Panic Sell All
## Files to inspect
- `db.py`
- `api_dashboard.py`
- `webhook/handler.py`
- `exchanges/capital.py`
- `position_book.py`
- `app.py`
## Output requirements
When finished, provide:
1. Summary of code changes
2. Commit hash
3. Remaining one-time DB cleanup needed, if any
4. How manual close works after refactor
5. Which endpoints are ready for dashboard frontend