Лог ключевых технических и бизнес решений
Контекст: FS жрал все ресурсы на shared серве (CPU steal 82%), Бендер падал. Решено мигрировать на выделенный хост ближе к Binance (Tokyo). Решение:
screen.clkway.online (DNS на Hostinger)futures-screener.szhub.space пока живой (fallback)
Инфра: IP 72.62.247.119, SSH key с основного сервера, PM2 saved + startupКонтекст: Плотности в стакане — много шума от маркетосов/спуферов, стены появляются на секунды. Решение:
notional×5 / avgVol5m(14 свечей)378dee0Контекст: FS долго грузится, иногда 2-3 попытки, особенно десктоп. Root cause расследование: CPU steal 82% (Hostinger перегружен), gzip отключен для JS/CSS (446KB raw), нет Cache-Control (браузер перезапрашивает всё каждый раз). Статика из памяти отдавалась за 2-5с из-за event loop starvation. Решение (2 фикса):
0a91f1eКонтекст: Code audit серверного кода futures-screener — поиск багов, утечек памяти, silent failures. Найдено 10 багов, все пофикшены:
wsManager.ws не существовало → connections[].destroy()52f9fb3Контекст: Channel 5m scan 300-500с, 6 "зомби" символов таймаутились, 97 NATR empty warnings, push уведомления терялись. Root cause: NATR cache TTL (5min) = cleanup TTL → race condition при refresh (30-60с compute time). NATR фильтр получал null → все 64 символа сканировались → rate limiter throttle → хвостовые символы (PARTI/LTC/VIRTUAL/ZEN/OPG/TRADOOR) timeout. Расследование: curl показал что символы отвечают за 0.4-2.4с — проблема не в Binance, а в перегрузке rate limiter. Решение (3 фикса):
bb0deb1Контекст: Rick хочет торговать от границ регрессионных каналов. Нужны bounce, reversal, acceleration сигналы на 5m/15m/1h.
Решения:
Грабли:
Коммиты: 0824a89→ea04b26 (7 коммитов)
Контекст: Rick нажал push уведомление OI divergence сигнала → перекинуло на график, но стрелки-маркера на графике нет.
Root cause — 3 бага:
_pendingSignalMarker никогда не читался — setSignalMarkerAndOpen() записывал маркер в window._pendingSignalMarker, но applySignalMarkers() использовал только sigState.signals. Маркер устанавливался и тут же обнулялся без использования.sigState undefined → early return — если Signals tab никогда не открывался, sigState.signals не существует, функция делала return до обработки pending маркера.closeCoinModal() чистил modal._markers вместо modal._sigMarkers → маркеры не удалялись при закрытии.Фикс: Pending marker инжектится как синтетический сигнал прямо в массив signals внутри applySignalMarkers(). Force flag при наличии pending. sigState fallback на пустой массив.
Коммит 1330a43.
Контекст: Rick жаловался что графики "дёргаются" и долго грузятся после вчерашних фиксов. Предыдущая сессия упала по таймауту 600s, но изменения были сделаны — проверил, закоммитил.
Решения (Client — 6 оптимизаций):
shiftVisibleRangeOnNewBar: true — нативная LWC фича вместо ручного getVisibleLogicalRange/setVisibleLogicalRange хака. Убирает прыжки при новых барах.requestAnimationFrame для оверлеев — S/R, тренд-линии, каналы, маркеры деферятся в следующий кадр. Не блокирует main thread.Решения (Server — 2 оптимизации): 7. Stale-While-Revalidate кэш — klines cache validity 60s→300s. Stale (60-300s) → отдаёт мгновенно + bg refresh. Блокирует только при >5min. 8. NATR auto-refresh 4.5min — до истечения 5min TTL, всегда pre-computed.
Грабля: Предыдущая сессия таймаутнулась (600s) при попытке сделать все 8 изменений за раз. Нужно бить на части.
Коммит cdef26e.
Контекст: Бендер падал всю ночь/утро из-за sandbox_enabled=true (CLI пытался OS sandbox → 60s timeout). Rick починил (SANDBOX_ENABLED=false в .env). Futures screener висел с 504 — event loop заблокирован retry loop'ами Binance API.
Решения:
/api/natr?interval=15m вызывался только клиентом → NATR cache пустой с первого скана. Добавил fastify.inject() через 5с после старта. NATR доступен через ~13с.Грабли: pm2 restart по id=0 после pm2 delete → "Process 0 not found". Нужно pm2 start ecosystem.config.js после delete.
Коммит e62cfb9.
Решения:
Root cause: chartEl.innerHTML = '' убивал loader div, а в loadModalChart() не было show/hide/error логики. Коммит 37bfd81.
Решения:
/home/app/scripts/syntax-check.sh) — проверяет .js/.py/.json после каждого Edit/Write. statusMessage вместо OK-спама.Артефакты:
futures-screener/CLAUDE.md — полное описание проектаfutures-screener/tests/ — 14 vitest тестов (logic + scorer)brain/audits/agentlint-futures-screener-2026-05-02.md.claude/settings.json — добавлен PostToolUse hookТриггер: Rick хотел визуальные каналы на графиках + проверка сигналов после тюнинга. Решения:
b92e4dc, 77de754, 4b3bfdfТриггер: Анализ данных: 144 sig/day (прогноз 70-80), большинство conf 48-63 — шум. Решения:
cd37de3Триггер: Сигналы не появлялись, Rick заметил. Диагностика: Outcome tracker зависел от UI-visit (getProxyCached ticker), 1h klines только у 2 символов в SQLite (liq-sweep молча скипал), WS _cleanup terminate на CLOSING сокетах. 12 фиксов аудита:
continue в .map() callback = SyntaxError, не loop!
Коммит: 4446d3aАудит: Полный code review server + client, найдено 8 реальных багов. Критические фиксы:
/densities/simple + /api/oi-history — ReferenceError: reply not defined (handler без reply param)sig.type вместо s.type, крашил detail panel для funding сигналов
Средние:_wsClosing сбрасывался синхронно до async onclose$$ в Wall Size / Volume 24h
Коммит: 568a396Проблема: Сервер ребутнулся, PM2 startup поднял ВСЕ сохранённые процессы включая stopped. Последствия:
Решение:
Грабли:
pm2 save после каждого stop!pm2 restart теряет env → всегда pm2 delete + pm2 start ecosystem.config.jsКоммит: a7a725f
Проблема: Resolver ждал 18h (RESOLVE_MIN_HOURS) на Open-Meteo archive. 25 Apr 29 трейдов висели нерезолвленные.
Решение 1 — CLOB Resolver: Чекаем Polymarket CLOB API (/markets/{id}) на winner=True/False в tokens. Мгновенный resolve как только Polymarket сетлит маркет. Open-Meteo оставлен как fallback. 25 трейдов зарезолвились моментально.
Решение 2 — MIN_MODEL_CONFIDENCE=80%: Анализ 36 трейдов показал: <80% conf = 38% WR (-$12.33), ≥80% conf = 75% WR (-$1.15). Также: YES трейды 0/5 = 0% WR (-$11), cheap <0.30 = 0% WR (-$8), between op = 44% WR (-$11.72). Пока подтянули только confidence, остальные фильтры наблюдаем.
Результат: 91 opps → 72 opps (~20% срезано). Все YES автоматически отфильтрованы (YES с conf ≥80% = редкость). Коммит 8310c52.
Решение: Ресёрч автоматических трендовых каналов для 1h сигналов у границ. Топ-5 подходов: 1) Adaptive Linear Regression (R² auto-period, лучший overall), 2) Auto Parallel Channel (swing pivots, у нас есть ZigZag), 3) Keltner (EMA+ATR, 77% WR, 20 строк), 4) Gaussian (30k TV likes, фильтр чопа), 5) Donchian (classic Turtle). Рекомендация: Regression + Keltner комбо. Результаты сохранены в brain/resources/trend-channels-research.md. Rick решит при реализации.
Решение: 3 новых OI-сигнала: 1) oi_divergence — standalone price/OI дивергенция (exhaustion или hidden accumulation, min 4 свечи, OI trend 2%, price 1%). 2) oi_funding_squeeze — контрарный сигнал при OI spike + extreme funding (>+0.05% SHORT, <-0.03% LONG). 3) OI ROC — 3-candle ускорение/замедление ±5 conf. Funding gate: фильтрует oi_longs при funding >+0.03% (толпа уже в лонгах), oi_shorts при <-0.02%. Frontend: settings accordion, metadata (OI Trend%, Funding%), push иконки. WS fix: safe CONNECTING state cleanup. OI history 3→6 свечей.
Решение: Убрать MAX_OPEN_POSITIONS (15→100) и BANKROLL ($21→$10000 virtual) чтобы DRY_RUN стата копилась быстрее. Dashboard KPI фиксы: overall WR (73%) вместо daily (—), overall P&L вместо $0, bankroll "Virtual", conn.close() баг в resolver. Коммит 2355daf.
Решение: Анализ 548 сигналов liq_sweep по confidence × level type × direction.
cf1c4f9.Решение: Проверка статуса бота + ресёрч крипто-маркетов Polymarket.
Решение: 3 фикса после аудита первого батча резолвов (11 сделок).
RESOLVE_MIN_HOURS=18 задержка. Пере-резолв: 91% WR→73% WR, +$10.86→+$2.22.polymarket-apis (v0.5.8, Safe wallet support). redeem_position() в executor, auto-call после resolve. Winning tokens → USDC.8734f64. Баланс Polymarket: $25 USDC free + 21 redeemable позиций.Решение: Расширить grep-матчер в save-hook.sh (UserPromptSubmit hook).
сохранись|сохрани|сохранение|сохранени|сейв|save|5.сохран5dc549f.Решение: Добавить третий тип сигнала — Liquidity Sweep + Pin Bar. Также реструктуризация настроек и добавление маркеров на графиках.
server/liq-sweep.js) — fractal swing highs/lows, round numbers, wall levels, pin bar detection (wick≥60%, body≤33%), sweep confirmation, confidence scoring (30-95)signals.js + index.js, 60s scan interval, dependency injection (klinesCache, stateManager, densityV2)applySignalMarkers() для mini-charts и модалок, preload fetch при загрузке, toggle в настройкахtab-signals displayРешение: Старый дашборд был непонятный, город не отображался в карточках, бот создавал ~50 дубликатов каждый скан (4500+ за день), resolver игнорировал simulated сделки.
get_active_trades() не включал статус simulated, поэтому idempotency guard не работал для DRY RUN. Теперь включает simulated + AND outcome IS NULLget_active_trades() не делал JOIN с markets → добавил LEFT JOIN markets для city и questionstatus='filled', добавил 'simulated' для DRY RUNРешение: Бот сливал ~$10 за день. Провели ресёрч (GitHub, Medium, Reddit) — нашли как успешные боты зарабатывают ($24k+). Проблема: хардкод Gaussian σ, фиксированные ставки, MIN_EDGE=5%. Реализовали 6 шагов:
Решение: CLAUDE.md переписан: вместо чтения 10 файлов при старте (~35K токенов), теперь читаем только 2 (README + learnings ~8-10K). Проектный контекст подтягивается ТОЛЬКО после того как Rick скажет над чем работаем. decisions/log.md (42K+) больше не читается при старте — только при записи решений. Причина: Rick заметил большой расход токенов. 80% контекста при старте не использовалось. Экономия: ~70% токенов на каждый bootstrap.
Решение: Внедрён 3-уровневый rate limiter для Binance API: (1) трекинг X-MBX-USED-WEIGHT-1M из каждого ответа; (2) soft throttle 500ms при 1800/2400, hard throttle 5s при 2200/2400; (3) глобальная пауза всех запросов при 429 (30s) и 418/IP ban (120s). bgetWithRetry не считает 429 за обычный retry. Диагностический endpoint GET /api/rate-limiter. Также: Добавлена Moscow в config.CITIES weather-bot (была в scanner но не в forecaster → Unknown city). Рестартнут dashboard (502 после 30 дней аптайма — завис).
Решение: Фикс 3 багов weather bot: (1) forecast cache не использовался — каждый bracket дёргал API повторно, сотни лишних запросов → 429 бан Open-Meteo; (2) нет retry/backoff при 429 — добавлен retry 3x (5s→10s→20s) + global cooldown 5min; (3) loguru дублировал все строки (stderr + file handler) — убран дефолтный handler. DRY_RUN=true пока нет PROXY_ADDRESS.
Статус: PRIVATE_KEY заполнен, USDC $30 на Polygon готов. Осталось: deposit на Polymarket → получить PROXY_ADDRESS → DRY_RUN=false.
Dry run статистика: 295 сделок, WR 62%, PnL +$150.97 (симуляция).
Коммит: 1235ad6
Решение: Запуск Weather Bot (вариант B) — деплой на dashboard.szhub.space/weather-bot/.
Архитектура: Python FastAPI + APScheduler, Gamma API scanner (40 городов × 3 дня), Open-Meteo forecaster (probability model N(μ,σ)), edge analyzer (≥5%), CLOB executor (limit orders, 0% maker fee), Risk Manager (kill switch, daily loss limit).
Деплой: PM2 weather-bot порт 3201, nginx proxy на dashboard.szhub.space, DRY_RUN=true.
Баги пофикшены: timeAgo UTC парсинг (-24908s), markets city/date NULL (save_market до заполнения полей), switchTab event.target.
Первый скан: 87 events, ~960 bracket markets (11 per city/date). 0 opportunities (edge < 5%).
Коммит: 2749cb9
Решение: Запуск автоматической торговли по Gamma Play сигналам с backtest-validated фильтрами.
Фильтры: conf≥90, DTE≤1d, delta 0.3-0.7, dist<1%, cost $0.50-$3(alt)/$5(BTC/ETH), no counter-trend, TP room ≥50%.
Пайплайн: gammaSignal → filter → BUY LIMIT → fill monitor → SELL LIMIT (TP +100%) → push + journal.
Баг-фикс: Math.abs() для NEUTRAL P&L давал 100% fake WR для straddle/strangle. Пересчитано 112 сигналов.
TP room check: maxPrice биржи может быть ниже TP — если gain <50%, сделка пропускается (первая сделка SOL показала проблему: fill $0.36, TP capped to $0.50 = +39% вместо +100%).
Коммит: e78fc62
Решение: Миграция клиентского WebSocket с legacy wss://fstream.binance.com/stream на wss://fstream.binance.com/market/stream.
Причина: Binance депрекейтнули legacy /stream — kline стримы на 15m+ перестали получать данные. Подтверждено тестами: legacy 15m = 0 тиков за 12с, /market/stream 15m = 20 тиков.
Доп. фикс: При смене TF теперь полностью убивается и пересоздаётся WS соединение (вместо UNSUBSCRIBE/SUBSCRIBE на том же соединении — race condition). Добавлен RE-SUB safety net (5с fallback, пересоздаёт стримы из видимых чартов).
Результат: Все TF работают: 1m, 5m, 15m, 1h, 4h, 1d. Коммит 4381cba.
Решение: Полная переработка Auto S/R и Auto Trendlines на основе ресёрча GitHub/TradingView лучших алгоритмов.
S/R v2: DBSCAN кластеризация (вместо sorted-merge), Volume Profile (POC/VAH/VAL), Multi-TF confluence (modal/slots fetch 2 старших TF), Break detection (пробитые уровни penalized).
Trendlines v3: ZigZag свинги (вместо fractal pivots), Gradient descent slope optimization с ZERO violations (neurotrader888 подход), enforce slope direction (support↗ resistance↘), линии от начала графика.
Причина: Rick указал что готовые решения на TradingView/GitHub лучше велосипеда. Ресёрч подтвердил: наш sorted-merge имел chain-merge problem, трендлайны допускали 15% violations и не фильтровали slope direction.
Результат: Горизонтальные уровни "намного лучше" (Rick), трендлайны корректные по направлению. Коммит c5edf2a.
Решение: Разбить серверный WS на multiple connections (190 стримов макс). Auto S/R уровни через fractal pivots + ATR clustering. Убрать IDB tier кэширования. Причина: WS флапал каждые 5с (536 стримов > Binance limit 200). IDB delta merge вызывал гэпы на графиках. Auto S/R — #1 requested feature. Результат: WS стабильный, графики без гэпов, S/R уровни на всех чартах с toggle и сортировкой.
Futures Screener: Клиентский 3-уровневый кеш для мгновенной загрузки графиков:
Futures Screener: Полный аудит кода (server + client + infra). 33 проблемы найдены, 25 исправлены за сессию (27 коммитов). Ключевые решения:
Futures Screener: Ресёрч конкурентов (CoinGlass, Kingfisher $70/мес, ScalpBoard $10/мес, Laevitas $50/мес). 3 идеи сохранены в TODO:
Бендер: Ресёрч (hooks, MCP серверы, automation, self-improving patterns). Rick пока не выбрал — вернёмся позже.
Что: Хук в .claude/settings.json — после каждого Edit/Write запускать syntax check на изменённый файл.
node --check file.jspython -m py_compile file.pyasync: true (фоном, не тормозит)
Лёгкий вариант, не полноценный линтер. Ловит забытые скобки, SyntaxError. Позже можно расширить до ESLint/Ruff.Идея: Вместо захардкоженных 30 идей — скрипт который анализирует текущее состояние сервера/проектов (PM2 health, disk, error logs, git status, trading PnL) и через AI (OpenRouter/Claude API) генерит 3 актуальные, контекстные идеи улучшения Бендера каждый день. Cron 18:00 Vancouver → Telegram через Бендера.
WS Binance флап: Подключался при старте без подписок → Binance закрывал idle соединение → reconnect loop каждые 5с. Фикс: lazy connect только при первом subscribe(), ping keepalive 3мин, race condition fix (concurrent subscribes при CONNECTING state). Убрал eager wsManager.connect() из index.js.
JWT_SECRET: Был random при каждом рестарте → все JWT токены сбрасывались. Фикс: фиксированный секрет через PM2 env var.
Push vs In-tab split: Один toggle "Browser notifications" управлял и in-tab toast и серверным push одновременно. Выключение на десктопе убивало push на телефоне. Фикс: разделил на signalNotifications (in-tab alerts: toast+Notification API) и signalPush (серверный push: работает с закрытым браузером/на телефоне). Каждое устройство управляет своей подпиской независимо.
Коммит c391b6f.
Решение: Заменить кастомные drawing tools (priceLine/LineSeries хаки) на библиотеку lightweight-charts-drawing@0.1.1. Установлена через npm, UMD раздаётся локально через Fastify route.
Ключевое открытие: DrawingManager.handleClick() библиотеки при активном инструменте ничего не делает — только selection. setActiveTool() просто хранит имя. Рисунки нужно создавать вручную через ToolRegistry.createDrawing(type, id, anchors, style, opts) + manager.addDrawing(drawing).
Мобильный баг: touchend handler вызывал preventDefault() → убивал синтетический click → библиотека не получала клик через chart.subscribeClick. Фикс: return early когда DM активен.
Реализовано: click-to-create через ToolRegistry, авто-cursor после рисования (onToolDone callback), drag через библиотечный anchor system + touch→mouse proxy для мобилки, settings popup (10 цветов, толщина 1-4, delete), 🔔 price alerts на линиях (crossing detection с cooldown 1мин), фибо кастомные уровни и per-level цвета, TradingView-style SVG иконки. Коммит 74bc0b7.
Root cause найден: createTextWatermark() (v5 primitive API) бросал TypeError: this.yt.attachPrimitive is not a function, что крашило всю функцию openCoinModal() до вызова loadModalChart(). Чарт показывал 2-3 свечи (только WS тики) вместо 1000. Также lightweight-charts-drawing@0.1.1 CDN возвращал 404 (несовместим с v5) и мог ломать internals LWC.
Фиксы: 1) createTextWatermark() и createSeriesMarkers() обёрнуты в try/catch. 2) Убрана CDN lightweight-charts-drawing@0.1.1 (v4-only). drawing-manager.js gracefully деградирует (returns null). 3) CSS .mc-modal.hidden: display:none → visibility:hidden + opacity:0 + pointer-events:none (элемент всегда в layout). 4) chartEl.innerHTML = '' перед createChart (чистка стейл DOM). 5) ResizeObserver + fitContent fallback. 6) Debug logging [modal].
Грабли: rAF/double-rAF не помогли (пробовали и в сессии 49, и в 50). Проблема была НЕ в размерах (934×647 — корректные), а в uncaught TypeError который останавливал выполнение. Коммит 66654f1.
LWC Migration v4.1.1→v5.1.0: Апгрейд lightweight-charts. Изменения: addXxxSeries()→addSeries(LightweightCharts.XxxSeries) (26 замен), series.setMarkers()→createSeriesMarkers(), watermark option→createTextWatermark(). Drawing Library: подключена lightweight-charts-drawing@0.1.1 (UMD, 68 инструментов TradingView-grade). Создан drawing-manager.js — обёртка DrawingManager с attach/detach/persist per-symbol. Коммит b69752d.
Signal Trader Bot (Binance Futures): Новый бот /home/app/trading-bot/grid-bot/src/signal_trader.py — торгует volume_spike сигналы из futures-screener. LONG+SHORT, $15/trade, 3x leverage, 5 макс позиций. Стратегия: partial TP 50% на +2.5% → trailing 1% callback, SL -1.5% (STOP_MARKET на бирже), time stop 12ч. Blacklist: top20 mcap (MFE слишком низкий) + плохие монеты по WR. TMM интеграция (теги+описания). Telegram через @alert_rick_bot (НЕ Бендер). Баги решены: Binance STOP_MARKET возвращает algoId (не orderId), conditional orders не видны в openOrders (проверяем позицию), race condition SL update после partial TP (sleep 0.5s). Push Notification Filter UI: checkboxes для выбора типов сигналов (volume_spike, oi_longs, oi_shorts, etc.), minRatio дефолт 3→2 (сигналы не доходили). Первая сделка HIGHUSDT LONG +$1.56 за 3 мин. Коммиты 91e61fb, 31f9fb8.
Density полная переделка: Старая система показывала бред (x-multiplier, NATR, теги CONCRETE/ROBOT/SPOOF-FAR). Новая V2: адаптивные бакеты (0.05% от цены), статистическое определение стен (median + N×σ, floor median×3), кластеризация соседних бакетов в зоны, bid/ask imbalance (±2% окно, BULLISH/BEARISH/NEUTRAL). Persistence tracking: ключи по bucket index (стабильно), fuzzy matching ±2 соседа, статусы new→confirmed(3m)→strong(10m), cleanup 5min unseen. Wall scoring: sizeVsMedian × proximity × persistence. sizeVsMedian capped 99.9. Новый файл server/densityV2.js — полный алгоритм. Endpoint /densities/v2 — params: windowPct, nSigma, minVolume24h, minImbalance, symbols, force. On-demand WS подписка для конкретных символов. Frontend: красивая таблица (Coin/Imbalance/Support/Resistance/Vol24h), blacklist modal (localStorage), мобильные карточки. Chart overlay: все графики (modal/mini/batch) мигрированы на v2 API. Density toggle checkbox в тулбаре мини-чартов. Фиксы: age всегда <1m (bucket index вместо price), AAVE/LINK без плотностей (on-demand WS + threshold median×5→×3), GRIFFAIN 332x (cap 99.9), table columns misaligned (double td), blacklist corruption (sanitization). Коммит 9ee69c8.
Server-side Web Push (VAPID): Заменили client-side polling (30s) на настоящий Web Push через web-push npm. VAPID ключи в PM2 env. push_subscriptions таблица в SQLite (endpoint, keys, filters, fail_count). server/push.js модуль: sendPushForSignal() fire-and-forget из emitSignal(), server-side filtering (conf/ratio/watchlist), auto-cleanup expired (410), fail_count < 3. 3 API endpoints: /api/push/vapid-key, subscribe, unsubscribe. SW push event handler. Test signals excluded (id.startsWith('test-') guard). Мгновенная доставка: каждый сигнал шлёт push сразу при обнаружении, не пачками. Time display: "Xm ago" → реальное локальное время (24h формат). DST fix: timeZone: 'America/Vancouver' принудительно (системные часы Rick'а в PST вместо PDT). Signal stats анализ (2634 сигнала): SHORT WR 84% vs LONG 15% (рынок падал), vol spike ratio 5-10x лучший (WR 73%), confidence формула инвертирована (low conf лучше high). Коммит 33085a1.
Drawing Context Refactor: drawCtx абстракция (~120 замен modal→drawCtx). Все графики drawable: модалка (32px toolbar), multi-chart слоты (24px compact, hover reveal), мини-чарты (20px ultra-compact, hidden→hover). setDrawCtxModal/Slot/Mini, auto-switch на mousedown. Per-symbol persist/restore при переключении. OI Indicator: histogram→line (по запросу Rick), 10% высоты, все графики. Push Notifications: SW showNotification + notificationclick→openModal. Background checker 30s (не зависит от активной вкладки). Sound alert Web Audio. ?signal=SYM URL param для cold start. Test endpoint /api/signals/test. Notification→Signal Marker: при клике на пуш модалка открывается со стрелкой сигнала на графике (как на вкладке Signals). SW передаёт signalId, setSignalMarkerAndOpen() подгружает данные и ставит _pendingSignalMarker. seenIds fix: всегда трекаются даже при выключенных нотификациях. Коммиты: fccf7db, ba5ed96, 139a750, 0fa57d4, 1a19c56.
Settings verification: все секции проверены и подключены. Density filters (depth%, TTL, severity, blacklist) подключены к mini-charts.js и densities.js. Sort direction fix. Multi-chart layouts (2h/2v/1+3) подключены. OI signals upgrade: market regime (BTC EMA20 1h, cached 5min), CVD gate (min skew 0.1), divergence detection (OI↑+Price↓ = bullish div), cooldown 15→60min. OI indicator overlay: /api/oi-history endpoint, yellow line on modal charts (separate price scale), toggle+color in settings Indicators section. Timezone fix (final): removed all manual TZ_OFFSET, pure UTC timestamps + browser toLocaleTimeString() for display. Signal confidence filter: slider 30-90 in settings. Коммит f1723e0.
Mobile responsive: Header (brand скрыт <600px, tabs stretch), sidebar (гамбургер ☰ + overlay 280px + backdrop), toolbar (фильтры/layout скрыты на мобилке), cards per row 1-2 добавлены, signals detail panel как fullscreen overlay + ← Back. Ruler tool (M): 2-click measurement в drawing tools, diagonal + L-shape + triangle fill, label с ценой/% + время + бары, зелёный/красный, следует за scroll/zoom, убирается кликом. Фиксы: colHeaders duplicate, SW cache bump v2. Коммит 32f2048.
Чистка мёртвого кода: Убраны orphaned ссылки на удалённые sidebar элементы (cmLinks, sigSettingsBtn, toggleSignalSettings(), mcSortBy, mcFilterVol/Natr/Trades, updateControlsFromState()). Фикс малформатного HTML в error fallback. Убраны мёртвые CSS стили .sig-settings-panel. drawAutoLevels/drawModalLevels оставлены (будут допилены позже). sigOutcomeStats оставлен (данные копятся в базе). -114 строк. Коммит e41b641.
Полная переделка Settings Panel: 8 секций, 30+ настроек, все реально подключены (раньше были муляжи). ⚙️ перенесён в header справа, старый левый сайдбар убран. Секции: Charts (candle type/log scale/volume height/grid/watermark/TF/cards per row/card size/sidebar columns), Densities (enable/severity/depth/TTL), Signals (ratio/cooldown/watchlist-only/notifications/sound), Watchlist (★ на сайдбаре, watchlist-first sort, manage), Theme (3 темы Dark/Darker/AMOLED + 6 candle color presets + custom picker), Data (auto-refresh/interval/default sort/min volume), Layout (multi-chart), Reset (clear drawings/reset + Export/Import base64). Все persist в localStorage, toast feedback, мгновенное применение. Коммит d79f666.
OI+CVD confidence fix: Анализ 777 сигналов за 24ч показал: high conf (80+) OI сигналы имели R:R 0.86, PnL -3.5%/1h — экстремальные OI скачки запаздывают. Новая формула: bell-curve, sweet spot 4-8% OI change → conf 67-78, >10% → conf падает до 58-66. buySellRatio cap 10. Vol_spike conf не менялся (работает корректно: low→mid→high = лучше). Коммит 7e6689a.
Enriched signal metadata: Каждый сигнал (vol_spike + oi_cvd) теперь содержит 6 доп. полей: volume24h, natr (NATR14 15m), trades24h, fundingRate (%), pricePosition (0-100% в 24h диапазоне), marketRank (ранг по объёму). Funding rate кешируется 5мин через /fapi/v1/premiumIndex. NATR берётся из кеша /api/natr, fallback — расчёт из 5m klines. Frontend detail panel показывает все поля с цветовой индикацией. Коммит 5c52107.
Signals DB-backed: /api/signals/live теперь из SQLite (24h window), не in-memory 200 буфер. Сигналы переживают рестарты PM2. DB-based dedup (cooldown тоже переживает рестарты). Лимит 500.
Signal timestamps: created_at = candle openTime (volume_spike) / OI candle timestamp (oi_cvd), не время скана. DB logSignal передаёт created_at явно. UTC fix: "2026-04-18 07:20:00" → "2026-04-18T07:20:00Z" для корректного парсинга в любом браузере.
Candle sync: WS live candles получают TZ_OFFSET_SEC (раньше UTC vs local mismatch → лаг/дёрганье). Phase 2 history load: setVisibleRange() (time-based) вместо setVisibleLogicalRange() (offset-based) → без скачка.
Countdown timer: В toolbar рядом с TF кнопками, тикает каждую секунду, TF-aware (5m→3:42, 4h→2:15:08).
UI: Default TF 5m (совпадает с сигналами). Confidence округлён до целого. Price line сигнала убрана. Auto-scroll блокируется если пользователь сдвинул график.
Volume Spike переделан: Старый (24h vol vs медиана рынка) → новый (5m candle vs SMA(20) своих свечей). $30M 24h min, $100K avg 5m min. Сервер эмитит от 2x, фронт фильтрует по user setting (default 3x). big_mover и natr_spike убраны (дублировали sidebar).
Local timezone: TZ_OFFSET_SEC в parseKlines() — все графики в локальном времени браузера, не UTC.
Signal markers: window._pendingSignalMarker → arrow + priceLine на графике при открытии из Signals tab. Чистится при закрытии модалки.
Settings popup: ⚙️ кнопка → slider ratio 2x-20x, localStorage persist. Заготовка для будущих настроек (min vol, SMA period, candle TF, OI threshold, cooldown, notifications, watchlist filter).
OI+CVD: openInterestHist?period=1h + takerlongshortRatio?period=1h → 4 подтипа (oi_longs/oi_shorts/oi_squeeze/oi_liquidation). Порог 3%/1h, top 50 by volume, ~4 сигнала/скан. Реальные данные подтверждены: RAVE short squeeze OI-4.5%+buying при +53%.
Outcome Tracker v2: MFE/MAE (Max Favorable/Adverse Excursion) обновляются каждые 30с. Снимки 5m/15m/1h/4h/1d. Итог по 1d. DB миграция: +spot_after_1d, +mfe_pct, +mae_pct. Pending window 25h.
Убрано: density_break (дублирует вкладку), outcome stats bar из signals tab (будет отдельная вкладка backtest).
Данные: avg OI Δ5min=0.13% (слишком тихо), avg OI Δ1h=0.86%, median=0.40%. При 3%: 2-3 из 50/час.
Backend: server/signals.js — scanner every 60s, 4 signal types (volume_spike 3x median, big_mover ±5%, natr_spike >5%, density_break walls<0.3%), cooldown 15min dedup, in-memory buffer 200 + SQLite persist. 3 API endpoints: /api/signals/live, /api/signals/summary, /api/signals/history.
Frontend: app/signals.js — Hybrid layout (Variant 3): filterable table (type/direction/symbol search) + detail panel. Auto-refresh 30s. Click row → detail panel with confidence bar, metadata grid, description. "Open Chart" button switches to Mini-Charts tab and opens modal.
Wheel zoom reverted: custom 3x boostWheelZoom() removed, restored default LightweightCharts mouseWheel behavior (broke something).
Drawing Tools:
galausdtUI Polish:
Signals Tab: Variant 3 (Hybrid — table + detail panel with mini-chart) chosen as base design. Implementation pending.
Density v2 Fixes:
loadDensities() never called)Rate Limit Protection (Binance bans solved):
Server Cache Architecture:
data/density-cache.json (10min TTL, survives restarts)Frontend Performance:
10 коммитов: 8b11965→cbe471a.
Multi-Chart Layout:
Memory Leak Fix (5 утечек):
cache Map (index.js): expired entries не удалялись → cleanup каждые 10сproxyCache Map (index.js): klines/ticker копились → cleanup >5мин каждые 30сbooks bids/asks (state.js): price levels навечно → TTL 2мин, cleanup каждые 60сbinHistory (state.js): 5% рандомный cleanup → детерминированный каждые 30сРезультат: Heap 89% (133MB) → 40% (12MB) после рестарта.
Коммит: 198472a. TODO: drawings per slot, Phase 3 density on charts.
Контекст: v2 грид-бот остановлен 9 Apr с убытком $10.15 из $100 депа. Фундаментальная ошибка v2 — охотился за волатильностью (MV≥65). Rick консультировался с Grok и решил перестроить на Neutral Grid hunting sleeping coins (низкая NATR, широкий CHOP).
Архитектурные решения v3 → v3.2:
TradFi agreement signed не покрывает все (например XAUT ≠ XAG).TMM tag: Grid.v3 (отличить от v2 статистики).
Status: первая сессия на ETHUSDT — грид встал, ETH вышел в тренд (slope +0.56%), грид закрыт на breakout без убытка. Ждём новый боковик. Деп $149.70 (fee ~11¢).
Файлы:
src/config.py — v3.2 параметрыsrc/screener.py — NATR/slope hard gates, _calc_ema_slopesrc/grid_manager.py — check_exit_conditions (soft_sl only)src/main.py — coin lockout, daily loss tracking, breakout handlersrc/exchange.py — get_funding_rate (не используется в v3.1+)PM2 grid-bot.
Решение: Batch загрузка klines для быстрой отрисовки мини-чартов.
Проблема: Чарты грузились по одному (80ms задержка × 20 видимых = 4-10с), выглядело раздражающе.
Решение: POST /api/klines-batch — клиент отправляет до 20 символов, сервер фетчит параллельно с Binance + кеширует 10с. Один batch ~500ms вместо 4-10с.
Sidebar: Переведён на CSS Grid (grid-template-columns: 20px 1fr 54px 38px 42px), кликабельные заголовки (Coin|Chg%|NATR|Vol) с asc/desc toggle. Sort dropdown из тулбара удалён.
NATR баг: fetchServerNATR() обновлял .mc-natr (chart cards), но sidebar использовал .mc-coin-natr → NATR в сайдбаре не обновлялся. В batch-пути не вызывался calcNATR() → прочерки на хедерах чартов. Оба пофикшены.
rightOffset: 10 свечей на всех графиках (mini + modal). В модалке setVisibleLogicalRange перезаписывал offset → добавлен +10 к to.
Решение: Создать 5-фазный план улучшений на основе конкурентного анализа Scalpboard.io.
Конкурент: Scalpboard.io — скальперский скринер $15-25/мес, 6 бирж, multi-chart, density heatmap, 10 секций настроек.
План: Phase 1: Auth JWT (FREE/PRO) + Settings Panel → Phase 2: Multi-Chart (1/2/4 layout) + Sidebar (price/change/vol) → Phase 3: Density levels на графиках + 3 severity (L/M/S) → Phase 4: Rectangle drawing + line styles + impulse/listing alerts → Phase 5: Candle types + log scale + color themes + cascades.
Auth сейчас: код 5600 строк, 6 endpoints — проще обернуть в middleware сейчас чем рефакторить потом. User-specific данные (watchlist, settings) сразу в DB.
Target: 1 May 2026. Спека: /home/app/brain/projects/futures-screener-v6-spec.md.
Результат Phase 1 (15 Apr): Auth backend+frontend DONE, Settings Panel DONE (4 секции), Sidebar upgraded (price column). SQLite выбран вместо PostgreSQL — достаточно для users/settings/alerts, density history в RAM. Go отклонён — bottleneck в Binance API latency, не в CPU.
Решение: Ослабить EMA direction filter — порог slope с 0.05% до 0.4%.
Проблема: EMA фильтр добавленный 14 Apr блокировал ВСЕ MR сигналы (229 скипов за полдня, 1 сделка). Порог 0.05% за 3 свечи = любое микро-движение считалось "трендом". Для MR это контрпродуктивно — когда цена ниже VWAP (Z<-2.5), EMA естественно падает.
Фикс: 1) EMA_SLOPE_THRESHOLD = 0.4 (новая константа). 2) slope_pct→ema_slope, вынесен в return tuple _calc_z_score_and_natr(). 3) Лог с slope значением. Промежуточный баг: забыл вернуть ema_slope из функции → тихий краш скана 35 мин (NameError, но asyncio проглатывал).
Результат: BLESS (slope 0.6-1%) правильно блокируется, MYX-подобные (0.38%) проходят. Первая сделка через 30 мин после фикса.
Решение: Починить расчёт PnL в outcome tracker — нереальные значения (ROI 59000%, 578%).
Проблема: 1) 10 старых сигналов (Buy Call/Put) хранили direction=NEUTRAL → формула брала abs(spotMove) → всегда WIN (даже при падении спота). 2) Delta-аппроксимация без cap → 578% PnL. 3) Микро-премия $0.01 → деление → 97%.
Фикс: 1) Infer direction из strategy name в calcOptionPnl (legacy fix). 2) PnL cap: -100% до +500%. 3) Min threshold: delta≥0.03, premium≥$0.10 (иначе fallback на spot PnL). Пересчитано 104 сигнала. WR 66%→63%, Buy Call avgPnl 43.7%→17.9%.
Коммит: 519066f.
Решение: Правильно обрабатывать expired/exercised опционы через Binance exercise history.
Проблема: 3 бага: 1) Код искал ex.realStrikeAmount, Binance отдаёт ex.realStrikePrice → фоллбек на strikePrice (68000 для BTC PUT). 2) strikeResult от Binance ненадёжен для определения ITM/OTM. 3) PnL формула: exitPrice=strike вместо intrinsic → ROI 59,000% вместо -100%.
Фикс: Считаем intrinsic value сами: PUT = max(strike - realStrikePrice, 0) × contractUnit, CALL = max(realStrikePrice - strike, 0) × contractUnit. Если intrinsic > 0 → EXERCISED, иначе EXPIRED_WORTHLESS. exitReason поле в Prisma TradeLog. Frontend бейджи: TP/SL/EXP-0/EXERC/MANUAL. Journal/stats теперь включают EXPIRED статус.
Коммит: e841599.
Решение: Нормализовать option premium по contract unit multiplier.
Проблема: Binance options premium = per-contract. XRP 1 контракт = 100 XRP, DOGE = 1000. Breakeven для XRP показывал $3.50 вместо $1.40 (premium $2.13 вместо $0.02/unit). P&L Calculator показывал всё красным.
Фикс: fetchContractUnits() из exchangeInfo → cache.contractUnits. getContractUnit() хелпер. buildTradeRec, buildComboTradeRec, dashboard gamma/whale recs — breakeven и spotTarget делятся на unit. P&L Calculator: totalCost = premPerUnit × unit × qty. Smart Sizing (qty=2) отключён (деп мал). Коммиты: 36ce19a, d974f99.
Решение: Убрать SL из всех стратегий — покупка опциона = isolated margin, премия = max loss.
Проблема: Gamma Play и Whale/UV имели конкретные SL (50-70%), что не имеет смысла для покупки опционов. Buy Call/Put и Combo уже были правильно (slPct=100).
Фикс: 1) getDynamicTargets(): slPct=100 для ВСЕХ типов (WHALE, GAMMA, DIRECTIONAL, COMBO). 2) dashboard.js: Gamma и Whale trade recs — убраны конкретные stopLoss цены, заменены на note "Premium = max loss". 3) Position sizing 5% risk от баланса Binance ($80.56), qty auto-fill. Коммит 127a136.
Решение: Синхронизировать сигналы между Signals табом и Backtest логированием.
Проблема: IV Skew сигналы генерировались только в dashboard.js (для Signals таба), но НЕ в scheduler.js → никогда не логировались в SignalLog → 0 IV Skew в Backtest. UV лимит: dashboard 12, scheduler 8 — несоответствие.
Фикс: Добавил IV Skew генерацию в scheduler slowUpdate() (аналогично dashboard.js). UV лимит 8→12. Теперь все 4 типа (strategies, UV, gamma, IV Skew) логируются одинаково. Коммит 80bf7b6.
Решение: Починить дедупликацию сигналов + улучшить Backtest таб.
Проблема: signalLogger хранил signalId = sig.id + "_" + Date.now(), а дедуп искал по sig.id (без суффикса) → никогда не совпадал. 5,615 из 5,699 сигналов были дубликатами (99.3%).
Фикс: Дедуп по strategy + underlying в окне 6ч (стабильные поля). Почищено 5,615 дублей → 84 уникальных. Backtest: сортируемые таблицы (клик по заголовку), expand-строки в signal log (description + parameters + spot after).
Коммит: 1f928d1.
Решение: Добавить фронтенд для просмотра результатов бэктестов (раньше API-only).
Реализация: Новый таб "📊 Backtest" — 4 overview карточки, Strategy Performance таблица (WR%/PnL 1h/4h/24h), Asset Performance таблица, Signal Log с пагинацией и фильтрами (outcome/strategy/underlying/period). Кликабельные строки для фильтрации. Коммит 33f4e0e.
Решение: Починить журнал сделок — закрытые трейды не отображались.
Проблема: syncFromBinance() брал символы только из открытых позиций API. Закрытая позиция исчезала → SELL не обнаруживался → запись навечно OPEN.
Фиксы: 1) Sync проверяет символы из DB (OPEN записи) + positions API. 2) logOpenTrade: убран update:{}, защита CLOSED от перезаписи, обновление OPEN при partial fill. 3) FIFO matching qty-aware: SELL потребляет qty из BUY, weighted avg exit price.
Результат: XRP Call закрытая сделка (+$0.43, ROI +60%) сразу появилась в журнале. Коммит 00c3a6c.
Решение: Добавить защиту от каскадных стопов. Проблема: 56 сделок за день, 37 стопов. RIVER вошёл 5 раз подряд (4 SL), DRIFT 6 раз (5 SL). 10 стопов подряд за 2 часа сожрали -$14. Анализ: Без плохих периодов: WR 60%, PF 2.02, +$5.43. С ними: WR 34%, PF 0.68, -$8.65. Сигнал рабочий, проблема = каскадные стопы.
Фиксы:
_sl_streak dict, 2 SL подряд на монету → cooldown 1 час (вместо 5 мин). Сбрасывается при win или после истечения lockout._global_sl_times list, 3 SL за 15 мин → _circuit_breaker_until = now + 1 час. Scan блокируется. TG алерт.Фиксы (продолжение): 3. EMA20 direction filter: slope за 3 свечи (15мин), >0.05% = up, <-0.05% = down. LONG при EMA↓ = skip, SHORT при EMA↑ = skip. Считается из тех же klines (0 API). 4. **ADX14 trend strength:** Wilder's smoothing, ADX > 25 = strong trend → skip ALL trades. MR не работает в тренде.
Анализ CHOP: все бакеты в минусе (45-49: -$4.61, 50-54: -$1.41, 55-59: -$1.09, 60+: -$0.62). Avg CHOP у winners=51, losers=50.5 — нет разницы. CHOP на входе не предсказывает исход. CHOP re-check отложен (нет time-series данных).
ADX убран (ADX_FILTER=False) — слишком лагает для обнаружения начала тренда. EMA direction достаточно.
CHOP time-series добавлен: каждые 30с логируется CHOP в deal.chop_series (до 200 точек). Сохраняется в DCA_CLOSE log и dca_deals.json. Через 2-3 дня — анализ: падает ли CHOP перед стопами.
Trailing stop (14 Apr): MFE анализ 63 сделок: MFE<0.5% = 100% лоссы, MFE>1% = 64%+ WR. 15/40 лоссов (38%) имели MFE>0.5% — трейлинг спас бы их. Activation 0.8%, callback 0.5%. Логика: peak tracking через max_favorable_pct, exit когда drawdown_from_peak ≥ callback. Z-TP оставлен как фоллбек.
TODO: Найти замену ADX (Supertrend? DMI crossover?) для обнаружения начала тренда. Потестить трендовые стратегии как дополнение к MR.
Решение: Добавить журнал сделок и статистику на вкладку Trading.
Проблема: Binance eAPI /eapi/v1/userTrades требует symbol — нельзя получить все сделки одним запросом.
Решение: Локальная БД (Prisma TradeLog) + sync через позиции → userTrades per symbol → FIFO match.
6 шагов: Prisma модель → tradeLogger сервис → API endpoints → Binance sync → Stats Bar (11 метрик) → Journal таблица.
Результат: 7 открытых позиций засинканы. Stats/Journal появятся после первых закрытых сделок.
Решение: При клике на push-уведомление переключать на таб Signals.
Проблема: Deep link /?signalId=xxx работал, но не переключал activeTab → если был на другом табе, сигнал не виден.
Фикс: setActiveTab('signals') добавлен в deep link useEffect в App.jsx.
Решение: Переписать описания сигналов, добавить спот-анализ, фильтр для Gamma Play, улучшить Push.
4 изменения:
fetchSpotTrends() + передача в analyzeAllStrategies()📈 BTC — BUY CALL $95,000) вместо generic (🔥 BTC Buy Call (92%))Результат: Gamma сигналы сократились с 5-6 до 2-3 (отсечены против тренда). Описания читаемы без знания опционного жаргона.
Коммит: e2929fc на ветке options-v2-upgrades
TODO: TG алерты переформатировать (отложено)
Решение: Убрать DCA (Safety Orders), перейти на чистый Z-VWAP mean reversion с оптимизированными параметрами из sweep.
Sweep (8640 комбо, 7d+14d robustness):
Изменения:
bybit-bot → zvwap-botФайлы: backtests/SWEEP_PLAN.md (полный план 10 шагов), analyze_report_7d.txt, robustness_report.txt
Post-launch fixes (same session):
max_favorable_pct в DCADeal, обновляется каждые 5s. Логируется в TMM close, Telegram, JSON. Для будущего trailing анализа.5 фиксов надёжности сигналов:
fetchOpenInterest() → /eapi/v1/openInterest по каждому underlying+expiry (33 combo, 1488 символов). Мержится в options перед кешированием.Gamma Play dedup — один сигнал на underlying+expiry+strike (убрал CALL+PUT дубли). Фикс в scheduler.js и dashboard.js.
Outcome Tracker v2 — реалистичный option PnL: delta × spot_move / premium × 100. NEUTRAL (straddle): max(call, put) PnL. Пересчитано 1937 сигналов. Результаты: Buy Call avg +4.7%/4h (WR 21% но wins >> losses), Straddle/Strangle/Put 100% WR +0.8-1.6%/4h, Gamma +0.3%/4h (55% WR), UV +0.1%/4h (53% WR — шум).
Signal Logger fix — direction inference (Buy Call→BULLISH, Buy Put→BEARISH).
Qty input fix — onBlur validation вместо instant reset (можно стереть и ввести новое значение).
PWA Push — старые подписки удалены, пользователь переподписался, тест OK.
Коммит: 612398c, ветка options-v2-upgrades (21 коммит).
Задачи:
Dynamic TP/SL upgrade — Gamma Play: DTE-гранулярность (≤1d: 450%, ≤2d: 350%, ≤3d: 300%) вместо flat 300%. Whale ITM: 150%→200%. Time Stop для gamma (exit at 50% remaining DTE). DTE boost больше не double-applies к GAMMA. Коммит b3ccbd6.
DRY dashboard.js — убран дублированный инлайн whale/gamma TP/SL, теперь использует getDynamicTargets() из strategies.js. Один источник правды.
PnL Calculator fix — qty input: parseInt→parseFloat, step=0.01, min=0.01 (дробные контракты как на Binance). Коммит 774e19c.
Trading API fix — /eapi/v1/account (404) → /eapi/v1/marginAccount. MARKET ордера убраны (eAPI = LIMIT only). Qty validation min 0.01 step 0.01. Frontend: MARKET toggle убран, показывает "LIMIT ONLY". Баланс $90 подтверждён. Коммит 5105813.
Ветка: options-v2-upgrades, 20 коммитов.
Задачи:
f8910e1./api/backtest/stats + /api/backtest/signals. 14 сигналов залогировано с первого запуска. Коммит e12be00.TRADING_ENABLED=false. Frontend: ⚡ Execute кнопка на сигналах → confirm modal (LIMIT/MARKET). Коммит 38ab281.38ab281.Ветка: options-v2-upgrades, 16 коммитов всего. Все 3 тира (10 задач) завершены.
TODO: TRADING_ENABLED=true когда Rick готов торговать.
TODO (futures-screener): сделать аналог Historical Signals Backtest.
Проблема: Бот входил при Z > 3-4 (FFUSDT Z=4.75, ARIA Z=3.82) — это breakout, не mean reversion. Общий PnL -$31 за 371 трейд при WR 83.5%. Три худших монеты: ARIA (-$19.38), SIREN (-$10.80), MAGMA (-$6.22).
Решения:
ZVWAP_MAX_THRESHOLD = 2.5, проверка abs(z) > 2.5 → skip перед entry. Лог "breakout, not MR".Зачем: Z > 2.5 = цена далеко от VWAP, скорее momentum/breakout чем mean reversion. MR стратегия теряет edge.
Сессия: Завершены Tasks 2.1 (IV Surface) + 2.2 (Fast Updates) + 5 layout фиксов.
Ветка: options-v2-upgrades — 12 коммитов (was feature/screener-upgrades, renamed).
Следующий: Task 2.3 🔔 Custom Alerts (backend CRUD + scheduler check + frontend UI + TG).
Коммиты этой сессии:
04f5515 — fast/slow scheduler split (30s/5m)c5b8314 — IV Surface tab (smile + term structure)dea7f22 — fix apiKey paramf6be416 — mobile layout fixesa9ee2f2 — dropdown for expiries29d6929 — IV padding07081a9 — overflow-hidden clippingРешение: Разделил scheduler на два цикла:
Зачем: 5 мин задержка неприемлема для торговли опционами. Теперь цены/Greeks обновляются каждые 30 сек.
Конфиг: FAST_REFRESH_MS / SLOW_REFRESH_MS через .env
Ветка: options-v2-upgrades, коммит 04f5515
Решение: Создан план апгрейда Options Screener v2 (3 тира, 10 задач) для превращения в полноценный инструмент торговли опционами на Binance.
Task 1.1 — Trade Signals с конкретными страйками:
buildTradeRec() — single-leg рекомендации (Buy Call/Put): entry, breakeven, target, stop-loss, max loss, DTE, time decay riskbuildComboTradeRec() — combo рекомендации (Straddle/Strangle/Weekend Trap): dual breakeven, bilateral targetsfeature/screener-upgrades, коммит d7e2b42/home/app/skills/options-screener/SKILL.mdЗаметки: XRP/DOGE breakeven нереалистичен (низкая ликвидность), основные активы: BTC, ETH, SOL, BNB.
Сессия 16:
Анализ TMM: 104 сделки после изменений (10 Apr), PF 1.35, WR 89.4%, PnL +$5.57. До изменений (8-9 Apr): 113 сделок, PF 0.49, PnL -$22.50. SL 10% решил проблему хвостовых лоссов (ARIA -$15, MAGMA -$10 больше не повторялись).
A/B бэктест (7 дней, 15 монет, 5m):
Решения:
MaxSO 4→3 — меньше капитала на сделку ($25 vs $36), SO4 часто ловил SL всё равно
SL 10%→8% — обрезает хвосты жёстче, PF выше
TimeStop убран для SO4 (его больше нет)
RAVE, FARTCOIN, TAO → GREYLIST (в BLACKLIST). Наблюдение — если перестанут лосить, вернём
BO $5→$7 — освободившийся капитал от 4→3 SO пустили в увеличение базового ордера
Баг SL/TP fix — при пропаже позиции бот всегда писал Reason=SL, даже если TP limit сработал. 75/122 сделок были неверно помечены. Фикс: проверка TP order status перед записью reason.
Telegram сообщения — 📈/📉 для LONG/SHORT, 💰/💸 для win/loss, ROI от депа (не от invested)
Метрика отсчёта: 10 Apr 16:37 Vancouver (момент рестарта с новыми параметрами)
Сессия 15 (продолжение):
1. Бэктесты EMA vs CHOP (4 скрипта):
2. BO $3 → $5:
3. Dust fix в close_full:
round_quantity (floor) обрезал qty → остаток зависал (RIVER 0.1 из 6.3)close_full() теперь проверяет остаток после закрытия и добивает dust вторым market order с точным qtyLive стата за первые ~4ч после SL10%+TimeStop+SOGuard:
Файлы бэктестов:
backtests/backtest_ma_filter.py — EMA/SMA первый прогонbacktests/backtest_ma_filter_v2.py — гранулярный + Z periodbacktests/backtest_chop_vs_ema.py — CHOP vs EMA полное сравнениеbacktests/backtest_chop_plus_ema.py — CHOP + EMA combobacktests/backtest_ema_deep.py — глубокий порог 0.5% шагbacktests/bo_analysis.py — расчёт PnL при разных BOПроблема: 84.5% WR но -$27 total PnL. 5 хвостовых лоссов (-$40.39) убивали 196 побед. SL 15% давал слишком большие убытки на полных SOs ($5-$16 за сделку).
Изменения:
so_fill_times[] в DCADeal (персистится).Решения: Time Stop и SO Guard проверяются в check_position() (каждые 5с) ДО проверки TP/SL. Телеграм нотификации для обоих. get_config() обновлён. SO guard обрезает SOs для волатильных монет автоматически через существующий guard cumul_deviation >= SL*0.9.
Фичи:
justDragged flag предотвращает деселект после drag'а/home/app/brain/projects/futures-screener-roadmap.md), частично одобрен Rick'омРешения: Ray стал horizontal (priceLine → lineSeries с 2 точками на 1 год вперёд). Events на draw panel блокируются stopPropagation (click/mousedown/mouseup/touch). Alert checker в WS onmessage, cooldown через Map. drawStore теперь сохраняет alert flag.
Дополнительно (сессия 14, продолжение): 8. 20,000 свечей — пагинация по 1500 через endTime loop (было 2500) 9. SVG иконки на метриках — mini-charts: vol (bar chart), NATR (zigzag), trades (grid) 10. Modal header redesign — все метрики с иконками inline в хедере (vol, NATR, trades, high▲, low▼), убраны дублирующие stats и links снизу
(h-l)/l*100 на настоящий ATR(14)/close*100/api/natr считает ATR(14) для топ-200 пар (batch fetch по 20, кеш 5мин), клиент fetchServerNATR() обновляет все карточки + re-sort DOM без пересоздания графиковКоммиты: 12 штук за сессию
Фичи добавлены:
Решения: Drawing tools реализованы через LightweightCharts API (priceLines для hline/fib, lineSeries для ray/trendline). Canvas overlay для live preview. Fib удаляется через группу priceLines.
Проблема: Пампы убивают PnL — RAVE -$5.85 (NATR 3.06%), MAGMA -$9.24 (NATR 2.16%), ARIA -$17 (прошлая сессия). Анализ: 130 сделок с ретроспективным CHOP(14) расчётом через Bybit klines.
Результаты NATR: Sweet spot 1.0-2.0% (WR 100%, +$6.33). Низкий <0.75% зависает (WR 74%, -$5.52). Высокий >2.5% = пампы (RAVE/SIREN, -$7.38). Результаты CHOP: Sweet spot 50-60 (WR 97%, +$8.26). Тренды <45 убыточны (WR 72%, -$5.21). CHOP 60+ тоже опасен (ложный рейндж перед пампом).
Решения:
TODO (следующая сессия): SO guard (3+ SO за 15мин → close), Time stop 3ч (PnL<0 → close), Trailing.
Файлы: src/strategies/dca_zvwap.py, .env
Баг 1: _so_order_ids не сохранялись на диск → после рестарта SO fills невидимы, avg/TP/SL не обновляются.
Фикс: Добавлены в to_dict()/from_dict(), ключи int↔str конвертация.
Баг 2: TMM retry_pending_tags() + on_dca_close() + on_dca_so_filled() использовали time.sleep() и requests синхронно → event loop блокировался на 3-10с, software SL и мониторинг не работали.
Фикс: asyncio.to_thread() для retry, run_in_executor() для close/SO fill TMM вызовов.
Баг 3: close_full() мог вернуть None (сеть, API) без exception → deal удалялся, поза оставалась без SL/TP.
Фикс: Проверка result is None → re-activate deal, retry next cycle.
Файлы: src/strategies/dca_zvwap.py
Контекст: ARIA LONG упала на 40%, SL стоп-ордер на бирже не сработал (slippage/flash crash на тонком стакане). Убыток -$17 при макс ожидаемом -$3.23. Бот полностью полагался на биржевой стоп.
Фиксы:
check_position(): если unrealized loss > SL%, закрыть маркетом немедленно (каждые 5с). Не зависит от биржевого стопа. Event: "SW-SL" + TG алерт._estimate_pnl() получил параметр exit_type: "limit" (maker 0.02% для TP%) или "market" (taker 0.055% для Z-TP/SL/SW-SL). Раньше всегда считался maker → PnL был завышен на ~$1.5-2/48ч.Отменённые фиксы (по решению Rick'а): NATR cap 2.0% и ARIA blacklist убраны — оставляем свободный вход.
Также: Binance Grid Bot остановлен (сливал). Позы STO+JOE закрыты через nuclear_cleanup(). Деп +$70 перелит на Bybit. Слоты 4→6. Деп ~$190.
Файлы: src/strategies/dca_zvwap.py (check_position, _estimate_pnl, config)
Контекст: При рестартах PM2 терялись метаданные сделок (Z-score, NATR, Vol, MaxDD, created_at). Recovery создавал cold deals с нулями → кривые TMM descriptions, некорректная оценка SO.
Решение: Сохранение deals в data/dca_deals.json (atomic write: tmp+rename). _save_deals() вызывается после entry, SO fill, close, recovery merge. При старте: _load_deals() → merge с биржей → stale cleanup.
Баг-фикс: В recover_deals Position() использовал trade_id из локальной переменной (не определена для disk-loaded deals) → заменено на deal.trade_id.
Файлы: src/strategies/dca_zvwap.py (to_dict, from_dict, _save_deals, _load_deals, recover_deals)
Контекст: 1) Каждый рестарт сбрасывал SO count на 0 → recovered deals получали свежие SO лимитки → бесконтрольное накопление (EDGE: 78 контрактов). 2) scan() возвращал 2 сигнала одновременно → on_signal() открывал оба → 5 позиций при макс 4.
Фикс 1: В recover_deals() — оценка filled SOs по размеру позиции: qty / cumulative_expected_qty. Заполненные SO помечаются filled=True, новые лимитки не ставятся.
Фикс 2: В on_signal() — re-check len(self.deals) >= SCREENER_MAX_DEALS перед открытием.
Файлы: src/strategies/dca_zvwap.py (recover_deals, on_signal)
Контекст: DCA тег пропадал (POST /tags перезаписывал), close desc затирал entry данные, SO desc затирал entry, Grid Bot сделки вытесняли DCA из top-20 results.
Фиксы:
tag_trade_both() — оба тега (DCA + L/S) в одном POST (не перезаписывают друг друга)itemsPerPage: 20→100 — Grid Bot генерил 50+ сделок, DCA не находились в top-20Файлы: src/utils/tmm_client.py (tag_trade_both, on_dca_so_filled, on_dca_close, find_recent_trade), src/strategies/dca_zvwap.py (передача natr/vol/z в TMM вызовы)
Контекст: Recovered deals получали только SL + TP, но НЕ SO лимитки. ALGO вышел -$0.03 при MaxDD -2.3% без единого SO. NEAR сидел -2.5% тоже без SOs.
Решение: Добавлен await self._place_safety_orders(deal) в recover_deals().
Файлы: src/strategies/dca_zvwap.py (recover_deals)
Контекст: TMM descriptions содержали hardcoded значения ($5 BO, MaxSO=2, SOs/2) после изменения config. Recovered deals не тегались → close description не записывался.
Фиксы:
BO=$5|MaxSO=2 → из config params (bo_usd, max_so, leverage)SOs=/2 → из config param max_soside paramtp_pct=1.5 hardcoded → из config DCA_TAKE_PROFIT_PCTon_dca_recovered() — тегает recovered deals (DCA + L/S + "Recovered" desc), window 7 днейretry_pending_tags → window_ms из pending item (не hardcoded 5мин)Файлы: src/utils/tmm_client.py, src/strategies/dca_zvwap.py (вызовы on_dca_entry/so_filled/close + recover_deals)
Контекст: SO spacing было фиксированным (1.5% × step_scale^n). С 4 SO, SO4 попадал на 9.94% — всего 0.06% от SL (10%). Rick предложил spacing от NATR чтобы адаптироваться к волатильности каждой монеты.
Решение: spacing = NATR × factor(1.0) × step_scale(1.3)^n
Пример (NATR=2%): SO1@2%, SO2@4.6%, SO3@7.98%, SO4@12.37% — все далеко от SL 15%. Пример (NATR=0.5%): SO1@0.5%, SO2@1.15%, SO3@1.99%, SO4@3.09% — тесно, TP 1.5% покрывает.
Capital: $3 + $3 + $3.9 + $5.1 + $6.6 = ~$21.6/deal, 4 deals = ~$86. Dep ~$120.
Файлы: src/strategies/dca_zvwap.py (DCADeal.init SO calculation)
Контекст: Бот использовал mark price polling (5s) + market close для TP. Rick заметил что позиция +1.5% но бот не закрывает — потому что mark price ≠ last price. Также market = taker fee (0.055%).
Решение: TP как reduce-only limit order на бирже.
get_order_status(tp_order_id) вместо price pollingВыгода: мгновенный fill по точной цене + maker fee 0.02% вместо taker 0.055% = экономия 0.035% на каждом TP.
Файлы: src/strategies/dca_zvwap.py (DCADeal.tp_order_id, _place_tp_limit, check_position, _update_exchange_orders, recover_deals)
Контекст: TMM теги были неинформативны (DCA.ZVWAP + DCA.COIN дублировали). Description не содержали данных для оптимизации.
Решения:
DCA (стратегия), Col1=L/S (направление) — чисто, фильтруемоmax_dd_pct в DCADeal, обновляется каждый check_position tick (5s)Файлы: tmm_client.py, dca_zvwap.py
Контекст: Глубокий аудит всего кода bybit-бота.
Фиксы:
_check() мог вернуть None если Bybit отдал result: null → or {} guard_cooldowns + _last_z dicts росли бесконечно → cleanup каждые ~10мин в monitor loop"Filled" vs "FILLED") → .upper() == "FILLED"except: pass при cancel orders в recovery → добавлено логированиеdel self.deals[symbol] без проверки → safe if symbol in self.deals (race condition guard)Файлы: src/exchange/client.py, src/strategies/dca_zvwap.py
Не фиксили (осознанно):
time.sleep(0.3) в sync client методах — краткие паузы (0.3s), рефакторить весь client в async = overkillself.deals dict — asyncio single-threaded, реальных гонок нет (всё в одном event loop)Контекст: Логи показали 3 повторяющихся бага:
couldn't find trade to update close desc — _find_tagged_trade() имел пустой loop + find_recent_trade пропускал тегированные трейдыfloat('') crash на get_order_status — Bybit возвращает пустую строку вместо "0"Фиксы:
_safe_float() хелпер в client.py — заменены ВСЕ float(o.get(...)) в positions, orders_symbol_to_trade маппинг (symbol→trade_id), find_recent_trade получил tagged_only параметр для поиска при closeФайлы: src/exchange/client.py, src/utils/tmm_client.py, src/strategies/dca_zvwap.py
Контекст: Обсуждение sizing для 4 параллельных сделок. Скилл был устарел (показывал Max SOs=4, SL=10%, Max Deals=2 — в коде давно 2/5%/4).
Живой конфиг: BO $5 + SO1 $7 + SO2 $9.10 = $21.10/deal, 4 deals = $84.40, деп $87 (впритык).
Решение: Без RSI. Пока не меняем sizing — сначала собираем live-данные по альтам из динамического скринера. Бэктест данные (BTC/ETH/SOL) нерелевантны — эти монеты в блэклисте, реальные сделки на мелких альтах (MUSDT, PIPPINUSDT и т.д.).
Обновлено: скилл bybit-trading-bot (DCA config таблица), MEMORY.
Проблема: bybit-bot был запущен через PM2 из cwd=/home/app/claude-code-telegram/ (директория бендера). Процесс унаследовал env-переменные бендера, включая TELEGRAM_BOT_TOKEN. python-dotenv НЕ перезаписывает уже существующие env-переменные → токен из .env bybit бота игнорировался → сообщения шли через бендера, конфликт get_updates.
Фикс: pm2 delete старый процесс с грязным env → пересоздать с правильным cwd и чистым окружением → pm2 save.
Правило: НИКОГДА не запускать PM2 процессы из чужой директории. Всегда проверять cwd процесса. Если env унаследован — delete + start заново, не restart.
Контекст: Ночная сессия 6-7 Apr: $100 деп → $89.85 (-$10.15). 159 RT но inventory losses ($18.91 MAX LOSS + $6.20 partial close) съели всю прибыль.
5 фиксов (config.py, grid_manager.py, main.py):
Inventory thresholds ужесточены:
Hard inventory cap реально работает:
_should_block_side() теперь отменяет ордера на стороне, увеличивающей imbalance при imb≥6Unstuck без EMA gate:
dist_pct < spacing * 2 — она НИКОГДА не срабатывала (0 unstuck за ночь)Breakout cooldown 30 мин:
_breakout_cooldown dict, символ исключается на 30 мин после breakout closePartial close агрессивнее:
(excess + 1) // 2 вместо excess // 2 (ceil vs floor)Баланс до: $89.85 | Ключевые лоссеры: PLAYUSDT -$8.35, REDUSDT -$5.13, BULLAUSDT -$5.43×2
Проблема 1: Partial close оставлял позу без защиты
close_position_market() внутри себя вызывал cancel_all_orders() → все ордера отменялись, а грид не переставлялся. Позиция висела голая без лимиток = риск ликвидации.
Фикс: setup_grid() после каждого partial close/unstuck. Центр = текущая цена.
Проблема 2: TMM теги через раз
Два тега (strategy + coin) = 2 API вызова. При быстрых RT'шках rate limit не давал найти трейд.
Фикс: один combined тег Grid.RED / Grid.SUPER. Retry 8 попыток × 20 сек (было 5×30).
Первые live результаты (ночная сессия):
Решение: Запуск grid bot v2 live на Binance Futures, $100 деп (50+50), 2 параллельных грида.
Параметры: $50 деп, 10x leverage, $3/ордер, 8 уровней, spacing 0.1%, maker fee 0.02%, 1m TF.
Топ-5 (7 дней): ENA +$108.84 (218%/wk), PENGU +$57.95 (116%), NEAR +$53.86 (108%), WLD +$52.24 (104%), UNI +$37.91 (76%)
Топ-5 (30 дней): ENA +$413.23 (103%/wk), PENGU +$239.16 (60%/wk), NEAR +$229.16 (~57%/wk) — ВСЕ ДЕРЖАТ
Мелкие альты (ONG/AIOT/STO): огромный профит но дикие — 400+ max_loss стопов, 18K+ трейдов
Проигравшие: BTC (-$73.62 💀), SUI, TRX, BCH, CAKE
Smart Grid (BB squeeze + gradual unwind): ПРОВАЛ на всех монетах — хороним
Файлы: backtests/backtest_grid.py, results_grid.json
Биржа: Binance Futures (первый тест), потом Bybit
Стратегия: Бесконечный грид с авто-ротацией монет
Скринер: авто-выбор лучшей монеты каждые 5 мин (BB width, ADX, volume, grid score)
Сессии: Event-driven — грид работает пока рейндж, breakout → скринер ищет новую монету
Risk: Moderate — 3% max loss/grid, 10% daily limit, circuit breaker 5 стопов → 30мин пауза
Прибыль: Воскресный чекпоинт 21:00 Vancouver — 50% профита снимаем, 50% реинвест
TMM: Мульти-теги: Column 10 = Grid.v1 (стратегия), Column 1 = монета (ENA/NEAR/etc)
Telegram: Только ключевые: смена монеты, закрытие сессии, circuit breaker, daily/weekly сводка
Код: Переиспользуем exchange.py, tmm_client.py, telegram.py из wt-bot-v3. Новый grid_manager.py + screener.py + risk_manager.py
Путь: /home/app/trading-bot/grid-bot/
Решение: Переделать Mini-Charts в полноценный рыночный скринер (Coinalyze/TradingView стиль). Было: 12 чартов в auto-fit grid, TF на каждом чарте отдельно, нет списка монет, статичные данные. Стало (за 1 сессию, 5 коммитов):
app/densities.js, app/mini-charts.js, app/index.html, app/styles.css, server/index.js
Скилл обновлён: /home/app/skills/futures-screener/SKILL.mdРешение: Тюнинг WT стратегии на основе анализа 136 сделок (Apr 1-6). Проблема: WR 40%, PnL -$9.45, 18 лоссов подряд, avg winner слишком низкий. Изменения:
config.py, manager.py, exchange.py
Ожидание: WR не изменится, но avg winner ↑ и серии лоссов укоротятся → breakeven или +Решение: Заточки на 1m (не 5m!), Squeeze на паузу, параметры v2a. Бэктест итоги (4 прогона):
zatochki_config.py, zatochki_indicators.py, zatochki_screener.py, zatochki_manager.pyРешение: Добавить стратегию в squeeze-vwap-bot на Bybit — volume exhaustion reversal.
Суть: Спайк объёма (>7x) + цена перетянута (>2% от VWAP) + RSI экстрем + объём иссякает (2 declining свечи) + OI падает (ликвидации) → вход в контр-тренд.
TF: 1m. TP1 0.7% (50%) + trail 0.5%. SL = dynamic + cap 1.2%.
Архитектура: Sole strategy (Squeeze paused). Отдельный screener (60s scan), manager, positions file. Shared exchange/telegram/TMM.
TMM tag: "Zatochki" | Telegram: 🔪 ЗАТОЧКИ
Скилл: /home/app/skills/zatochki/SKILL.md
Решение: Добавить NATR/5m >= 1.2% в оба бота. Поднять MIN_VOLUME на WT до 50M. Squeeze volume не трогать. Причина: TMM анализ NATR/Volume/Range по всем сделкам:
NATR/5m:
Volume (WT Bot, 117 trades):
Volume (Squeeze, 129 trades) — ОБРАТНАЯ картина:
Range/24h (анализировали, решили НЕ добавлять):
Config:
MIN_VOLUME_24H=50M, NATR_5M_MIN=1.2NATR_5M_MIN=1.2 (volume без изменений)
Файлы: config.py, screener.py (оба бота)Решение: Заменить фиксированный TP 3% на TP1 1.0% partial (50%) + trailing stop на остаток. Причина: TMM анализ 154 сделок показал:
Новая логика:
Сценарии PnL:
Config: TP1_PCT=0.01, TP1_CLOSE_RATIO=0.5, TRAIL_CALLBACK_PCT=0.007
Файлы: config.py, manager.py (Position fields: tp1_hit, trail_high, original_qty)
Замер стату с: 4 Apr 2026, ~12:48 UTC
Решение: Добавить TP1 1.2% partial (50%) + trailing stop 0.7% на остаток. Dynamic TP (Z-VWAP) работает на оставшихся 50% после TP1. Причина: MFE анализ 112 сделок TMM (Bybit key #276474):
Config: TP1_PCT=0.012, TP1_CLOSE_RATIO=0.5, TRAIL_CALLBACK_PCT=0.007
Файлы: config.py, manager.py (Position fields: tp1_hit, trail_high, original_qty)
Замер стату с: 4 Apr 2026, 16:07 UTC
Проблема: SIREN max leverage 5x, бот хотел 10x → position_size = $5 × 5 = $25 вместо $50.
Фикс: target_notional = TRADE_SIZE_USD * LEVERAGE (всегда $50), qty = notional / price. Маржа автоматически увеличивается при кэпе leverage.
Файл: manager.py
Проблема: Бот открыл TAGUSDT LONG с WT1=-45, WT2=-47, но на TradingView LazyBear показывал WT≈20. Сделка не должна была открыться — WT не был в зоне oversold (<-50) на TV.
Корень: Параметры WT были 9/12/3 вместо настоящих TV LazyBear дефолтов 10/21/4. С коротким Avg Length (12 vs 21) WT более дёрганый, показывает экстремальные значения там где на TV сигнала нет. Ошибка в предыдущем коммите (3 Apr) — написали "TV defaults 9/12/3" но это неверно.
Фикс: config.py → WT_CHANNEL_LEN=10, WT_AVG_LEN=21, WT_MA_LEN=4
Результат: Показания бота теперь совпадают с TV LazyBear. Меньше ложных входов, сигналы только на реальных экстремумах.
Проблема: После v2 tuning (тот же день) бот перестал входить в сделки. Score max 4, histogram diverge давал -1, Waddah нейтрал 0 → score почти никогда не добирался до 3. Бот сканировал, но не торговал. Статистика перед фиксом: 50 сделок, 20W/30L, WR 40%, PnL -$2.41 (TMM key 276474). Решение (Вариант Г):
indicators.py (calc_combo_signal), SKILL.md
Ожидание: Больше сделок с сохранением/улучшением WR. Мониторим.Проблема: WT params были 10/21/4 (lagging), TV LazyBear использует 9/12/3. Entry logic имел persistent zone flag — WT вошёл в зону, флаг оставался навсегда, входы происходили 50+ баров после выхода из зоны ("в середине, на краях но не в зонах"). Решение: Параметры → TV defaults 9/12/3. Persistent zone flag → zone lookback (cross must happen IN zone or within 3 bars of leaving). Убран WT_MAX_EXTREME фильтр (был на старых params). Создан Pine Script strategy для визуального тестирования на TV. Файлы: config.py (params), manager.py (entry logic), pinescript/WT_Bot_v3_Strategy.pine (new) Результат: Pine Script показывает значительно лучшие входы, совпадающие с TV LazyBear визуально
Решение: Создать Brain vault на сервере в /home/app/brain/
Причина: Бендер пишет заметки → git sync → Obsidian на телефоне
Альтернативы: Notion (платный), Confluence (тяжёлый)
Решение: Auto-sync brain vault → GitHub claude-brain каждые 5 минут (systemd cron)
Причина: Память должна переживать сессии; GitHub как backup + Obsidian sync
Скрипт: /home/app/brain-sync.sh
Решение: PM2 как process manager Причина: Проще, меньше overhead, достаточно для текущего масштаба Статус: Финально
Решение: Модуляризация бота (1 файл → 9), AI personality system prompt, affiliate rotation
Причина: Монолит bot.py стал нечитаемым; AI был generic; нет монетизации
Результат: v8.0 — 9 модулей, 8 типов контента в расписании, smart polls, weighted affiliate
Скилл: /home/app/skills/alphapulse-bot/SKILL.md
Решение: Менять настройки LiteSpeed Cache программно через WP-admin form POST
Проблема: Rick не должен лезть в админку вручную — Бендер может сам за 5 мин
Скрипт: /home/app/piewell.com/scripts/fix-litespeed-js.cjs
LSCWP_CTRL=save-settings — ОБЯЗАТЕЛЬНОЕ скрытое поле. Без него форма "сохраняется" (200 OK, текст "saved") но НИЧЕГО НЕ МЕНЯЕТ. Потратили кучу времени на это._settings-enroll[] — массив имён полей, которые LiteSpeed должен обработать. Без них поля игнорируются.LSCWP_NONCE (НЕ _wpnonce), брать с текущей страницыGET /wp-admin/index.php?LSCWP_CTRL=purge&LSCWP_NONCE={nonce}&litespeed_type=purge_alltype="litespeed/javascript" вместо обычного text/javascript1. POST /wp-login.php (log, pwd, wp-submit, testcookie)
2. Собрать cookies из set-cookie (wordpress_logged_in + wordpress_sec)
3. GET нужную admin страницу с cookies
4. Вытащить nonce из HTML
5. POST форму с cookies + nonce + все поля
Урок: Не предлагать Rick ручные инструкции, если можно автоматизировать. Ему 2 дня, мне 5 минут.
Решение: Системный SEO аудит всех 68 статей, план исправления в 4 фазы
Причина: 0 кликов, все позиции 70–100. Главная проблема — каннибализация (16 статей в 8 парах конкурируют друг с другом)
План: Phase 1 (titles/meta) → Phase 2 (merge 8 дублей) → Phase 3 (quality) → Phase 4 (new content)
Скилл: /home/app/skills/piewell/SKILL.md
Решение: Вариант Б — Утилиты и Browser Extensions через PopAds/PropellerAds Popunder Причина: Долгоиграющая связка (месяцы, не дни). VPN/Adblock = evergreen спрос, не выгорает как свипы. Альтернативы отвергнуты: Sweepstakes (выгорает за 3 дня), Gambling (дорого), Nutra (комплаенс) CPA сеть: CIPIAI глючит рега → Adsterra CPA (план А, акк есть!) + Monetizer (48ч) + CpaRoll (дома). Mobidea — нет нужных офферов. Офферы: Opera One CPI ($0.80–$2.40 WW), AdsBlocker CPI ($0.79 BE/FR/NL), + что найдётся на Adsterra Prelander'ы: 6 штук (3+3), A/B сплит, разные подходы (scan/speed/review/before-after/youtube) Блокеры: Adsterra CPA офферы (Rick глянет дома) + отдельный домен для лендов
Решение: Создать бота-мониторинга крипто-сигналов из Telegram каналов Архитектура: Web scraping t.me/s/ → Binance Futures data → WaveTrend Oscillator → Alert Bot Ключевые решения:
@alert_rick_bot — не засирать чат с БендеромPM2: signal-listener | Скилл: trading-signal-bot
Roadmap: больше индикаторов → outcome tracking → AI графики → публичный канал → автотрейд
Решение: Апгрейд бота до авто-трейдинга на Binance Futures Ключевые решения:
Решение: Добавить вторую параллельную стратегию — автоматический скальпинг Причина: WT стратегия ждёт сигналов, хотел "забирать часто по чуть-чуть" с высоким WR Ключевые решения:
klines[:-1], последняя свеча не закрыта → неточные данные/pnl показывает WT и Scalp раздельноРешение: Добавить третью параллельную стратегию — торговля от уровней по методологии Герчика Причина: WT ждёт внешних сигналов, Scalp берёт mean reversion. Gerchik = price action от S/R уровней с R:R 3:1+ Ключевые решения:
open_limit_order(), cancel_order(), get_order_status()Файлы: gerchik_config.py, gerchik_levels.py, gerchik_models.py, gerchik_scanner.py, gerchik_manager.py
Команды: /gerchik /gr, /gc SYMBOL, /levels SYMBOL
Решение: Все TP/SL хэндлеры (scalp_manager + position_manager) используют реальный avgPrice из Binance order response вместо mark price
Причина: На волатильных монетах (PLAY) проскальзывание SL: бот показывал -0.91% а реально -2.24%. Итого PnL завышался на $0.43 за 3 сделки
Что изменено: _close_position(), _handle_sl(), _handle_tp1/2/3() — все берут fill_price из close_full()/close_partial(). Логируется slippage_pct, mark_price. В Telegram ⚠️ Slip при >0.1%
Файлы: scalp_manager.py, position_manager.py
Решение: Все 3 стратегии (WT, Scalp, Gerchik) используют TP/SL ордера на бирже вместо polling Причина: Polling может пропустить быстрые движения; exchange orders исполняются даже если бот упал Ключевые решения:
cancel_all_open_orders() — единственный способ убить algo ордераreplace_sl_and_tps() — после TP fill: cancel_all → re-place SL + оставшиеся TPs_place_recovery_orders() с учётом TP stateГрабли (ВАЖНО, не повторять):
algoId (не orderId)futures_get_order(algoId) → "Order does not exist"futures_get_open_orders() НЕ показывает algo ордераfutures_cancel_order(algoId) → "Unknown order sent"futures_cancel_all_open_orders() убивает и regular, и algoФайлы: order_placer.py (ExchangeOrderManager), обновлены trader.py, position_manager.py, scalp_manager.py, gerchik_manager.py
Решение: Добавить XAUUSDT, PEPEUSDT, 1000PEPEUSDT в SKIP_TICKERS/skip_symbols
Причина: XAUUSDT → Binance TradFi-Perps agreement (error -4411), PEPE → еле ходит
Где: config.py (SKIP_TICKERS для WT + Gerchik), scalp_scanner.py (skip_symbols для Scalp)
Решение: /positions объединяет WT + Scalp + Gerchik в одно сообщение
Причина: Rick видел 1 позицию (WT) а на бирже было 4 (1 WT + 3 Gerchik)
Файл: bot.py
Решение: Интеграция с TraderMakeMoney API для авто-тегирования сделок Причина: Ручное заполнение журнала нереально, бот должен сам тегировать стратегии Ключевые решения:
desc not content, date field is note_at, tag-categories needs categories array wrapper
Файлы: tmm_client.py (NEW), обновлены bot.py, все 3 менеджера, ecosystem.config.js
Команды: /tmmПроблема: 4 позиции набирали 71 открытый ордер на Binance. Ордера множились при каждом рестарте, BE move, TP hit.
Корень: place_stop_market() использовал closePosition=True → создавал "неубиваемые" algo ордера, которые cancel_all_open_orders не удаляла. Новые ставились поверх старых.
Фиксы (4 шт):
place_stop_market() — убран closePosition=True, теперь quantity + reduceOnly. Обычные ордера, cancel работаетcancel_all_orders() — retry 3 раза + верификация через get_open_orders() + individual cancel fallbackcancel_all_account_orders() (NEW) — nuclear cleanup при старте бота: cancel ВСЕ ордера на ВСЕ символы ДО recoveryreplace_sl_and_tps() — логирует warning если cancel не удалсяФайлы: trader.py, bot.py, order_placer.py
Результат: 71 → ~15 ордеров (4 позиции × 3-4 ордера каждая)
Грабли (ВАЖНО):
closePosition=True в STOP_MARKET создаёт GTE algo ордер, который НЕ отменяется через futures_cancel_all_open_ordersfutures_get_open_orders() НЕ показывает algo ордера с closePosition — они невидимые-4130: "An open stop or take profit order with GTE and closePosition in the direction is existing"Решения (4 штуки):
self.cooldowns dict в ScalpManagerreplace_sl_and_tps(). Polling mode: просто pos.sl_price = pos.entry_price. pos.moved_to_be flagscalp_scanner.py. Низковол монеты (BB < 3%) не достигают 1% TP → time stop → нулевой/отрицательный PnL. Отсёк бы 7/25 старых сделок (4 time stops + 2 losses)Анализ данных (23 TMM + 25 trade_log):
Env vars: SCALP_TIME_STOP_MIN=15, SCALP_COOLDOWN_MIN=5, SCALP_BE_TRIGGER_PCT=0.5, SCALP_MIN_BB_BW_PCT=3.0
Файлы: scalp_manager.py, scalp_scanner.py, ecosystem.config.js
Проблема: Когда ордера отменялись вручную на Binance, бот не детектил → позиции оставались БЕЗ TP/SL защиты
Фикс: Step "0" в check_position() всех 3 менеджеров: проверяет статус первого TP order_id → если CANCELED/EXPIRED/REJECTED → re-place всех ордеров
Также: Убраны weak_buy/weak_sell из WT TRADE_SIGNALS (26% "dead signals", cost -$6.81)
Файлы: position_manager.py, scalp_manager.py, gerchik_manager.py, config.py, bot.py
Решение: Ограничить Gerchik стратегию моделью A (отбой от уровней). Модели B/C/D отключены через GERCHIK_ALLOWED_MODELS=A
Причина: B/C/D неправильно торгуют, нужна доработка
Файлы: gerchik_config.py, gerchik_models.py, ecosystem.config.js
Решение: Полностью остановить signal-listener. Отключены WT, Scalp, Gerchik. Канал profitVplus_game больше не слушаем. Причина: Эксперимент неудачный. Герчик Model A = 19% WR (4/21), скальпер не окупается, WT канал не дал результата. Деп $80 → ~$70. Что сделано:
TRADING_ENABLED: false, SCALP_ENABLED: false, GERCHIK_ENABLED: falsepm2 stop signal-listener
Статус: Бот остановлен. Будем думать другой подход.Решение: Запустить LazyBear combo стратегию на Bybit Futures (не Binance)
Причина: Binance бот (WT/Scalp/Gerchik) неудачный эксперимент (WR 19-31%). Bybit — новый деп $100, чистый старт. Bybit advantage: conditional orders queryable (нет invisible algo orders как на Binance).
Стратегия: Squeeze Momentum + Z-VWAP + Waddah Attar + ADX. Mean reversion + volatility breakout. Score ≥ 3/5 для входа.
Risk: $5 × 10x = $50 позиция, max 3, SL 1.5%, dynamic TP (Z→fair value)
TMM: Bybit key #276474 (bybit-tiger), tag "SqzVWAP"
Exchange adapter: pybit v5 с Binance-compatible interface → indicators/screener/manager без изменений
PM2: squeeze-vwap-bot (bybit-bot остановлен — shared Telegram token)
Грабли Bybit (ВАЖНО):
turnover24h вместо quoteVolume, price24hPcnt — decimal не %Решение: Настройка параметров на основе анализа 39 реальных сделок Причина: WR 27%, PnL -$10.19. Нужна оптимизация без переоптимизации.
Анализ и изменения:
Ключевой инсайт: Для mean reversion стратегии сильный тренд (Waddah STRONG) — ВРАГ, а слабый тренд (DIVERGES) — ДРУГ. Обратная интуиция. Отвергнуто: "только LONG" и "фильтр по символам" — слишком грубые, переоптимизация на малой выборке.
Score: макс 4 (было 5). Entry ≥3. Нужно Z + 2 из (Squeeze, Histogram, ADX).
Проблема: 7 из 24 SqzVWAP сделок без тегов в TMM Баги:
Фиксы: убран кеш (always fresh), window 5→10 мин, retry 5×15→10×20, skip already-tagged, initial wait 3→5s Также: 7 сделок затегано ретроактивно через API
Решение: Не входить в сделку если |WT1| ≥ 55 при входе. Всю статистику брать ТОЛЬКО из TMM. Причина: Полный анализ 57 сделок (TMM net PnL с комиссиями):
MAE/MFE инсайт: 81% лоссов никогда не были в плюсе ≥1% → проблема в качестве входов, не в SL/TP. Комиссии: Real R:R 1.36:1 (теория 1.50), commission drag 9%. Break-even WR 42.4%.
Фикс: config.py → WT_MAX_EXTREME = 55, manager.py → фильтр перед входом.
TMM правило: trade_log.json НЕ учитывает комиссии и slippage. TMM API (key 276317) = единственный source of truth для PnL.
Файлы: config.py, manager.py, SKILL.md
Проблема: get_open_orders() crash на float('') → manager думал ордеров нет → cancel all + re-place каждые 5с → позиция без SL protection → STOUSDT -9.8% (-$4.65)
Корень: Bybit возвращает пустую строку для triggerPrice/price на некоторых типах ордеров. float('') → ValueError
Фикс: _safe_float() static method для всех полей. get_open_orders() returns None on error (not []). Throttle order check 60s.
Решение: Не использовать Pinecone для памяти Бендера прямо сейчас Причина: Объём контекста пока не проблема Когда вернуться: Когда MEMORY.md станет слишком большим (>200 строк)
Контекст: Бот сливал деньги на Polymarket, все сделки в минус, $14 осталось из ~$21. Найдено 9 критических багов:
Контекст: Полный аудит кода polymarket-weather-bot, 33 проблемы найдено. Сделано 20 фиксов в 4 фазах: