# ForexBot2 Automated forex signal intelligence platform. Analyzes 4 currency pairs (EUR/USD, GBP/USD, USD/JPY, XAU/USD) across multiple timeframes using technical indicators, news sentiment, and economic calendar data. Delivers signals via Telegram with full trade setups (entry, SL, TP). ## Architecture ``` Twelve Data REST API + WebSocket | data_provider.py (fetch, cache, validate OHLCV; rate-limited 55 calls/min) | engine.py (6 indicators per timeframe → composite score) | signal_aggregator.py (MTF agreement + news + final signal + trade setup) | +-----+--------+ | | telegram_bot.py main.py (Telegram alerts, (CLI single-pair auto-scanner, analysis) WS monitor, live dashboard) ``` ## Core Files | File | Purpose | |------|---------| | `config.py` | All configuration dataclasses, pair definitions, strategy configs | | `data_provider.py` | Twelve Data SDK wrapper with in-memory cache and rate limiting | | `engine.py` | `TechnicalEngine` — computes EMA, RSI, BB, ADX, ATR, MACD, divergences, candlestick patterns, swing S/R | | `signal_aggregator.py` | `SignalAggregator` — MTF analysis, news integration, final signal scoring, trade setup generation | | `news_engine.py` | Economic calendar (Forex Factory JSON) + RSS sentiment (keyword-based) | | `telegram_bot.py` | Async Telegram bot with auto-scanner (M5/M15/H1/H4), WebSocket price monitor, live dashboard | | `main.py` | CLI entry point for single USD/JPY analysis | | `test_all.py` | Comprehensive QA suite (~90 tests, no live API needed) | ## Key Concepts **Signal Pipeline:** OHLCV → indicators → regime classification → regime-weighted composite score → MTF agreement check → news/event adjustment → confidence penalties → final signal (STRONG_BUY/BUY/NEUTRAL/SELL/STRONG_SELL) → quality grade (A+/A/B/C/D/F) → trade setup if grade C+. **Regime-Adaptive Weights:** Market classified as `trending_up`, `trending_down`, or `ranging` via ADX + EMA. Trending boosts EMA weight (2.0x), ranging boosts RSI/BB (2.0x). This is the core edge. **Pair-Specific Strategies:** XAU/USD (oversold-bounce: RSI<38 + triple-TF EMA200 confirmation), EUR/USD and GBP/USD (pullback-buy: RSI 30-55 + BB<0.75 + dual-TF EMA200). Each has hour-blocked windows from backtest optimization. **SELL Suppression:** Forex SELL signals are suppressed for all pairs except XAU/USD. Backtesting showed 0% win rate for forex shorts. **Trade Setup:** SL = nearest swing low/high ± 1×ATR buffer (min 1.5×ATR). TP = nearest swing level if RR≥1.2, else calculated from ATR. Minimum RR 1.2:1. ## How to Run ```bash # CLI (single USD/JPY analysis) python main.py # H1 default python main.py --timeframe M15 --detail --json # Telegram bot (auto-scanner) TELEGRAM_TOKEN= TELEGRAM_CHAT_ID= python telegram_bot.py # Tests python test_all.py ``` ## Environment Variables | Variable | Purpose | Default | |----------|---------|---------| | `TWELVE_DATA_API_KEY` | Market data API key | Hardcoded fallback in config | | `TELEGRAM_TOKEN` | Telegram bot token | Hardcoded fallback | | `TELEGRAM_CHAT_ID` | Auto-scan chat ID (enables boot auto-scan) | Hardcoded fallback | | `FB2_EMA_LO` / `FB2_EMA_HI` | EMA200 distance thresholds (%) | 0.5 / 1.5 | ## Dependencies `numpy`, `pandas`, `requests`, `twelvedata`, `python-telegram-bot`, `websockets` — see `requirements.txt`. ## Data Provider - **Source:** Twelve Data REST API via `twelvedata` SDK - **Rate limit:** 55 credits/min (Grow plan), enforced by sliding-window throttle - **Cache:** In-memory dict, TTL = candle duration of the timeframe - **Validation:** Drops NaN rows, forward-fills gaps (limit 3), fixes OHLC inconsistencies, removes outliers (>10σ), strips future timestamps, deduplicates - **WebSocket:** EUR/USD and XAU/USD only (Grow plan WS limit); GBP/USD and USD/JPY via REST-only scans ## Telegram Bot - **Auto-scan:** M5 (data-only, no alerts), M15, H1, H4 at candle boundaries + 10s buffer - **WebSocket:** Streams live ticks for EUR/USD + XAU/USD; triggers immediate M15 scan on key level breach (swing S/R, BB, EMA200) with 5-min cooldown - **Live dashboard:** Edit-in-place message, 30s refresh, shows all pairs/timeframes/prices/setups - **Commands:** `/start`, `/autoscan`, `/status`, `/cache`, `/clearcache`, `/help` - **Correlation warning:** Flags same-direction signals on EUR/USD + GBP/USD (USD-weakness group) ## Backtesting The `backtest/` directory (gitignored) contains pair-specific backtesting scripts, GPU-accelerated optimizers, and historical parquet data. Strategies were optimized on 1-year M15 data. Results drove the current strategy configs in `config.py`. ## Planned: MT5 Auto-Execution Documented in `mt5.md`. REST bridge architecture: Linux bot → HTTP → Windows FastAPI server wrapping MetaTrader5 COM. Not yet implemented. Key: `MT5Config` dataclass, idempotent orders, position-size from bridge-side tick values. ## Code Conventions - Python 3.12, type hints on public methods - Dataclasses for all config and output structures - `SignalStrength` enum (-2 to +2) is the universal signal currency - Indicators stored as `Dict[str, IndicatorSignal]` in `TechnicalAnalysis` - Key levels stored as `Dict[str, float]` — prefixed `swing_high_`, `swing_low_`, `ema_`, `bb_`, `atr` - Private indicator data attached as `result._rsi_series`, `result._macd_histogram` (underscore prefix, skipped by composite scorer) - Blocking signal computation runs in `ThreadPoolExecutor(max_workers=4)` to avoid blocking the async Telegram event loop - Shared `ForexDataProvider` instance across all scans for cache reuse