4 Commits

Author SHA1 Message Date
gavindiaz c264ba4d47 Wire watcher into CONFIG + load env in npm scripts
- npm start / watch:telegram: add --env-file=env so TELEGRAM_* and HTTPS_PROXY from nv reach process.env
- watcher: import CONFIG.candleWindowMinutes from src/config.js so the per-window latch stays in sync with the bot
- watcher: replace prevSide/cooldown latch with lastSentWindowId keyed on floor(ts/WINDOW_MS); one alert per window, NO_TRADE rows no longer reset state
2026-07-22 07:29:42 +08:00
gavindiaz 08560d05f2 Fix critical bug: watcher was ignoring every real ENTER signal
The bot writes recommendation as "side:phase:strength" (e.g. "UP:MID:STRONG")
without an "ENTER:" prefix per src/index.js:721. The watcher checked
startsWith("ENTER"), so all real signals were treated as NO_TRADE.

Only manual test rows (which I had user write with ENTER: prefix for clarity)
ever triggered. 7,460 real signals over 8 hours were silently ignored.

Detection now uses rec.includes(":") as the ENTER marker, parses side from
split[0] and phase/strength from [1]/[2].
2026-07-22 02:10:02 +08:00
gavindiaz ee2ab5dda4 Fix double-push race + add slug debug log
Two fs.watch callbacks can fire for the same row within the 300ms debounce
window. Both enter the setTimeout, both read prevSide=null before either
sets it, both call send(). Result: duplicate push within ~20ms.

Fix: track lastSentTs. Same row timestamp = skip. Only a NEW row from
the bot (or a new manual append) can trigger another push.

Also log the slug before each push so we can diagnose the missing link.
2026-07-21 18:25:02 +08:00
gavindiaz 9b0da0279f Add Telegram watcher, dashboard docs, and deployment config
- scripts/telegram-watcher.js: push ENTER signals from signals.csv to Telegram
- DASHBOARD_GUIDE.md: complete dashboard field-by-field documentation
- package.json: add watch:telegram npm script
- .env.example: deployment env template
- .gitignore: exclude ecosystem.config.cjs/start.sh (server-only with paths)

Watcher reads recommendation column and triggers on:
  - transition NO_TRADE -> ENTER:side
  - flip ENTER:UP <-> ENTER:DOWN
  - 30s cooldown prevents spam
2026-07-21 18:00:21 +08:00