From f561311f14f246235ef73f7c32c7365a8a6bee8b Mon Sep 17 00:00:00 2001 From: Harwinder Date: Tue, 5 May 2026 20:25:50 -0400 Subject: [PATCH] updated guide --- CLAUDE.md | 231 +++++++++++++++++- __pycache__/config.cpython-314.pyc | Bin 8349 -> 8947 bytes __pycache__/data_provider.cpython-314.pyc | Bin 32766 -> 34205 bytes __pycache__/main.cpython-314.pyc | Bin 0 -> 34150 bytes __pycache__/signal_aggregator.cpython-314.pyc | Bin 22350 -> 23955 bytes __pycache__/telegram_bot.cpython-314.pyc | Bin 0 -> 30995 bytes 6 files changed, 223 insertions(+), 8 deletions(-) create mode 100644 __pycache__/main.cpython-314.pyc create mode 100644 __pycache__/telegram_bot.cpython-314.pyc diff --git a/CLAUDE.md b/CLAUDE.md index fefc11a..1159a8e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,10 +1,225 @@ -# ForexBot2 — Dev Notes +# ForexBot2 — Working Context for Claude -## Notes +Comprehensive context to avoid re-deriving the codebase in every session. +Update this file when behavior, defaults, or file layout changes. -- Free tier: 8 credits/min, 800 credits/day. Each full scan = ~21 credits. -- Supported pairs (live data on free tier): EURUSD, GBPUSD, USDJPY, USDCHF, - AUDUSD, USDCAD, NZDUSD, EURGBP, EURJPY, GBPJPY, AUDJPY, EURCHF, CADJPY. -- XAU/XAG and other unsupported symbols fall back to yfinance. -- No synthetic data fallback — if both Twelve Data and yfinance fail, the - request errors out and no signal is generated. +--- + +## What it does + +Forex + gold signal bot. Two entry points: + +- **CLI**: `main.py --pairs EURUSD --timeframe H1 [--detail] [--min-grade C]` +- **Telegram bot**: `telegram_bot.py` (commands: `/scan`, `/signal `, `/help`) + +Pulls OHLCV → runs 8 indicators (RSI, MACD, EMA, Stoch, ADX, BB, Ichimoku, Pivots) → multi-timeframe agreement check → news sentiment → grades A+/A/B/C/D/F. + +## Run commands (Windows PowerShell host) + +```powershell +.venv/Scripts/python.exe main.py --pairs USDJPY --timeframe H1 --detail +.venv/Scripts/python.exe telegram_bot.py +``` + +On Linux server: `venv/bin/python ...`. Server requires `pip install curl_cffi` (see SSL section). + +--- + +## File roles + +| File | Role | +|---|---| +| `config.py` | Dataclasses for `PlatformConfig`, `TechnicalConfig`, `SignalConfig`, `NewsConfig`. Pair lists (`MAJOR_PAIRS`, `CROSS_PAIRS`, `SYMBOL_DISPLAY`, `PIP_VALUES`). `Timeframe` enum. | +| `data_provider.py` | OHLCV fetch (Twelve Data primary, yfinance for XAU/XAG). Cache, rate limiting, validation. | +| `engine.py` | `TechnicalEngine` — computes indicators, builds `TechnicalAnalysis` per (symbol, TF). | +| `news_engine.py` | RSS feed sentiment + economic calendar event risk. | +| `signal_aggregator.py` | The "brain". Iterates primary + confirmation TFs, runs MTF agreement check, applies news, builds `SignalReport` + `TradeSetup`. | +| `main.py` | CLI entry. Parses args, builds `PlatformConfig`, runs `analyze_all_pairs`, prints colored table. | +| `telegram_bot.py` | Telegram bot. Owns `SCAN_PAIRS`, `SCAN_TIMEFRAMES`, per-TF confirmation map. Renders cards. | +| `LOGIC.md` | Engine decision flow + indicator weights. Kept up-to-date manually. | +| `USAGE.md` | User-facing run guide. | + +--- + +## Data flow + +``` +fetch_ohlcv (per symbol/TF) → tech_engine.analyze → TechnicalAnalysis + ↓ + SignalAggregator.analyze_pair (primary + confirmation TFs) + ↓ + _check_mtf_agreement → SignalReport + ↓ + news_engine.get_pair_sentiment → final score + grade + ↓ + _build_trade_setup → TradeSetup (Entry/TP/SL) +``` + +`analyze_all_pairs` calls `prefetch_batch` once before iterating pairs — that's the optimization that makes the free Twelve Data tier viable. + +--- + +## Where defaults live (and what overrides them) + +**This is the #1 footgun.** The dataclass defaults in `config.py` are NOT authoritative for actual runs — both CLI and Telegram bot rebuild the config and override `confirmation_timeframes` based on the chosen primary TF. + +| Default | Defined in | Overridden by | +|---|---|---| +| `primary_timeframe = H1` | [config.py:188](config.py#L188) | `main.py` (`--timeframe`), `telegram_bot.py` (per scan) | +| `confirmation_timeframes = [M15, D1]` | [config.py:189-191](config.py#L189-L191) | `main.py:407-417` (`tf_confirmations` dict), `telegram_bot.py:53-56` (`_TF_CONFIRMATIONS`) | +| `mtf_agreement_threshold = 2` | [config.py:143](config.py#L143) | _Not_ overridden — single source of truth. | +| `weights` dict | [config.py:133-140](config.py#L133-L140) | _Not_ overridden. | +| `cache_ttl_per_tf` | [config.py:207-216](config.py#L207-L216) | _Not_ overridden. | + +**When you change confirmation TFs, update all three places.** Otherwise CLI/Telegram silently keep the old values. + +--- + +## Per-symbol TF overrides (XAU/XAG) + +Defined in `signal_aggregator.py`: + +```python +_PER_SYMBOL_TFS = { + "XAUUSD=X": [Timeframe.M15, Timeframe.H1, Timeframe.H4], + "XAGUSD=X": [Timeframe.M15, Timeframe.H1, Timeframe.H4], +} +``` + +`analyze_pair` calls `self._confirmation_tfs(symbol)` which returns the override (minus primary) when the symbol is in the map, else falls back to `config.confirmation_timeframes`. Forex pairs are unaffected. + +To add another symbol-specific TF set: add to `_PER_SYMBOL_TFS`. `analyze_all_pairs.prefetch_batch` already unions per-symbol TFs. + +--- + +## Data source rules + +### Twelve Data (forex) +- Free tier: **8 credits/min, 800 credits/day**. +- Each `time_series` call = 1 credit per symbol. Batch endpoint accepts comma-separated symbols → ~1 credit per timeframe regardless of pair count (when used). +- API key in [config.py:197](config.py#L197). Override via `TWELVE_DATA_API_KEY` env var. +- Rate limiter is **module-level** (`_rate_lock`, `_rate_request_times`) so concurrent scans share the budget. +- Supported on free tier: EURUSD, GBPUSD, USDJPY, USDCHF, AUDUSD, USDCAD, NZDUSD, EURGBP, EURJPY, GBPJPY, AUDJPY, EURCHF, CADJPY. +- **Not supported on free tier**: XAUUSD, XAGUSD, anything in `_YF_FALLBACK_MAP`. + +### yfinance (gold/silver) +- Routes via `curl_cffi.Session(impersonate="chrome", verify=False)` — see SSL section. +- Mapping in [data_provider.py:34-37](data_provider.py#L34-L37): `XAUUSD=X → GC=F`, `XAGUSD=X → SI=F` (CME futures). +- yfinance interval limits: 1m → 7d back; 5m/15m/30m/60m/1h → 60d back. +- **No native H4 candle.** XAU/XAG H4 is resampled from H1 in `_resample_h1_to_h4` ([data_provider.py:291-300](data_provider.py#L291-L300)). +- **D1 explicitly skipped** for XAU/XAG — futures daily data via yfinance is unreliable. Engine drops missing confirmation TFs cleanly via `except Exception` at `signal_aggregator.py:189-190`. + +### No synthetic fallback +The old `_generate_synthetic_data()` (GBM with a `pair_params` dict that defaulted XAU to ~$1.00, causing trade setups like Entry 1.01) is **removed**. If both Twelve Data and yfinance fail, `fetch_ohlcv` raises `DataUnavailableError`. The engine returns grade F + warning, Telegram shows `❌ Data unavailable`. + +### Cache +Per-symbol per-TF, in-memory dict. TTLs in `config.cache_ttl_per_tf`: +- M1: 60s · M5: 150s · M15: 300s · M30: 600s · H1: 1800s · H4: 7200s · D1: 14400s · W1: 86400s + +Shared across `SignalAggregator` instances when the same `ForexDataProvider` is reused (see Telegram `_analyze_all_tfs`). + +--- + +## Telegram /scan flow + +```python +SCAN_PAIRS = ["EURUSD=X", "USDJPY=X", "GBPUSD=X", "XAUUSD=X"] # 4 pairs only +SCAN_TIMEFRAMES = ["M15", "H1"] # 2 cards per pair +_TF_CONFIRMATIONS = { + "M15": [H1, D1], + "H1": [M15, D1], +} +``` + +`_analyze_all_tfs` ([telegram_bot.py:282-310](telegram_bot.py#L282-L310)): +1. Builds the union of all unique TFs across `SCAN_TIMEFRAMES` + their confirmations. +2. Single `prefetch_batch` for all of them on **one shared `ForexDataProvider` instance**. +3. Spawns one scan per `SCAN_TIMEFRAMES` entry concurrently — each reuses the warm cache, so no extra API credits. + +Per /scan API cost: ~9 Twelve Data credits (3 forex pairs × 3 TFs, fetched once). XAU is free via yfinance. + +To add/remove pairs: edit `SCAN_PAIRS` ([telegram_bot.py:47](telegram_bot.py#L47)). +To change which TFs get their own card: edit `SCAN_TIMEFRAMES` ([telegram_bot.py:43](telegram_bot.py#L43)). + +--- + +## SSL — verify=False on server + +Live server sits behind a TLS-inspecting proxy that re-signs HTTPS with an untrusted root CA. Fix in [data_provider.py:27-37](data_provider.py#L27-L37): + +```python +from curl_cffi import requests as _curl_cffi_requests +_YF_SESSION = _curl_cffi_requests.Session(impersonate="chrome", verify=False) +``` + +Passed into `yf.download(..., session=_YF_SESSION)`. yfinance ≥ 0.2.40 **requires** a `curl_cffi` session — it rejects `requests.Session`. + +Trade-off: yfinance traffic is no longer authenticated against MITM. Acceptable because the data is public market quotes and an attacker can at worst inject bad prices. **Do not** reuse `_YF_SESSION` for any authenticated/private requests. + +--- + +## Indicator weights & scoring + +In `config.SignalConfig.weights`: + +```python +{"trend": 0.25, "momentum": 0.20, "volatility": 0.15, + "price_action": 0.15, "multi_timeframe": 0.15, "sentiment": 0.10} +``` + +Per-indicator weights live in `engine.py` (each indicator function returns its own contribution). Composite score is a weighted sum, capped to [-100, +100]. Grade derived from `abs(score) + confidence + mtf_agreement` in `_compute_signal_quality` (`signal_aggregator.py`). + +--- + +## How to make common changes + +### Add a new tradeable pair (forex) +1. Add `"XYZUSD=X"` to `MAJOR_PAIRS` or `CROSS_PAIRS` in `config.py`. +2. Add display name to `SYMBOL_DISPLAY`. +3. Verify it's on Twelve Data free tier (else add to `_YF_FALLBACK_MAP`). +4. If Telegram /scan should include it, add to `SCAN_PAIRS` in `telegram_bot.py`. + +### Add a non-Twelve-Data symbol (commodity, index) +1. Add to `_YF_FALLBACK_MAP` in `data_provider.py` with the Yahoo symbol. +2. Add a `_PER_SYMBOL_TFS` entry in `signal_aggregator.py` (D1 unreliable, so drop it; H4 needs resample). +3. Add to `SYMBOL_DISPLAY` and `PIP_VALUES` in `config.py`. + +### Change confirmation TFs for forex +Edit **all three**: +- `config.py:189-191` — engine default. +- `main.py:407-417` — CLI per-primary map. +- `telegram_bot.py:53-56` — Telegram per-primary map. + +### Change MTF agreement threshold +Single edit: `config.py:143`. Affects all symbols. Note: with N TFs and threshold T, the rule is "T-of-N must agree" — keep T proportional to N if you change one. + +### Add a new indicator +Add to `engine.py` → `TechnicalEngine.analyze`. Set its `weight` in the `Indicator` instance. The composite score will pick it up automatically. + +### Switch primary TF +CLI: `--timeframe M15|M30|H1|H4|D1`. +Telegram: edit `SCAN_TIMEFRAMES`. + +--- + +## Common gotchas + +1. **The dataclass defaults in `config.py` are not the source of truth for `confirmation_timeframes`.** CLI and Telegram override them. See "Where defaults live" table. +2. **Per-minute API rate limit hits hard with `--detail`** — one detailed run on one pair burns ~3 credits (3 TFs). Multiple back-to-back runs without ~60s gap will hit the 8/min ceiling. +3. **Daily limit (800) is shared across the whole day** — heavy testing exhausts the budget; signal cache survives but new fetches fail until midnight UTC. +4. **`curl_cffi` is a hard dep on the server** — without it, `_YF_SESSION` is `None`, yfinance falls back to its default backend, which fails on TLS-inspecting servers. +5. **`__pycache__/` is committed** in this repo (legacy). Don't add it to `.gitignore` without coordinating; old `.pyc` will linger as untracked-modified. +6. **Telegram `SCAN_PAIRS` is hardcoded to 4 pairs** — editing `MAJOR_PAIRS` does not change /scan. Update both if intentional. +7. **`mtf_agreement_threshold = 2` means 2-of-N**, not 2-of-3 specifically. Adding a 4th TF to a pair makes "2-of-4" looser than "2-of-3"; consider per-symbol thresholds if this matters. +8. **The `MTF: ✅ Aligned` line in Telegram cards comes from the engine's `report.mtf_agreement` boolean** ([signal_aggregator.py:223-233](signal_aggregator.py#L223-L233)) — not displayed per-TF. The full per-TF breakdown is only in the CLI `--detail` output. + +--- + +## Recent architectural decisions (kept short) + +- **Removed synthetic data path** — explicit failure beats fake prices. +- **XAU/XAG → yfinance only** — Twelve Data free tier doesn't carry them; routing them through TD wastes credits and used to fall through to bogus synthetic data. +- **H1→H4 resample for gold** — yfinance has no native 4h, but H1 with 60d lookback gives ~360 H4 bars after resample, enough for indicator calculation. +- **/scan limited to 4 pairs** — credit budget on free tier doesn't sustain 13-pair scans. +- **Two SCAN_TIMEFRAMES (M15 + H1) with shared cache** — gives users two perspectives without doubling API cost (cache reuse). +- **No SSL verify on yfinance** — server-side TLS inspection breaks cert chain; disabled because data is public quotes. diff --git a/__pycache__/config.cpython-314.pyc b/__pycache__/config.cpython-314.pyc index 886d755739f9f832be56d600524ba805ecff663f..0c47b3773bad38bd415a516e9bfbfa98f893a028 100644 GIT binary patch delta 923 zcmZXS&r1|h9KgTd+1dG_yTdN6JG-+pyOt7eidG)%he<+GL6p79luEP3NDzu~JcI`~ zs)KY$dJ%On@Y2siKRnhSP;|%*0uR!mo6*71pr}jVx9YIggZG)w_s2Zmdo$CWD_usT z5v>9m3&r2VU#(Zh^$_Z_&qH?-_=$I3+hxlhO zrA4C~P#4>&;LZ?+dnJOV5^8P2{#}IPafH0?iW9g=0aGBA7A(UOmJy(Lz;(n`o_|RC zk>+SOp$H3F{B~qAGUcwzsF3JnbZVoB9&f!Tkg@g5m><`VpyK9$PgqU(oqwsx@ekIm zgX#%96Q-%ON=;%vYh$m(sOTygM~{&1D-cBaAn9H z@Gf%0-ibQzwCf}{%m?j5_?|zr$NRT~X_e%hzXK5cb}%y!cFz>R(0xu%7?` delta 398 zcmezDI@gg;n~#@^0SJUyer7He-^ka@ETxoT72{Y?P^_O(l9HcXtnZdzlv?4GUt$!q zc@py^5ypL!RVC)C1+kZi1aXvz262{%g)ta2262fq(44$Sra_g(nkk4&4d{em#%OjRn;Xgo ziSvNiAaf=+%TAfBDQC#YF*#aJd2+LyE92_PC*`Ug^ccjYF0#mf)MsF1{Aj`;AbgQU z`lBg`W5ysQcacTqqdACU!5}7ikwxQ^C6H4j4>Yt$5J>oGN=;rQuVTCyB#;jxmVk&> z5U~_QECUf7AVLa6EC&%QK*Y+)ujFMX8w$%$wo>3@te@eX4jG7-9fW&8J1}5%LOh6XcK>$(0V^IJA diff --git a/__pycache__/data_provider.cpython-314.pyc b/__pycache__/data_provider.cpython-314.pyc index 61a6bc31bfaf5633d80d37bd8a8a8b1e34aeeed9..9ae04cf93ad33ebb3e1f9f374118bb5d48503232 100644 GIT binary patch delta 16841 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 W)4p5!yFPTWbG*EDbMb0v_S zWYRZx!M^A0v(GvE>~ropd+)RL)%!(%`IxRN%hV_-cnp$11%B$GsJAeadZfw3`>T*R zOEFZG>ZcgGgMMJQ%`fVZw#%Zj0z`>BGTJku8SV0@yj>Ah5S*k#*{+JJ+SO5YyC$k3 zIJzSvLd|6#k&8}-@)!*)Q~8(kgtK*T-~^q%$x#=L`Le(u-e7OqFKi+e?~nYM86 zNf_G6wMcv2TIlF~?2LDg?)Ef>!;z}ds4p}WscH?e{yX-EqBS0DdLYb(P6vE`wlX}) zW&%9{7DzqF`#z`=x1XIYAMK`&rsDm+rxGSIknL8z=!V<-b5rr$q5BAiju%TOuGDi zyNLUp>Z=u51PfqWGU29ziWIJ&f*e`gi1B1|YVG54{$nwD_Y8XLF2&47ia zjIH<6k=@MwPUAX?g5Wa; zSpV%4{z!Bn8W{ISAn${PIyo@J`h9_DgqI+iS0}NoKjM$_Vg%}eU}(S_4nRrN%gd9k zM7YMx3e9F{IfBg>7qdCsotaJCB?v|vn(zMwgiC_Kp(fFEuyozkF-B6IRN?2PAAQ0u>SCvcgXJ)u`Ph( zr9)$WZ%`P49Y*k5T`hf#vuD*wvExqeF9X@!6NVG9BFG6f6ey-))(f)IjD?llGGl$26^-g?e@O$9mOBfy29dT>{Uk3jvtPQ<-r z{GzD0fqS#bsNMx=-)V}nQoSxja9=m&aU!pYyT8K7y^zHr2(>%HAAN^Pv+jNUN!3$u;;b(4Yn*qkBFfNxyHsVwtOr;5c@ z!|TZwcY_Fd>1prSgrD63facWBfgNePz;(L!>(H-MH%B$jz*qVi9J65;+T05gZ#?BH7ZzumvJ~ zGt2bA&_gwrH7UW#D3j%3%R@)jGDvn~xnOn;)=TC!6(-qi?)OfMD3^wXu}dw|QLV7k zg(Z0~R=^BDX4rn>m8Jx@~m&7GRjwt zD<~}WsJZH}RlECcw#ZHxiEGD)Oxw%km?j>u7mqy0?{xGj-xnsy5js`+OUN#mQ8S%4x#u+ag z3)&_X7!w5zYkR>9D4)e4>f}<2x18fY2E!$mZ0TG!5aF$xLQfkYqD*KAn z{`kR%4<@X;sb8VMxS9EQwI^#v zK^bg+ye{WjN^0SJrKn3KjatzQTGf7~^o88b`=!z!NTvIg+*eB;@so{*@VCB%g^fo3 znQMnd#@V9?+yFj*Da~+?ITfs4~LV0Bd2Sa+e7Dc%t&fZG=aWz$3Qs`OJNj;=Wep0Oo#B zb)Jsh1$B5ydthXg7at0p`B2_+lsVenyzkg=Dw?eC{<mbLxu%s;Rwo-?0znjYpdaJt1pqgvLg+zx;UDD;Ku_S?6(~aD=qa zEmq5Rl4&IeRt&gFlZI>@Gy`u?m~z~LVGT4Oi69g%v!(#_vC5iy5ezC+^E#Z-rQ6wb zk>E=Fe3AT+;!f6qNVqT7T~*zW9ZZv6xX_L*J5`v(&RNv8V9RX4G~wVPq{A*b}OIWaq7t z+OAOmE*aMF^-K@ReNq8M^#~)3oGNgZ5zs^9WQ# zRIbS57JWkdOxiZ6iE^~r$X#s8;%c@U)H}Zd2Ra;_R>~vizOWTGTM?ni5sTqnz15hF zn{JJCW5Z>nj++|cYMTuiWXn#qk#S=i-1%k$PLA-T4Z=;i)Ld6ZuF(gx1UiM?wXP+@ zCjFb{&2%P?QDMVULi~c-Kxc8!g>xlvfVjDVR&%BY^bO%56wieX+}Rc@SbjLDR1vk_ ztD;ci!JU*mZaOtEIL1Kp4og$LaK~9AcW0*}6Z)|W2bG)JL!rQ4 z6eyeXZDclCuM%7IWU#Z0>_r2lqsV!CXkWWhn*=s22L* z-LS5;UOD$KZHY?UzAx4S)KGwmh&>RrdxMkE0x<;aB@s9Y$NcsX3kELeR8IR)C>WUl z>%d-Z7ru~6B@2oGHDzf=V}V$?0we2Oum@3GsKX?yM4a|tpZyB(1C85^RgnaH!*ON6*Ib#BPT&&UIkZFZLRhYJ|$tblhp~{b|@@I3FRV8!V z5@mbhWqYou_N=P)=R41JuIS6=niJ*q@$&k`vW5kEp(wGRiSK6?8@tyix`%er@QP)* z=<8y!CKIdyqvf+2y*#vB)_6tLxZZNryd<%;DZaI7v8s8Yalw~pb;n!Xi!Hs2z5Yer z@O80BlL;E4*08G2zUX|=$(2nvt?088`pxjSsNX#25UMZ48ke`WE|<2xSd=($JbvK# zmD1xx`*Fl|4nYU{rLN+t+4{KlVePYyIbWi(F<#lYRJwoJynni5MQgsIb*!2!7yBOU z<8HkmTD9cQocUV*g~k=5IbqxqH*QH7E91t>Irf*vnrmVzx8y47R*qM7j@dKIy2|C4 z&hc7K-qjTK9KCETo$E*0X)68v)C41Mzbk;3Iz}MxJChPox`wm=) zCe&78lLuRyK55`84z~$b;*F{hIbcwE!c~)|>Hl>~z8Kb2WFOQdN6iUZ>H;mFykNi& zH$61DCKhrPb&$%%^4Ho9B#~DYnrl*049dNx(<0if;66I(c>Z8#0nP32G;o8hCa$){ z`261=IZx9saK&A3R6jy?>;)HS@i#xafEOQpPq6=%rpjE^=&Z;wyVbDES!%=^+Zybb zl^pEroNS+gvv#XX!IGd{_&MJ6^nP>0v78}$ z#+-)aVAq7r+EdSM?e3!+xc;LB+%w(HbPM40?Ll}SfhzhgK084f?dR%o~-r8 z3@JH*)Jlo$%G@%rfYOfz(ZL^WSW*+B0yvSvk^luZ)!tM)U{is@W2Fix8yq8t;wcL$ zNu8BW&3))DqszJC-a-@b0XCJf-k4@nRdAl(m-piC_o2E9jn#pOpAGm01)itNc{#W- z{47}6yfQQq4NpWPfhj+W`W7!f+S9}qb0>}kW4B>mMvVB#l&&*G&I>$>$R0j{uFJHu z;l?w8Y_TkA*}S|NEP3SO85%atEnAtC3Qalzq!@>!QzMOri z17+ly((K1W&Mp}I_79bC=&{1-@}bz?VCU}dD{Oa`ur)xTe7t#J#2@st=-OD97jb&9 zpbJrgdt@7?&@e;q+-W}>@%zyJi@_<@15$*}$HT2zCHd^l3B`heE6`!fsfICMZg|V9*V-{s`W^Q{1szD`aF_ba40II$@DfI^+3! z&fW9W(A<_M$ENQ|Xlq~9*1o3Ja|Ta>-pak}IT>5Yu_ZRw#W&Yo$*Eg4=RdA`ShbR0 zId^()bg}NpqSXZ_oh28JO^YpIcE-)lgt;Pau9zFXV&1+c$uQYg@;4>&_r&w}TyA~w z?xp+_Gh%|Ni|5zPM;1Dk@;d>urDAq;&O5L8j`lh2VpYRpQR9qarFt85W>L*{#Lbl} zd+QVCN=VF2#?8Cl1ILW*`Q;N`bd&l4^~~MRcF*hosduhp{`i9I@*NA27k9o`x@bF^ z(7E3~K~n`g{`6iGO=aKm$LnF5vTnXk(Iy*jw!+C|viw>J#6VxOMaqi z)OVGLep+BgxU*3LuNU_j{E{E*peN9ey{k(X80pQ|UsxG@UZWUv? zfX1|4j_DE=lPita<}oJet0pOv%Y8I380&(*o{`>kp8fy$90qSV+1hAnH=Jzb^;))N zO)R8}t5T_krex|(g$f*;Mb>LlLh?x;rye*%JL~!0?!rhtXE0A?b+Px-b^$2sn)Fl4_?@ir*|v5tbm}pNR+xS3d=l( zRJmKmh&S-WEt=O)Gm;%JT70$$FKPs8pf@$ihQvYTQQVtgBlNK*G3CnTP8OQDZyb>p zxg|`7Tgu3xVFjaPRE)Yx+OK6aJ8++bC!FEV;NBdx!eyE}!&QJblq@WF%Uu>cbjmVQ z2Mwd$2^y?#6FI&Mg}QJI=-d)Gg0fQdHa%lVv7hdc8>N#J#*?WA!wR=zeKa5+&t4Z8+T%!d=~kp#&{0Q~6QW8u*IMXSkWX0YRtju`Ct$2QPn_c^;_`+I3YAQD zd2XscFs)?FJCas0V@cJq<)+&86WMz33V=LrC9K&?{+x_F#=1^z`%kECN$UI*HTSD- zohH4#f+U4~ouaJgMvB5D#in(N$(tw~NKsH!CF_LoACw4ZeOMJ%dWuqtZtFTiobyO;b1AY6naN zQ8JW7ZLp`>10@628Y&s1lm|^M@&FcY4ZxkN@rWMmw&pP$~Ma$jHv)xt~E5~SO(Q`gT{a;aMxvv>QW_D{K7v-^Xm?Wesg_5{ZAaA2e|?IMC) zlR?9k>^yYJK8N6&2%bmKf?)mNB+3)}9mJuU$)d8reiy;_@Vb)y7mEAoXaP~F*ndUz z_Yo`rm?~<)n-DOYBVn-D{q|utG=9VQh`yR{Dir%u z1gJu>FCuse!OIAKhC0NQycO?Tz~R8Yg2;aZFl9@Zrr;(X7Tm_z^_0k7GG%s_Cw%}n z$<}ETRIGI;GW!~~iy9aEa|FLYfCdt~2>nxR9Fs)B5_BufqRGu(K|th|i76hzQ3S6e zm_p!2u!`VU2>us>HxLkA4Rt1>YdJI1{E7@>y8-Zu=#iAllQwa`#`3oiEFeGyll?yk z1`*s2AcFkdsKyBT%L#7kHfKFK{6sK6aFLLS3e4T-@1DLpX_$lcY4y->!fQ^@R}DD{ z!`8TA>wNaY;UxpJsAj;-<=(liyYwo!89?uu^`g#G@~XCE<&(5)lC6qvn(I0>NtbXx zJGI-mnq9J3c4X1j_u`$4&RdtVJ&QWe^Sj3~>DZxjhh}y@)ifu1vTb(P+=2PY`BMvq zg<}f`7A;4vs9h@t({#t5-YZn)Wd8Ab5vAJ%{3-M+>a10*`8p+nUXqseV(yO1viUnM zvkQd_hQ(&jqWQ!Xb^p!0EvuRTyC%hIACfz)A2!SP7agpleq50U@F()zgVmCsY-w`B z>t$V|9dJLZmLjY(9+rq-QPBw16^H7@uk0e}dMRMww$@8D6ZTyY|K~e${|Qc=$POSS z*7Xn#7pN3MqJfYEDj+0*`UfTi^#imI%zRS$D8Tg!^QwNI0`1`}*jWr*iZfrAkC^O~IZ!M_< zrzx7q?- zK1QRgt4~Z-c}noWM_5agFe}$IY~0rS`|>1n_+q-tWgFR4=ctF?q`{b+>k3G^G{U;x zFW->QN_O>2#;EHz_Pf>@)(ZtOSJg&;sT72OZCxic^vJ?Sx3Q8An>^L)6tr8DqR@e# zq!moeaJDs|lpAl&$;wHWvs;&xi*%ont7wy3(}k8!7&Z%pB!noOt7EEn>Otp63y5;B zmu*MGU|$VWo03U65T%~5*=_8n-RAUWZzwmqP2ivdbE(j{G2@`Wg8GTK{%JG66J2aM zrW6&-$c9vRV_BD}pHA@*wzy6GRQh^#Tly&!zFP;9O8cUiZRxpiZd$8*u~m)9ZArBX z;<&FnUnEEcw%^n!H{Ni=mdk8UZxPlC>P_&ZI8T>FI4`ZghX1s`&sY$j)*m<7lBcnz zwJeMzy)S|(1SzG)mU@2*N9ipQ9&tTP+ zcjx2&oC~*~8~byCr!~cqtDSh6yWK`j1JjtYvt5UAjoOr8jO^dAL&Ns8dYw3X1$MW_ zUBEOjO*0bzQL_^ic zQ!@hl?j{JaIy!ZyvMuQ^1p5Gjq9Pcqx}kx$VuY#vNc*8CcTzjYK-M#X=%{@hBH=0o z{~<)oR4QXf!H;P7M(p6dg_}ka0()lEAB3C8)Ba@a>kR>~a98->U^Z11QgH9PQ2vMd5h0-A zTlG*LLxPj_?0rZ;M57yQ7*Qsk4DVBZr+(zadv5z)lpC#Qzl`M!w%+yIdiHNI_a7zL z_uKU&k35Xeck9`|Lo}(H_(MH=9&@D2d*7;`!k`NXvVb^=d3N-H-`(|Y{Rp-e>$?2U z^=Jcu2?P`*;9}(8UV-N>U&9oJWeBKYe1197kR0&$pg{=1NGtn?ULc1SNPNZ!a&4CU zdy2PbfE+}s zZszG;!EF5jBGFiLN_a8er)GrV(jer6Skhs*VrGAcZ$P1nFg22z8dQp|LSO1MU(6;}hfH`yY%&APX1dm{madn$QwlUPq#nAm|N4 z_atcsf}=t#uLM85e}G(b3%2iu*&75hV(gOGHx|_or{h!2URBr|UKLepu+q7%qR=%ZUAP( z9~_B}ve%GR8R0U*(*a&S&JKX2foCxbk<3!OL5lDikY50TCj>F^QoKxpH47I>5#smY z<+ywYV&mR0`)6!Xj-4QH!jc^XT*Lw3Mhk!asvqN(=evL0`tjQpTykMPVB$j*+xT~lT2@5 zQp5Ok%vxS%j&fSHW~cPF*u{be3TCtCw#?UE-o8-uV#Z>Zd(qjulyz)cwqnYgX?tj3 zT8W94hfY8u$2K$aP;6R#T}ElL&!a!1@UgzfJr8^4s-F#fWBi%%%gn0UbpG(U!!tFH zO+J3t!*|Uw-?Dti`keK01Pic6(Nl`2)tA(B{vuwF#$yC2!T*_*l zmaS$PFSuvAm$C|{Wp5jE9?N)K^@wV=_36Wx4nKKh$-FILz9nwHWy##IpkFpOFAOdj zJEj$@F^l!Fp2zzh>3j6nCFrzg*-|~7xhhwlSDaIv&pekoqgXcA%ug)m?7Jer<*MHL z82k8{N6yT$kKVbgFP+Xd{`j)~_;jr4ZEe>1 z$#atlZ9!aHu%s=VZN372E}h{k?8V6kCKEX&@tl%5!`#qPPR+8e=7RXDI_rXW#_`a| zvO0gdWd&kAaJDxm)b?u@O26s4mC_q8njbXJ6qBh~)#)#0JeV;fo28d@n_%Du%S_=z zyQZbn-gEM+=2*dO>9V-yv7TgA7ZW<%{?w+YOP?s6J38OGv}wXfxQWXBW`faPAnQ6ONNSsp*C))oxgK_e4%!6TicSMeOivv(LAV`Etzj!Fuu6? ziq17HeOseF@43&j5>x9hw4l6k4_Q$g;1fDFdwNYO&Qro=tv=^^hB(taEn1UP7RR*c zy!@Q}%bK_4ndepKR4bY0nd}+)tZJ^~8%LfwvRJnF@_|*YEuk%Z6;@I4lD2v=vu55g zKYW?__HE#&+};8=shT#7qEaZKL7jeD!EOZf*9N^^XuS#!-WE)uu1{inAhd^^#Kh6u zhFH`%KHvGMnvdF|B{-{Sh z8ae~Nhmn$CKG4PLxXwGyhs7#xP6Wk9*)6vWX_DR0d- zL@92BL_p90YD5^Cjk+283vPDOsAm6wX#@Ch;a5&SnXG6#j(sU3AvP7)9rHZT$hf<6E$1$&a)Jv9M869kfe?%PwPwC?$ay%#5PXb)LLtyJ zIGQ`iARt#Z{g^TV;IjtcM>pQeNCX31hWuk=0|T(Awm?w?c%d2uH3*%XECMtqB7W{v z>?Jk+cyEpTcyFzQYdCAnfnP4Yhd*}u0KN|RVaj{tS1liGLe$#Ii6b^xlZDr1xM2oKjYS zfXo&u*(7kCSB&_hhsbYGgjpuqIJtiULr#zitHl(qAtEkbzIQz2n;7%o!VW-ZD91=Y z<)lI&!lMW>s03Jl;U+t^()Hu22~TMYTlr>#HlTBQTo>@!|RmxH&pu) t)qYi>ODJ+*Rpid>Tv8OBg)=}zD`qTkdqXQeP)6jm{(bm?1}(_t{{g|+5Y+$x diff --git a/__pycache__/main.cpython-314.pyc b/__pycache__/main.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b764f1d7226ee366ef9a8bc9bab96e9ee3df921 GIT binary patch literal 34150 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
CN1^P2+WUkCM`Rj5twsxBDyna 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

0D~4kwU zfP>22aP9Q#H(pLDb37t@S zs)n<5rcZblAC2b@@wr8-8i4w5U*=QA9l!gsoZ56w5!emm=r2oZkK3ug+*5emrv5kP z?mh7G^TI+$v-%fwzN1b3i``nVe`V8v|F7(O99vbKO#wE3fgMNP*qBZ6x5%il)w8e> zr`X@3h1#mD2`y+2iY-7F60yR^vb3Ns0_!FD6cVq4(@6N;b5KwYx?!xdC|V{jFk!I& z4I}B$(xZj4p$tcm&r4nGE@9IlBY~Ws5k9_!WCGiZ7SI8dWcKjs07iwrqfk6in-uD&<&+}#H$R8X@sLNyO^5|hsT^?6AeX25U z0O}jHN}>Fk0_z(+rP%+CwMbEhAB!#fdb?ghe_ae;Q~stDJ|X+%c9UY?*Ol~ NQ9n#K>T*&E{~i63+V%hd literal 0 HcmV?d00001 diff --git a/__pycache__/signal_aggregator.cpython-314.pyc b/__pycache__/signal_aggregator.cpython-314.pyc index 1770de26835a68ef8262ac9ab6c148806457017a..d657f745bc4ac1d65ae9757b9578aa4b41509633 100644 GIT binary patch delta 3534 zcma)8dr(x@89(Q~c3~IxarXfW8y3(Ngz`|tC#xzXqJFgvj%LMEnwH|+(2nj0}jo>X+w)M;L=ziI8}kr`Xr;-2=dCO1m7J&$1+&~Jm|Y_*u3fVff>z9R7SLJKI&E1H7o$>pY8BQ6 z$01{PV^>$_mV3Gx)yyesmR8{MRE_iw#txdR)B)24h|B4uA%N>sy5R{KUJqvdP{8#x z+q%&78Z5{Twik{Qj#St)tcflZhlACmpd*A<Q6V8_v%EB~lz&bxBf+dS=U zzFe{4cgm%TW;*DYTDAuaz6wt=7l4PKE4$|r!1Fby%vXxn08Q(iUVNP1=NuHOFtvHz zRClV+1B$B64P_&4p$-QR1+-Whb81Z6rvMroz`8!bfzYh5bnrjOS+ZxG*}9@ znlFVr3hDcBN;NN7{;T5P0`=H?VD+CVrN)pRj=aG0zEovx5*B2F|N zN0Tfe{XY6??j{32O%tY)r>I?ZKV3FiHfyh(u~$ypLN71-W!Y5O?5eJrRb9XyQRcv) zZnADxU3pnud1UjP+5SY^H`~6uY}QjX?wLWZx{YaO2~gx z#4XfTsEW7-r#>urOUAu)YWcZ>uYnc$I)g_UY-hl}gtRhvgdX?*wR!?bJ%ep#I5sj6 zC*NW!AA`r3CNn`|!x3^Y+&@5A-jm1a=@onMA(~NAq&x+JsTzrmAaImv5Mk?)>I0H?(3>@_7# z?S93=C5sJZshxv4N;f(4%?rScqaK=Ydg*Y!$tZ+`0XO75wR&^t8K;ViIR&*mmJmaN z6?I9YLIoNXnz9gjcuPpU`v5|N&`|PGs|lfy)GoAI7Heu$NJzzCSpZK$ilI_`XlpR4 zjgk@How@DX*_8CbLHQy+NZP&ep>p58_(*(|#6|{vi75HXqSQAQ-ybCe8f>znRMsuw zj;+CP=kB&m+wTqUZ0gj-!Kk*_;#f~38bGN`qKxKsU`$Wf4NECNPJuGX+P&ZJ^Z5vL z9Y`Voy{I!bI1(9Z92_Lk!H5({L{=M?9yx+o{Bs*pQ z(#O0GG!r2;YXi-`YB;I4DxwnCcO%fOOH0>;n~#5hP~Kzj7cXMdoy=F3stN2PijJ-gQZ7a9)ef0sa%aCAwQ8G_2ZhHj32#dJs zo>m9$PbFI)#>xzv@-8c4g%|OYDQjDgj6a~m!Qp#9^W4VFcyqhPe3~Hd`$#Oo{s!bc z)A3JhXVg{(O#tbH=b>Dq{!Sl$i8goo@sp{M&PnWKR|3+{U@wCQ07@;i(&AY*!1%)q z4l!U=K%Qmr0)rPByhPi&R%{#wG8qN9^$j$R<^@?cE@Z<6<_5dPESTX+aGl)?7HWf7 zcHMw0o9tTHCqO&mJ!!#8Pj}tz`QnDi7Nt`T$5bu4wblQ1d8-qG7+fK^!U_BeM}7_*w3ECr```A**!GS^hQg7Nk+{Zxy~%Kx zur==Nz-$gCaF;G;Lo=swElkf)6>Pa>NUC$sD`J82ToKF6Lvo* z_c36LLttz!4{Re3OgGjK$NNWzq7B3a8XnzQu)K9$#29}>-w8Erup-%VEca>er1!au xADN#wpN#!%=+w}(wQf$z{zCb6S*#SsEjL-{*UdC@*J|5l8Mot`h`;zB=Re*$B@_Sv delta 2187 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