OpenAlgo: один хаб вместо пяти обёрток — Блог
$ cat openalgo-odin-hab-vmesto-pyati-obvertok.md

OpenAlgo: один хаб вместо пяти обёрток

OpenAlgo: один хаб вместо пяти обёрток

В коллекции лежат шесть скиллов про индикаторы на OpenAlgo. Пять из них — тонкие обёртки (по 12K каждая, по 110-150 строк SKILL.md), и все начинаются с одной и той же фразы: «Read the indicator-expert rules». Это готовая архитектура для invocable-хаба.


Контекст: openalgo-экосистема

OpenAlgo — это Python SDK с центральным модулем openalgo.ta (100+ индикаторов), интеграцией с биржами через client.history() и WebSocket для live-данных. Вокруг него в коллекции выстроена шести-скилловая экосистема:

indicator-setup        (Stage 0: bootstrap — ставит openalgo, TA-Lib, venv, .env)
       ↓ installs
indicator-expert       (Stage 1: knowledge hub, 268K, 22 rule-файла, 12 templates, НЕ invocable)
       ↓ supplies rules to:
indicator-chart        ┐
indicator-dashboard    │  Stage 2-3: 5 тонких обёрток (~12K каждая)
indicator-scanner      │  Все читают indicator-expert/rules/assets/
custom-indicator       │  Все используют openalgo.ta
live-feed              ┘

В отличие от VectorBT-стека, где три команды делят один pipeline, тут пять скиллов делают принципиально разные артефакты (чарт / дашборд / сканер / Numba-функция / live-стрим). Пересечение — не в финальной стадии, а в инфраструктурном слое (load .env, openalgo.ta, output paths, Plotly dark theme).

Состав пяти обёрток

indicator-chart

Создаёт одиночный Plotly-чарт индикатора на одном символе. Аргументы: [indicator] [symbol] [exchange] [interval]. Результат: charts/{ind}/{sym}_{ind}_chart.py + .html с overlay/subplot. Поддерживает все 100+ openalgo.ta индикаторов. 110 строк SKILL.md, 12K папка.

indicator-dashboard

Строит веб-дашборд на Plotly Dash или Streamlit. Аргументы: [type] [symbol]. Типы: single-symbol, multi-symbol, multi-timeframe. Артефакт: dashboards/{name}/app.py (запускается через streamlit run или python app.py). 120 строк, 12K.

indicator-scanner

Multi-symbol scan: гоняет индикатор по watchlist, фильтрует по условиям (RSI ниже 30, EMA-cross, и т.д.), выдаёт CSV с матчами. Аргументы: [scan-type] [watchlist]. Пример: /indicator-scanner oversold my_watchlist.csv. 124 строки, 12K.

custom-indicator

Создаёт Numba-функцию для нового кастомного индикатора. Аргументы: [name]. Генерирует три файла: custom_indicators/{name}/{name}.py (Numba JIT + NumPy, O(n) оптимизация), chart.py (визуализация), benchmark.py (сравнение с numpy/pandas эквивалентом). 148 строк, 12K.

live-feed

Real-time WebSocket stream LTP/Quote/Depth + индикаторы в реальном времени. Аргументы: [symbol] [exchange] [mode]. Артефакт: charts/live/{sym}_live_feed.py с Plotly live-чартом. 142 строки, 8K.

Задачи, которые они покрывают

Типичный день квантового аналитика на OpenAlgo:

  1. «Покажи RSI на TCS за час»indicator-chart rsi TCS nse_eq 60m
  2. «Собери мне дашборд по RELIANCE со всеми трендовыми»indicator-dashboard trend REILANCE
  3. «Какие акции из NIFTY в oversold прямо сейчас?»indicator-scanner oversold nifty50.csv
  4. «У меня есть формула нестандартного индикатора, помоги написать быструю реализацию»custom-indicator my_signal
  5. «Показывай мне VWAP на INFY в реальном времени»live-feed INFY nse_eq ltp

Каждая команда делает артефакт своего типа, но все они стартуют одинаково: load .env → client.history() или WebSocket → openalgo.ta → Plotly dark.

Метод: что общего и что уникально

Общий infrastructure layer (95% совпадение)

Все пять SKILL.md содержат идентичные блоки:

  • Загрузка окружения: find_dotenv() для корневого .env
  • Bootstrap-секция: «Read the indicator-expert rules, especially: rules/X.md» (X — свой для каждой команды)
  • Output paths: mkdir charts/, mkdir dashboards/, mkdir scanners/, mkdir custom_indicators/
  • Использование openalgo.ta: нигде нет прямого импорта TA-Lib или pandas-ta — всё через openalgo.ta.func()
  • Plotly dark theme: единая визуальная схема template="plotly_dark", цветовая палитра
  • NIFTY benchmark comparison (для индикаторов, не для custom/live)

Уникальные части (5-10% различий)

СкиллУникальная логикаСпецифический rule-файл
indicator-chartSingle-symbol plot, overlay/subplotrules/charting.md
indicator-dashboardDash/Streamlit app layoutrules/dashboard.md
indicator-scannerMulti-symbol loop, watchlist CSVrules/scanning.md
custom-indicatorNumba @njit, O(n) оптимизация, benchmark vs numpyrules/custom_indicators.md
live-feedWebSocket subscribe, real-time обновление чартаrules/live_feeds.md

Уникальные знания в каждом скилле

indicator-expert (hub)

Содержит 22 rule-файла и 12 template’ов. Самые ценные из них:

  • Plotly dark theme — не просто template="plotly_dark", а полная палитра (чёрный фон, фиолетовый/зелёный для бычьих, красный для медвежьих), кастомные шрифты, hover-форматирование для financial data
  • NIFTY benchmark normalization — как правильно сравнивать индикатор с рынком (rolling beta, alpha, information ratio), а не просто «смотрим на две линии»
  • OpenAlgo API gotchasclient.history() падает на символах с дефисом, нужно конвертировать; WebSocket требует subscribe() + unsubscribe() явно, иначе течёт память

custom-indicator (Numba-специфика)

Это единственный скилл, который учит писать O(n) индикаторы на Numba. Конкретные знания:

  • Numba JIT шаблон: @njit + prange для параллельных циклов, типизация массивов
  • Sanity-check через benchmark: каждый Numba-индикатор сравнивается с эквивалентом на чистом numpy; если результаты расходятся > 0.01% — баг
  • Warm-up вызов: Numba компилирует при первом запуске, нужно сделать «прогревочный» вызов с маленьким массивом, чтобы в production JIT не сработал на критическом пути
  • O(n) vs O(n²) проверка: для каждого индикатора есть expected complexity; если ваш код работает в 10× дольше — скорее всего, у вас квадратичный алгоритм под видом линейного

live-feed (WebSocket-специфика)

  • Режимы подписки: LTP (только последняя цена), Quote (LTP + OHLC + volume), Depth (полный ордербук) — у каждого разная нагрузка на сеть
  • Reconnection logic: WebSocket может отвалиться, нужен exponential backoff
  • Throttling: при частых обновлениях Plotly захлёбывается; нужно накапливать буфер и перерисовывать не чаще 10× в секунду

Почему это не «пять разных скиллов»

Если посмотреть на структуру indicator-expert/rules/assets/, там лежат готовые Python-шаблоны для каждой команды: chart_template.py, dashboard_template.py, scanner_template.py, custom_indicator_template.py, live_feed_template.py. Эти темплейты — 80% кода, который каждая обёртка копипастит в свой итоговый файл.

Оставшиеся 20% — это аргументы CLI (какие имена параметров, какой порядок) и специфичные instructions (например, для live-feed — WebSocket reconnect). Эти 20% идеально ложатся в ## Sub-command: NAME секции внутри единого indicator-expert SKILL.md.

Рекомендация по объединению

MERGE в invocable-хаб indicator-expert:

/indicator-expert chart INDICATOR SYMBOL [exchange] [interval]
/indicator-expert dashboard TYPE SYMBOL
/indicator-expert scanner SCAN-TYPE WATCHLIST
/indicator-expert custom NAME
/indicator-expert live SYMBOL EXCHANGE MODE

Изменения:

  1. В indicator-expert/SKILL.md заменить user-invocable: false на true (или убрать этот флаг)
  2. Перенести содержимое пяти SKILL.md в пять секций ## Sub-command: NAME (примерно по 100 строк каждая)
  3. Удалить пять отдельных папок (indicator-chart/, indicator-dashboard/ и т.д.)
  4. Assets уже лежат в indicator-expert/rules/assets/ — без изменений

Что выиграем: −5 скиллов, −5 одинаковых bootstrap-блоков «read rules», единая точка входа, проще добавить новую подкоманду (например, backtest для интеграции с VectorBT-стеком).

Что потеряем: минимально. Slash-команды станут длиннее на одно слово (/indicator-expert chart вместо /indicator-chart), но это плюс, а не минус — сразу видно, что это индикатор.

Что остаётся отдельно (по дизайну)

  • indicator-setup — bootstrap, ставит openalgo. Нельзя слить с правилами, потому что они исполняют bash-команды до установки openalgo
  • custom-indicators (plural) — 9 готовых crypto on-chain метрик (NVT, MVRV, holder momentum). Другая ниша, другие источники данных (CoinGecko, Glassnode, Helius). Хотя имя похоже на custom-indicator (singular), функционально они ортогональны (один — про создание нового, другой — про применение готовых)
  • ta-lib и pandas-taальтернативные TA-библиотеки (C vs Python), не дубликаты. У ta-lib есть явная таблица сравнения, подтверждающая, что это разные инструменты для разных задач
  • feature-engineering — ML-prep (stationarity, feature importance), другая задача. Использует pandas-ta как один из источников, но цель другая

Итоги

Из 12 скиллов кластера Indicators 5 можно безопасно объединить в 1 (indicator-expert + 5 подкоманд), плюс 1 STUB удалить (pinescript-to-python-translator — 39 строк, 0 кода). Это −42% шума в кластере без потери функциональности.

Главный инсайт: тонкие обёртки с одинаковым bootstrap-блоком — это не самостоятельные скиллы, а dispatch-режимы одного invocable-хаба. Архитектура уже спроектирована правильно (rules-hub + sub-commands), осталось только включить user-invocable: true.


Ссылки