From b936d443b8f1a321018d428693db578f2c46fd3d Mon Sep 17 00:00:00 2001 From: Harwinder Sekhon Date: Mon, 3 Aug 2026 11:08:48 -0400 Subject: [PATCH] Cleanup: remove dead code, stale docs, and all non-main branches - Delete back-compat shims data_provider.py / oanda_provider.py; test_all.py now imports providers.* directly (ForexDataProvider name retired; the two shim-only tests removed, 268 -> 266 tests) - Delete backtest/research/calendar_store.py (no importer, no entry point); config.py audit comment reworded - Delete executed plan doc (2026-07-21 centralized-config) and the two unbuildable guide PDFs; HTML guides remain the source of truth - OANDA_MIGRATION_ROADMAP.md status header corrected: phases 1-2 shipped 2026-07-28, feed is live on Oanda; phases 3-6 still unbuilt - Branches deleted locally + on both remotes: oanda_demo (merged), web-dashboard, eurusd-modular, reversal-exit-alert (owner-approved permanent deletion); July stash dropped Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_019zR58p8ACW1oJ5QXVUZ5es --- CLAUDE.md | 4 +- OANDA_MIGRATION_ROADMAP.md | 4 +- backtest/research/calendar_store.py | 94 -- config.py | 2 +- data_provider.py | 24 - docs/ForexBot2_Beginner_Guide.pdf | Bin 90694 -> 0 bytes docs/ForexBot2_User_Guide.pdf | Bin 111144 -> 0 bytes .../plans/2026-07-21-centralized-config.md | 980 ------------------ oanda_provider.py | 9 - test_all.py | 171 ++- 10 files changed, 75 insertions(+), 1213 deletions(-) delete mode 100644 backtest/research/calendar_store.py delete mode 100755 data_provider.py delete mode 100644 docs/ForexBot2_Beginner_Guide.pdf delete mode 100644 docs/ForexBot2_User_Guide.pdf delete mode 100644 docs/superpowers/plans/2026-07-21-centralized-config.md delete mode 100644 oanda_provider.py diff --git a/CLAUDE.md b/CLAUDE.md index 6316622..8b550b7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -11,7 +11,7 @@ Every numeric threshold in `config.py` and `pair_signals/xauusd.py` was backtest ## Commands ```bash -python test_all.py # QA suite: 268 tests, 18 modules, no network (mocked) +python test_all.py # QA suite: 266 tests, 18 modules, no network (mocked) python main.py --pair XAUUSD --timeframe H1 --detail # CLI signal report (--json for full dump) python telegram_bot.py # the bot (refuses to boot without credentials) python oanda_daemon.py # auto-execution daemon on Oanda practice account @@ -49,7 +49,7 @@ Signal currency everywhere is `SignalStrength` (−2..+2). DataFrames are UTC tz ### Layers -- **`providers/`** — one class per provider subclassing `BaseDataProvider` (`providers/base.py`), which owns everything the pipeline depends on: TTL+boundary cache, forming-candle drop, freshness check, validate/clean, paginated `fetch_range` (feeds the backtester from any provider), optional tick streaming. Subclasses implement only `_fetch_raw` + symbol/interval maps. Registry + `make_data_provider` in `providers/__init__.py`; config.json `data_providers.active` selects the live feed. `data_provider.py`/`oanda_provider.py` are back-compat shims. A test enforces that subclasses don't override shared base methods. Tiingo is candles-only — do not re-add spread display from its free FX feed (two-tier indicative quotes, removed 2026-07-23). +- **`providers/`** — one class per provider subclassing `BaseDataProvider` (`providers/base.py`), which owns everything the pipeline depends on: TTL+boundary cache, forming-candle drop, freshness check, validate/clean, paginated `fetch_range` (feeds the backtester from any provider), optional tick streaming. Subclasses implement only `_fetch_raw` + symbol/interval maps. Registry + `make_data_provider` in `providers/__init__.py`; config.json `data_providers.active` selects the live feed. A test enforces that subclasses don't override shared base methods. Tiingo is candles-only — do not re-add spread display from its free FX feed (two-tier indicative quotes, removed 2026-07-23). - **`engine.py`** — `TechnicalEngine`: 9 scored indicators (ema_trend, rsi, macd, bollinger, adx, roc, keltner, divergence, candlestick) + ATR as context. Regime classification (trending_up/down, `trending` = mixed/direction-UNKNOWN, transitioning, ranging) drives per-indicator weight multipliers and regime-aware RSI reinterpretation. Compute order matters (ATR first; MACD always computed even when not a pillar — divergence needs the histogram). Private series ride on the result as `_underscore` attrs; scorers/formatters skip anything `_`-prefixed or weight-0. - **`signal_aggregator.py`** — MTF agreement, diminishing-decay penalty system, exhaustion hard block, quality grading, then an ordered chain of post-grade gates (session, XAU SELL quality/vol/hour, regime blocks, M5 noise gates), then three setup generators: XAU ATR (A+/A), generic swing-based, plus the M5 pullback (`XAU_PB`) and chart-pattern (`XAU_CP`, `chart_patterns.py`) entry paths. `TradeSetup.strategy` selects trailing params; trail params are stamped on the setup from the *producing* config so per-TF overrides reach formatters. - **`pair_signals/`** — per-pair config factories. **Always use the factory (`produce_signal` / `make_config`), never bare `PlatformConfig()`** — the factory applies the config.json overlay first, then the validated per-TF deltas (M5 hour-9 block, M15 trail arm 0.70, M15 SELL-hour block, etc.; evidence in the docstring). A test enforces factory ≡ inline-config equivalence. Confirmation map: M5→[M15,H1], M15→[M5,H1], H1→[M15,H4], H4→[H1,D1]. diff --git a/OANDA_MIGRATION_ROADMAP.md b/OANDA_MIGRATION_ROADMAP.md index f13ce18..cc4e4ba 100644 --- a/OANDA_MIGRATION_ROADMAP.md +++ b/OANDA_MIGRATION_ROADMAP.md @@ -1,10 +1,10 @@ # Full Migration to Oanda v20 as Market-Data Source — Roadmap -**Status: reference roadmap, not scheduled for implementation.** Owner decision 2026-07-24: document only; when executed, Twelve Data stays as a **permanent fallback** (no removal phase). +**Status: partially executed (updated 2026-08-03).** Phases 1–2 shipped 2026-07-28 via the `providers/` package refactor and the live feed switched to Oanda (`data_providers.active: "oanda"`). Phases 3–6 remain unbuilt: the level-breach stream monitor is simply disabled for Oanda, and the pinned backtest books are still Twelve-Data-pinned at the $0.30 cost assumption. Owner decision 2026-07-24 stands: Twelve Data is a **permanent fallback** (no removal phase). ## Context -The `oanda_demo` branch already executes trades on an Oanda practice account, but the signal feed (Telegram bot, CLI, backtester) still runs on Twelve Data. Oanda's API is free with no metering (120 req/s vs TD's 55 credits/min), serves real bid/ask spreads, and matches the actual trading calendar. The 2026-07-24 divergence study (`backtest/research/oanda_td_divergence.py`) proved the switch is **not plumbing-only**: steady-state bars differ by median $0.69 (11% of M15 ATR), bar direction agrees only 89.9%, TD prints ~4,000 phantom Saturday bars/yr + 21:00 UTC rollover bars that contaminate Monday indicator windows, and Oanda's real spread (~$0.72 liquid / $0.84 rollover) is ~2.4× the $0.30 the validated books assume. So the migration = plumbing (Phases 1–3, inert) + shadow evidence (4) + book re-validation with owner gates (5) + reversible cutover (6). CLAUDE.md rules 1 (no tuned-value change without re-validation) and 4 (live == backtest parity) govern throughout. +The daemon already executes trades on an Oanda practice account, and since 2026-07-28 the signal feed (Telegram bot, CLI, backtester) also runs on Oanda. Oanda's API is free with no metering (120 req/s vs TD's 55 credits/min), serves real bid/ask spreads, and matches the actual trading calendar. The 2026-07-24 divergence study (`backtest/research/oanda_td_divergence.py`) proved the switch is **not plumbing-only**: steady-state bars differ by median $0.69 (11% of M15 ATR), bar direction agrees only 89.9%, TD prints ~4,000 phantom Saturday bars/yr + 21:00 UTC rollover bars that contaminate Monday indicator windows, and Oanda's real spread (~$0.72 liquid / $0.84 rollover) is ~2.4× the $0.30 the validated books assume. So the migration = plumbing (Phases 1–3, inert) + shadow evidence (4) + book re-validation with owner gates (5) + reversible cutover (6). CLAUDE.md rules 1 (no tuned-value change without re-validation) and 4 (live == backtest parity) govern throughout. **Master sequencing rule:** Phases 1–3 land inert behind `data_providers.active == "twelve_data"`. Nothing changes live behavior until the Phase 6 config flip, which stays reversible forever (TD is a permanent fallback). diff --git a/backtest/research/calendar_store.py b/backtest/research/calendar_store.py deleted file mode 100644 index 3327e1c..0000000 --- a/backtest/research/calendar_store.py +++ /dev/null @@ -1,94 +0,0 @@ -"""Load and query the historical economic calendar (backtest side). - -The store is built by `ff_calendar_scraper.py`. Timestamps are unix -epoch (UTC) — verified against known release times and price-volatility -alignment (see scraper docstring). - -Key API: - cal = load_calendar() # full DataFrame, `utc` column - ev = precise_events(cal, ["USD"]) # high-impact, minute-accurate - mask = event_window_mask(bar_index, ev.utc, before, after) -""" -from pathlib import Path -from typing import Iterable, Optional - -import numpy as np -import pandas as pd - -PARQUET = Path(__file__).resolve().parent.parent / "cache" / "calendar.parquet" - -# timeLabel values that mean "no intraday time" — these events cannot -# anchor an M5/M15 window (German Prelim CPI is the notable High one). -_UNTIMED = {"All Day", "Tentative", ""} - - -def _parse_release_value(raw) -> float: - """'0.3%' / '-1.7%' / '228K' / '1.1M' -> float (nan if unparseable).""" - import re - if raw is None or (isinstance(raw, float) and np.isnan(raw)): - return np.nan - m = re.search(r"(-?\d+(?:\.\d+)?)\s*([kmbt])?", - str(raw).replace(",", ""), re.IGNORECASE) - if not m: - return np.nan - mult = {"k": 1e3, "m": 1e6, "b": 1e9, "t": 1e12}.get( - (m.group(2) or "").lower(), 1.0) - return float(m.group(1)) * mult - - -def load_calendar(path: Path = PARQUET) -> pd.DataFrame: - df = pd.read_parquet(path) - df["utc"] = pd.to_datetime(df.dateline, unit="s", utc=True) - for col in ("actual", "forecast", "previous"): - df[f"{col}_num"] = df[col].map(_parse_release_value) - df["surprise"] = df.actual_num - df.forecast_num - return df - - -def precise_events( - cal: pd.DataFrame, - currencies: Iterable[str] = ("USD",), - impacts: Iterable[str] = ("high",), - require_values: bool = False, -) -> pd.DataFrame: - """Events with a minute-accurate timestamp, filtered by currency/impact.""" - out = cal[cal.currency.isin(list(currencies)) - & cal.impactName.isin(list(impacts)) - & ~cal.timeMasked.astype(bool) - & ~cal.timeLabel.fillna("").isin(_UNTIMED)] - if require_values: - out = out.dropna(subset=["actual_num", "forecast_num"]) - return out.sort_values("utc").reset_index(drop=True) - - -def event_window_mask( - bar_index: pd.DatetimeIndex, - event_times: pd.Series, - before: pd.Timedelta = pd.Timedelta(minutes=30), - after: pd.Timedelta = pd.Timedelta(minutes=30), -) -> np.ndarray: - """Boolean mask: bar OPEN time falls inside [event-before, event+after). - - Use on a backtest's entry times to identify trades entered around - releases (avoidance counterfactuals, event-window cost models). - """ - starts = pd.DatetimeIndex(event_times) - before - ends = pd.DatetimeIndex(event_times) + after - order = np.argsort(starts.values) - starts, ends = starts.values[order], ends.values[order] - # merge overlapping windows, then interval-stab each bar time - merged_s, merged_e = [], [] - for s, e in zip(starts, ends): - if merged_e and s <= merged_e[-1]: - merged_e[-1] = max(merged_e[-1], e) - else: - merged_s.append(s) - merged_e.append(e) - ms = np.array(merged_s) - me = np.array(merged_e) - ts = bar_index.values - pos = np.searchsorted(ms, ts, side="right") - 1 - ok = pos >= 0 - res = np.zeros(len(ts), dtype=bool) - res[ok] = ts[ok] < me[pos[ok]] - return res diff --git a/config.py b/config.py index a83f377..35b2c77 100755 --- a/config.py +++ b/config.py @@ -146,7 +146,7 @@ class NewsConfig: # against the validated 12mo XAU M5 book (547 trades, +139.9R) # showed they suppress 25-35 trades worth +4.6..+7.2R/yr — trades # entered near USD releases OUTPERFORM (+0.475R vs +0.256R avg). - # Audit 2026-07-11 via backtest/research/calendar_store. + # Audit 2026-07-11 (calendar-replay study; tooling since removed). event_risk_caps_signals: bool = False # Whether headline sentiment moves the SIGNAL (aligned: +5 confidence; # conflicting: 10-point penalty). Warnings are always emitted diff --git a/data_provider.py b/data_provider.py deleted file mode 100755 index bcbb4db..0000000 --- a/data_provider.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -ForexBot2 — Data Provider (back-compat shim) -============================================= -The provider implementations live in the `providers/` package: - - providers/base.py BaseDataProvider (shared contract + behavior) - providers/twelve_data.py TwelveDataProvider (SDK fetch, throttle, WS) - providers/oanda.py OandaDataProvider (v20 REST, real spread) - -`ForexDataProvider` is the historical name of the Twelve Data provider and -is kept as an alias so existing imports keep working. -""" - -from providers import ( # noqa: F401 - BaseDataProvider, - DataIntegrityError, - PROVIDER_REGISTRY, - TwelveDataProvider, - make_data_provider, - _is_forex_weekend, -) - -# Historical name for the Twelve Data provider. -ForexDataProvider = TwelveDataProvider diff --git a/docs/ForexBot2_Beginner_Guide.pdf b/docs/ForexBot2_Beginner_Guide.pdf deleted file mode 100644 index 14d0b608f01be438371c4cb193bce4994ff0965b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90694 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 lmgNU)*k0>A%xEbtNh~Ugw;t1pvwjI%NO= diff --git a/docs/ForexBot2_User_Guide.pdf b/docs/ForexBot2_User_Guide.pdf deleted file mode 100644 index 965a36e0ad1fadb0d48a84b7891869413010fbf1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111144 zcma&N1B@szx3)X>?6Gazwr$(CZQHhO+qONk$F^tg{&Mcg{r{Zg<|JK7(=_Ruv`OD* zwTnbvSd@l=mJN#JE-$qhiUpq@-_Fnyikq8G)WX`?#1WrP)Y`z=MA*d0&e()b+Qin( z*&Lsdjft6;7s|=m(Zs+8%6;=%+a~U)72)Sb?_dtF^7t-?zkxps#Ny_U1?|odD$i3; zjTShlCk^fQFTYr-`OG{~q^8|M+YDfXi~{m$hM6vVG3pD{?>E$)-+~~T5!CL@=Uf*Z z*9xdxujjj??d)%$YtE|#*}7E?Csqnz+i&+{!;l@T$L5#XCX9n^Y0>=4Se>ii)(%d- z(r4apfKmjQG(9^?U62d=jw}f%`z9STNR{oLzxJi0>aYm%2PiEFRdGohNq2^HoS?mIS#kLyavI{Lm7+i~j8!o?C zoFmvWjQ`^3(u)A$js+eN$foQuHa;$9Knv*#;H0g=o{};cP+(g;kQkNb8U`%yFpq~} za|86IdD*M6Z*dFRVZ13ero3YjkX7yiVO&v6TE{c;h6Zw}8{zA*0Wu-vsqbsJ@S9*o ze0H2~zTlvoGM=vhutaD6AUD`b-75st!zdgSZs@M-7$k;5d|toE#M}T$x{`|`O2SLx z7vRi7ep^NjKG?A#HgRcr2B<6Mr0iKdIT6>)w5-&|`PZ;)SO0(7qAi#A`1tG;QV}d6 zSJ3nsq3uK8HV)(dqR#AlM$H(siPjQC_$qAjb6@B-x`NBttNBVT%(PW)nD!S z7-uPBPnJ%Xn#6tf8a8jNZ(nDvsVvqb3eS zDFxY*@E5=!kF$fQHh~;P?zKMfQo1PWVq* zB3N~%Vs3PYs3TgOTQ7vWPONfcQ^PWFA*Nns)~NgDl&VRwbqdFi^%UYqa7(Om0sZvl z@{HLRa+iF3lL?4Fs4kz7md>5M4y* z&d+~(v-1L$H{t^$YVgtEWzfx-jYg8Kj2~bOXE5_9V~53eSs{DVs2bd_8sIH95J``z zK0va9!S89e6UJLdL7Joq^%pZc$ka#~(DCReHS54te6<5YyDGknCn(HVYcFH1h+nTr zI(VWmH6uB(d%4SUzY%x*ke8?JP7hI^&PZU2Ki$u!+dT)&o#q7j)&Eo>B|WTXtM!A$ zG)pl^CT>TfjOWxbn3%+7gRs$!8X(_YIg`1mj-Qhpv8%jcGZf$;j@uJBGs)zn1ta@J z8Ruq8YE;8?_r0x*IFr{4cvK!|IiZ3P$?04vI4baWDKmAu^j$$6h&-U0)_~+i+UEf~ z_cAOq&I~n?G za;kG-x7Baj&rs81Z>F_?b|OlyC3Tfn7z!jM(NU9`hzQcYFe|1y=G>MBi}d`pub3v# z)aZ(*Z#RdLMS%>1ME@$EVGJ;1bH47~S0b^X{7Th(eh;aMP(4p|Y8_lSx5Avt=r%vE zb*5FEL}N|$WpZ1NZPi`0Gr5*Oqo*xXIs}QL#|9}un_a9WgFuwLYi8-V zV5^0R~A!wkO6cSU{RRYI_9NZU3Btu)BkL z+55`54YyImyul}}Q<`Tf!SJzE-aHH)#rAza{VpPmYl`DiuvLzs7wM1l# zmKjzt%|dzzDz#lS?hitj4B{Z`l=74`g8zkk+n<=H7H!1AHSFhDgRpp3s&e2u+47_~ zGrsKhdR*#i+xwP}eMXKw@4YrqMbBNT53l?2y-x-?E%h|iJsIzgw(_z5Lzn~{l|l%j zjaVSsD;Bla9a9@|n?D$%um-28ZW0+;qu?gV>G+n!$lps#+gRvPu>_Wm*Z2eLui-?b z%efCtwHoZX&b_I1N7>zJ2)R8nYrCq_+C~)9k2R{N_GjOU4WUXo#sNK#kx~pBl^fUR zaiOHyWnbg+upcvYlpY(^>!p9L1SuCMy8Y^*R<>;ZqFm2jj{PjDzS3WJJ@yd1b-dMx zNbZh>XIQdpmE6zh=90&`-Fh@vr3_7(>LP&_iA*auvE5r{L65HMlE)I7a>WUYa!WS_ zv)H?lKvJb*CU)y!Wxw0Tc{|^3*`puL&Y^=THSEWViR-U#nHfW>>O_x43}1G2swxA! zhEqsTjh&O|dN;Gs?+%5x*=94x`d>TedO&AzFp^g~q&k-lzCu=;xVv%R9M!gfa0xv$ zo?Hi6tfLDjfn|if2@#dE%xi39G+UqBGVxiv8fXZlv8Drq+_yzeaTc?-B-rfKGCJRJ zMhsF+YPG!Khg?H3p|bjHF-S#NDXCK*FIItGnPsVl{G1Z7xEbJ|hM?7!XbHB(<)Z`d zB8R<}QX6qOEFU5|Kwr<&R-{i*nD1Xu8?GG;ZJAQmG24StN!Z?LK5SUkXUx8bF&mb) zbE6;&CQalEn?F$oZ(10X?W2ZVFm&bH!MYFZSZ0?auHVj^rj#u{cZHJWYi=^{5pBL5 zW(`49*I$#Y7#T!h1&YLY~y2yniej)3N*y12yjou(BV<;5eUVtA-dV- znjR>ZAN!Hc(-of1gDF{y8O=v~A_jitBN+#M-_L1*mSB3H43bpba!{7zuSE_^R#<(X zcRyo$e1=S_j`lH!!5Y)M=Zhq+rrLgBy7FEQDG z%oE2ujo+R&bgWSIda78z;4knWhR;y;`qZV00rKfdy^*1BguwSOjXho-ObIye>hk6I zb?oN)YM%wCl6D%+>-eGEkO!R?|6x5VQq4h>9dZBqKEAuZlT*LHA?9-Uy56gAswV_n zSBJt1yzp}v9Rln7ZS~lrnbZ3dclUUlUwu)GHaKRSaNo(qK-mHOHiKoSNgvRcPhE1| z+=6fflXqz@4MF_2(7Dg-k8@Dz{VN5}Nh$p`n!`qeKb}`DS>KBjaIIyh)nFR1Sc>#L zMme$-DSK@qa5S5R3QsMrN}|3O+y7G2R-@j;KSWsOWzDnz?WHl_{#XhM0-dO$em7`~ z%52+XGZG90@N^9$Z+}-72ArGJ$QG{<$aFuJ=f^&Nm258m>Ov3RG4!ne3BB5Xp z@%y&r-o`+24=Fua8(-0uYe$T$#Est0+Chr5&CT5LSke1InF`QoSq(TgocEY?UWw52=CsSul>Xv!h-yfTDL0`bG zcL?jMB29PqkP8@4bhozvG~d@B{IcQE&sl$?KtG|qa{wpeDcvSiP&7WKRqHGgh( zCqp&gHRj^j-i{E=*UR@b0p9MlM23edSd_aPIj{}nzlt?)f#`G%e^U0;LIh8QBg#Gk zEoh>xzW~Hnq)3WQ&qQti{aqIq*Y}m}I83Ct0ZxK+(VpzT#6%h56X>cRgt@;o{`6LOfWXsVD4HN&e}?f>xTckZxDlFh0GR-*slQ0Z5La)! z@rbG#BWD=9Va|1w%tRGi<1$`-d_As}`iG*9kwvt7P?6o?S-Re7bCW0?rxBMxBv`vQri14|+@5B0T9KGPYaoz(P1=Jn z8gi7xO9{tXT9*VOs{=m)Ga_0F@!Cgpc@#!NToDxuf*u4h3-SfYq7KO5kZenqQB5)0 zO?-tyOaPGs{3Q4+Q2$~hB0-lMvN+JcDH>k6A$J%dFhnB|*1R=eO!#66ngj}QAz;ah zL6oZel$Gh_HoaNk(k_73S(d0twP1(-`c%AtKvM zFz_ay8+th-p&mI!Hada6LZvZWJ!8wd{tZe{gGWl#@?K{r-S}k8WcIX^@DTvpFxDO; z<5z&q!MUHZY6<7BgD47+F3n=Ohy$aLXlMa0Ce;=ig(-Y%MZVngm>iA1-@B4Cy=~m`5#1AJLf%tU>-1- z52`QVw%u=|bv;RvIKMZw%tbbm&Io!7z++*e!sL+X#O78eEby*??3VoP<7V6@21SG> zOxBVeyx3Pg@&dvZL=Htk*JK>L7e1XY8s1!4N%Sfs1BQQh-1p1jwPyQAWRP>{MP2w{w3LBSb z>(qW#_Juz90(VgV$G|26h=8OZMG5OS5!sH5|ZGs>>B{S=%$s88D{6;g2QS zKllhnOWjx-iSeLB#vtw|@J4&hm1pPTy)Bjk^{WE6CAT%kUe(G`vYF@=r8UJlmgYfh zC>g!JG((PA%yb%8m*JgToz3=0U!e~G()|{5?@1<*(ey;se_LMO%_N^29+5*A$V2AVS;e*Y$^6B==NVokj&mf=r`W1KOeBxX}Aj9n5Yrl{8n#m!)0 z7L!2{n>IzL2atznC`#)tk5>Je30z!fODFd!ZG;XLqPgeii5$plSl}r+$9R{sh^)NM z0_D`83v@1@vFuk_W2lNQgAy;;9FajyHW?dGr%BA2HfE>vcQk>q7w30{ZhRxWa|nF- zHQMNDOs`ETo26xyA2Q zQ7;da(Sk}i-vs;OQ6*z@){iVT=>!cOrEz${^a)@@yXcutG8vy`7?0f{A#AS)$&_Y| zw8F!TrtT<`TO)F=(cB0FERIkeiYh}@#I%PTI)lR~aoxk%h$9SkpXMl;JEERyqqTHi z1{|O^$Q8bXWnxI98Zq17T*5Liba%;IQ5<%7X9Lu$d8aLtGrSbzjGH>PPF)NLsyP%` z*3O{6nZcTP-+(Xl?Gvyg%WgAGiGC^39tw2pdh1v)uWSP7D&H-?NSegy(&*5b5wnS2 zYIRvo2wJkAu~mg7_`Zk@;Z=B>bG(yP(~iG6sev!z!o$vWgs+o^>p7RovOzg-lkRwE znn3`$$7z!St7Vws=OJ&4B9BZQea2{vkC|?4A1k%Z zip)jQ5~-5{mkmWVxj9~mWtLJ-6Gb`M8iJV}U@vrRr03i=YAd~mHBG8UOt>{>oIx-Z zC8#lN9&)czgX6;^%g(T9tDp5$(KMS`Viq}|45D?r&z5mDo&O=}WN&qBu*lP?EG~2H z=u+^kZLVN%Fh2-|UY-{dzJOA$bPvJL>%W5GjfxTUwkdZ*C$mrUZ9rkBMgbFuI zio{L`f8WXBXAlh*h3uaV%vYUFeb^}rp_>TD*&Ha*-!PvhDG%{XuDyQP zgdI=$3tozBH`G6&{7zQ59J{OJTHsb@q?-7r*XcQ#JY{_ z{1hC=K5etBjj@u9&@MT0?0y6LvcRW##!Fvklz2k3SA%O#?dCR_Z+ije*L!n=_hA9d zsXU}!RRNe$NlN^v05F{pG1vhh@T+frvDf;HI87w?~lU9 z@_t?rY=_hwIQ9h|Of*X0Q1DQF4is5g1GfYIEWhI9i;dFBHWsk1lm}BbQ%y{x0}Gy< zEY?YUz3D|JbW#0JeB$`u;S)O}$Nz~>*Ekcgm!tQ!b@Lnk=eub5=>32|W*o$GxJEGC zfAQ~QygiWmX9@c93W*a{W-d(I#s&Ulu=$r9)K_&{?TJqn`RCb@eEl~-{aoK|{Rg0a zIej{GasB=qpmy#kwiPs1Bq&07ELSKFl%vP?^x){i{00JVWgC&k^nPLeLr@q1wA-0L zSiJx7)5o5l4d|Br=kXn+uP>K5=v#CnSY5)V>!KEPmxuf1jDHqt^cLHyt0q{*;Ov$i z*mkr2c5h4}lY&>ro(tw4=O9g!5OMPyhTz@^k{JZ4UZ;Tb|{b7o3ig4VsLCE zln>5+>L*5nSkzqt-mWj#Su0BP*{x5o>%0wB>S5n2WF`R{jlOb!m@KTHs`A6ODM~re zwj*B|&?BLzahne41%F%3zOw!)QFD;3)lY_xrjJ3*!C(2d5f!SshfJxsM43 zczmu4%flTQ0QMr1^<+ZCUB_}Q&T^=)-~FSzG22moh|9iyc29$pblndh9UPbGst+ML zD9XBp5vZUaYCRfYh=I^m4v2F+=Iz17MGtk=-&Uw^V4!O~+8;oey&fF^OS#8bu=%ID zU;Itq65Ldu*t)+d2L~PWWXu#hoIuwNGaD&BhS9jU7g&fMQF>@b++9DI;6Lk=3$Y&Q z8_l*!6Sw6MfI#9|*_c5H42}wAVF=3Ohgy#Xpcm?#maIvV!DQ6k{?i7sWdBb+y1}?9 zHZ}Dm{GYHkoa$y(TpNIRC|gX`34n}L`MW9acPfCOi;hPC5FJr;Yx?}4dT61#&{+`r z^q2LcZ}ze-0AHF9Ds$%@w*~N{Ap`iWb(M0p9*y){;u+3!XYjM1_XE4*UfAz;f!?1O z{dD{MroHK*O$B=h)RU{3S|EuKobH~}?DVzXn&E!O2Z&YJqnV= z$&c|@*$R@AY?B7W%`c0hU=>Y@=8T+kFD+8JiDeU%5&4*-PPK1E@ znD2g-ft_sQ;o%zqoWP<6!tlQ42jOV81)v$gH^1~nS@@Ligh2U}>qS6$lK%v!2&qQ8 z!0Y@-(q_Fg1_ai&2^T>$`!`kvYcb238I;eNLziJKZmeX%cD{QqTcFL~`Q!1wjhzNz zgPXTR@)K9!JpBo|iM|`WIC|VV=*rXceVdwk6|0DyOB*`ngD4nD@`uC79p;Oh^UE5=c@NXo2W0e^SOx#^kJW zG!GAS)U?Y7V#U5l>+|_|T8ev<|B=9i)2r?&WNh=n^!tQZgS)K76Wntxy0d!;zQyL# zT{1G{Orn9!vQL~BPlL$T+1}$d2F+=r*Y1QuScKh?!YJ71a6}b9ts`zn81@t#fG$Y% zQFIiL$GWR|eSSqblr}enY|fJ2xsU7>z8YyAp#r=j^(43$xeRM15j6(fL!CkjFlT~i z&}xL|89U$wMrfe^^DSexTpe9TRst5ehpLrv2XQ}#2)i$m_wX|Lr(!Phpfp056}#62 z8Bfdb=#ZRfj9kH17%fC5&byCJ90q3UocgBU-?IOj=_1yo@L{_b#f`6KN+M2ih*mfm zk*d1|xXN?-w~Kx!W3uvBC*#(W3sXWa6^k&DCn1*!HJQu&2>PLM`%4EHDRAbl>B@|M zK(r-NPYOL(zC6@M3O%-oDRcgYcHmn$j~eM{ekO+C?Yh!LL#wjm`*|9u z($&<|GFL2WX0HhRAfn)0id!?tfQgo2}dKCguUqvXo4Rqps6 za<6*w*RiT7XJ#ck5JDQ@2uGA5bt4p!u|EIp4D{K_-~oPL(C}uk_#&h}=3fg!dW{j` zt)-DUW6}c21=kERA2ohH;itf}3GQRPwYH zald3@*=y@L324Ak#&lD=3C;=gPxsz&<0#06S(L@e2~f3i@(LWDN%t~xa)Y@EC9jG|O`Xc62~-lW7u^6pk*pLch$vIPH;(|P zC+gb$TD>XCgqGIg=&&Jka%=NY1F5mtS->ENNq(PAWfA^TY>1TN6v}yWgkF8^_NHwC zy0~I&kkDO;V^3}Y#{+~Qt+aw zq)ch|X>`)gSp)qTRu-zr_CjL$2hj7-7pN!Hk}OHAWym;3G&Pn4wxeg!*v5y(OyaZ~ zY#v8*=At7S3v7aK!uA8B^+244`E$s5A*Wh%G31JLCa__L(oA7Z7HaZpDM6h{-$dmkWB_eFi22L*7akX<{)Y)=X)wnGoM^O3?{p~{sq2|~LKttJK58>!-= z(@M%z=w#_qfdFKE^r4KeBSp~Z2r0aeZUpMeuyL%CFv!*U%vy0pN=fuu`Myr;lpOLj zgHN=^-Baj5WfJuUU*%j6BI*pm$IWIKNB*dO8sT&gOx!=N^7V@JKfrcMRA7TXHYW?% z7As?f-UGCbfQ{uT7X?7YD~m~pCDNFRg$

jmc6pks)-wr2{B*8^oz_y0acZ({5+j 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�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 diff --git a/docs/superpowers/plans/2026-07-21-centralized-config.md b/docs/superpowers/plans/2026-07-21-centralized-config.md deleted file mode 100644 index 972ae45..0000000 --- a/docs/superpowers/plans/2026-07-21-centralized-config.md +++ /dev/null @@ -1,980 +0,0 @@ -# Centralized config.json Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Move deployment settings (Telegram credentials, data-provider API keys/selection, scanned pairs, scan timeframes, per-pair base blocked hours, alert quality boot default, log level) into a gitignored `config.json` loaded once at startup, and delete the hardcoded credentials from source. - -**Architecture:** A new `app_config.py` module loads and validates `config.json` into an `AppConfig` dataclass (cached singleton), with resolver functions applying the precedence **env var → config.json → code default**. The pair factory calls `apply_pair_overrides()` on every fresh `PlatformConfig` *before* its validated per-timeframe deltas, so the bot, CLI, and backtester all pick up the overlay identically (live == backtest parity by construction). Spec: `docs/superpowers/specs/2026-07-21-centralized-config-design.md`. - -**Tech Stack:** Python 3.12 stdlib only (`json`, `os`, `dataclasses`). No new dependencies. - -## Global Constraints - -- **Zero signal-logic change.** No indicator weight, threshold, gate, or geometry value may change. With no `config.json`, or one holding the example defaults, every produced `PlatformConfig` must be byte-identical (`dataclasses.asdict` equality) to today's factory output — pinned by a test. -- The test suite is `python test_all.py` — a custom harness (`@test("name")` decorator, tests execute at import time, exit code non-zero on failure). It is NOT pytest; there is no single-test selection. "Run the test" always means `python test_all.py` and checking the named line in the output. Baseline before this work: **184 passed, 0 failed**. -- The suite must be hermetic: it must pass identically whether or not the developer's machine has a `config.json`, and regardless of `TELEGRAM_*`/`TWELVE_DATA_API_KEY` env vars. -- Secrets get **no code default**. After Task 4 the only places credentials exist are `config.json` (gitignored) and env vars. -- `config.json.example` (already committed at repo root) is the schema reference. `config.json` is already in `.gitignore` — never commit it. -- Repo root: `/home/harwinder/Development/ForexBot2`. Use `venv/bin/python` if bare `python` lacks pandas/numpy. -- Every commit message ends with: - ``` - Co-Authored-By: Claude Fable 5 - Claude-Session: https://claude.ai/code/session_01VPNF37MP9Kuv62B1VBrZ1b - ``` -- Work on branch `centralized-config` (create from `main` at start of Task 1: `git checkout -b centralized-config`). - ---- - -### Task 1: `app_config.py` — loader, validation, resolvers - -**Files:** -- Create: `app_config.py` -- Modify: `test_all.py` (new Module 13 before the SUMMARY block, ~line 2495; hermetic header after line 19) -- Test: `test_all.py` (same file — this repo keeps all tests in one suite) - -**Interfaces:** -- Consumes: `config.PAIR_INFO`, `config.Timeframe`, `config.XAUUSD`, `config.PlatformConfig` (all existing). -- Produces (later tasks rely on these exact names): - - `class AppConfigError(Exception)` - - `@dataclass class AppConfig` — fields: `telegram_token: str = ""`, `telegram_chat_id: str = ""`, `telegram_channel_id: str = ""`, `alert_min_quality: str = "C"`, `active_provider: str = "twelve_data"`, `provider_settings: Dict[str, Dict[str, Any]] = {}`, `scan_pairs: List[str] = [XAUUSD]`, `scan_timeframes: List[Timeframe] = [M5, M15, H1, H4]`, `pair_overrides: Dict[str, Dict[str, Any]] = {}`, `log_level: str = "INFO"` - - `load_app_config(path: str = CONFIG_PATH) -> AppConfig` - - `get_app_config() -> AppConfig` (cached), `set_app_config(app: Optional[AppConfig]) -> None` (test hook; `None` re-enables lazy load) - - `telegram_token(app=None) -> str`, `telegram_chat_id(app=None) -> str`, `telegram_channel_id(app=None) -> str`, `provider_api_key(app=None) -> str` - - `apply_pair_overrides(cfg: PlatformConfig, app: Optional[AppConfig] = None) -> PlatformConfig` (implemented here, wired in Task 2) - -- [ ] **Step 1: Create branch** - -```bash -cd /home/harwinder/Development/ForexBot2 && git checkout -b centralized-config -``` - -- [ ] **Step 2: Add the hermetic test header and Module 13 failing tests to `test_all.py`** - -In `test_all.py`, directly after `sys.path.insert(0, os.path.dirname(__file__))` (line 19), add: - -```python -# ── Hermetic app-config: the suite must not depend on the developer's -# local config.json or TELEGRAM_*/TWELVE_DATA_API_KEY env vars. The -# dummy TD key mirrors the pre-config.json behavior where a key was -# always present (TDClient built, no network at construction). -import json -import app_config -for _k in ("TELEGRAM_TOKEN", "TELEGRAM_CHAT_ID", "TELEGRAM_CHANNEL_ID", - "TWELVE_DATA_API_KEY"): - os.environ.pop(_k, None) -_TEST_APP = app_config.AppConfig( - provider_settings={"twelve_data": {"api_key": "test-key"}} -) -app_config.set_app_config(_TEST_APP) -``` - -Then insert Module 13 immediately BEFORE the `# SUMMARY` comment block near the end of the file (search for `SUMMARY`): - -```python -# ══════════════════════════════════════════════════════════════════════ -# MODULE 13: app_config.py (config.json overlay) -# ══════════════════════════════════════════════════════════════════════ -print("\n═══ Module 13: app_config.py ═══") - -import tempfile -from app_config import ( - AppConfig, AppConfigError, load_app_config, set_app_config, - telegram_token, telegram_chat_id, telegram_channel_id, - provider_api_key, apply_pair_overrides, -) - - -def _write_json(payload) -> str: - fh = tempfile.NamedTemporaryFile( - "w", suffix=".json", delete=False, encoding="utf-8") - if isinstance(payload, str): - fh.write(payload) - else: - json.dump(payload, fh) - fh.close() - return fh.name - - -_FULL_CFG = { - "telegram": {"token": "t0k", "chat_id": "111", "channel_id": "-100222", - "alert_min_quality": "B"}, - "data_providers": {"active": "twelve_data", - "twelve_data": {"api_key": "json-key"}}, - "scanning": {"pairs": ["XAU/USD"], "timeframes": ["M15", "H1"]}, - "pairs": {"XAU/USD": {"blocked_hours_utc": [3, 4]}}, - "log_level": "WARNING", -} - - -@test("app_config: valid config.json maps every field") -def _(): - app = load_app_config(_write_json(_FULL_CFG)) - assert app.telegram_token == "t0k" - assert app.telegram_chat_id == "111" - assert app.telegram_channel_id == "-100222" - assert app.alert_min_quality == "B" - assert app.active_provider == "twelve_data" - assert app.provider_settings["twelve_data"]["api_key"] == "json-key" - assert app.scan_pairs == [XAUUSD] - assert app.scan_timeframes == [Timeframe.M15, Timeframe.H1] - assert app.pair_overrides[XAUUSD]["blocked_hours_utc"] == [3, 4] - assert app.log_level == "WARNING" - - -@test("app_config: missing file returns pure defaults") -def _(): - app = load_app_config("/nonexistent/config.json") - assert app == AppConfig(), "absent config.json must yield pure defaults" - - -@test("app_config: malformed JSON raises AppConfigError") -def _(): - path = _write_json("{not json") - try: - load_app_config(path) - assert False, "should have raised" - except AppConfigError as e: - assert "not valid JSON" in str(e) - - -@test("app_config: unknown keys raise AppConfigError") -def _(): - for payload in ( - {"telgram": {}}, # top-level typo - {"telegram": {"tokn": "x"}}, # section typo - {"pairs": {"XAU/USD": {"blocked_hours": [1]}}}, # pair-block typo - {"scanning": {"pair": ["XAU/USD"]}}, # scanning typo - ): - try: - load_app_config(_write_json(payload)) - assert False, f"should have raised for {payload}" - except AppConfigError as e: - assert "unknown key" in str(e).lower() - - -@test("app_config: invalid values raise AppConfigError") -def _(): - bad_payloads = [ - {"pairs": {"XAU/USD": {"blocked_hours_utc": [24]}}}, # hour range - {"pairs": {"XAU/USD": {"blocked_hours_utc": "3"}}}, # not a list - {"pairs": {"EUR/USD": {"blocked_hours_utc": [3]}}}, # unknown pair - {"scanning": {"pairs": ["EUR/USD"]}}, # unknown pair - {"scanning": {"timeframes": ["M7"]}}, # bad TF name - {"scanning": {"timeframes": ["W1"]}}, # unscannable TF - {"data_providers": {"active": "polygon", - "twelve_data": {"api_key": "k"}}}, # no block - {"telegram": {"alert_min_quality": "Z"}}, # bad quality - {"log_level": "CHATTY"}, # bad level - ] - for payload in bad_payloads: - try: - load_app_config(_write_json(payload)) - assert False, f"should have raised for {payload}" - except AppConfigError: - pass - - -@test("app_config: env precedence env → config.json → default") -def _(): - app = load_app_config(_write_json(_FULL_CFG)) - with patch.dict(os.environ, {}, clear=True): - assert telegram_token(app) == "t0k" - assert telegram_chat_id(app) == "111" - assert telegram_channel_id(app) == "-100222" - assert provider_api_key(app) == "json-key" - with patch.dict(os.environ, {"TELEGRAM_TOKEN": "env-tok", - "TELEGRAM_CHAT_ID": "999", - "TWELVE_DATA_API_KEY": "env-key"}): - assert telegram_token(app) == "env-tok" - assert telegram_chat_id(app) == "999" - assert provider_api_key(app) == "env-key" - # channel: env set-but-empty means "disable feed" and must beat JSON - with patch.dict(os.environ, {"TELEGRAM_CHANNEL_ID": ""}): - assert telegram_channel_id(app) == "" -``` - -- [ ] **Step 3: Run to verify the new tests fail (import error)** - -```bash -python test_all.py 2>&1 | head -5 -``` - -Expected: `ModuleNotFoundError: No module named 'app_config'` (the hermetic header imports it before any test runs). - -- [ ] **Step 4: Write `app_config.py`** - -Create `app_config.py` with exactly this content: - -```python -""" -app_config.py — deployment-settings overlay (config.json) -========================================================= - -Loads the gitignored config.json at the repo root ONCE per process. -Deployment surface ONLY: Telegram credentials, data-provider selection -and API keys, scanned pairs/timeframes, per-pair base blocked hours, -alert-quality boot default, log level. Signal logic, weights, -thresholds and gates stay in config.py / pair_signals. - -Precedence for every setting: env var → config.json → code default. -Secrets have NO code default — with neither env nor config.json the -bot refuses to start (telegram_bot.main) and data fetches fail with a -named error (data_provider). - -Parity contract (test-enforced): with no config.json, or one holding -the config.json.example defaults, every produced PlatformConfig is -byte-identical to the pure-code defaults. apply_pair_overrides() runs -in the pair factory BEFORE the validated per-timeframe deltas, so the -bot, CLI and backtester all see the same overlay (live == backtest). - -Spec: docs/superpowers/specs/2026-07-21-centralized-config-design.md -""" - -import json -import logging -import os -from dataclasses import dataclass, field -from typing import Any, Dict, List, Optional - -from config import PAIR_INFO, PlatformConfig, Timeframe, XAUUSD - -logger = logging.getLogger(__name__) - -CONFIG_PATH = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "config.json") - -_VALID_QUALITIES = ("A+", "A", "B", "C") -_VALID_LOG_LEVELS = ("DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL") -# Timeframes the bot's candle-boundary scheduler can run (W1 has no loop). -_SCANNABLE_TFS = ("M5", "M15", "M30", "H1", "H4", "D1") - -_KNOWN_TOP = {"telegram", "data_providers", "scanning", "pairs", "log_level"} -_KNOWN_TELEGRAM = {"token", "chat_id", "channel_id", "alert_min_quality"} -_KNOWN_SCANNING = {"pairs", "timeframes"} -_KNOWN_PAIR_KEYS = {"blocked_hours_utc"} - - -class AppConfigError(Exception): - """config.json is present but invalid — fail fast at boot.""" - - -@dataclass -class AppConfig: - telegram_token: str = "" - telegram_chat_id: str = "" - telegram_channel_id: str = "" # "" = channel feed disabled - alert_min_quality: str = "C" - active_provider: str = "twelve_data" - provider_settings: Dict[str, Dict[str, Any]] = field(default_factory=dict) - scan_pairs: List[str] = field(default_factory=lambda: [XAUUSD]) - scan_timeframes: List[Timeframe] = field(default_factory=lambda: [ - Timeframe.M5, Timeframe.M15, Timeframe.H1, Timeframe.H4]) - pair_overrides: Dict[str, Dict[str, Any]] = field(default_factory=dict) - log_level: str = "INFO" - - -def _check_keys(section: Dict[str, Any], known: set, where: str) -> None: - unknown = sorted(set(section) - known) - if unknown: - raise AppConfigError( - f"config.json: unknown key(s) {unknown} in {where}; " - f"known keys: {sorted(known)}") - - -def load_app_config(path: str = CONFIG_PATH) -> AppConfig: - """Parse + validate config.json. Missing file → pure defaults.""" - app = AppConfig() - if not os.path.exists(path): - logger.warning( - "config.json not found at %s — running on code defaults " - "(secrets must come from environment variables)", path) - return app - try: - with open(path, encoding="utf-8") as fh: - raw = json.load(fh) - except json.JSONDecodeError as e: - raise AppConfigError(f"config.json is not valid JSON: {e}") from e - if not isinstance(raw, dict): - raise AppConfigError("config.json top level must be a JSON object") - _check_keys(raw, _KNOWN_TOP, "top level") - - tg = raw.get("telegram", {}) - _check_keys(tg, _KNOWN_TELEGRAM, '"telegram"') - app.telegram_token = str(tg.get("token", app.telegram_token)) - app.telegram_chat_id = str(tg.get("chat_id", app.telegram_chat_id)) - app.telegram_channel_id = str( - tg.get("channel_id", app.telegram_channel_id)) - quality = tg.get("alert_min_quality", app.alert_min_quality) - if quality not in _VALID_QUALITIES: - raise AppConfigError( - f'config.json: telegram.alert_min_quality "{quality}" ' - f"not in {_VALID_QUALITIES}") - app.alert_min_quality = quality - - dp = raw.get("data_providers") - if dp is not None: - if not isinstance(dp, dict): - raise AppConfigError('config.json: "data_providers" must be an object') - app.active_provider = str(dp.get("active", app.active_provider)) - app.provider_settings = {} - for name, block in dp.items(): - if name == "active": - continue - if not isinstance(block, dict): - raise AppConfigError( - f'config.json: data_providers.{name} must be an object') - app.provider_settings[name] = dict(block) - if app.active_provider not in app.provider_settings: - raise AppConfigError( - f'config.json: data_providers.active "{app.active_provider}" ' - "has no matching provider block") - - scanning = raw.get("scanning", {}) - _check_keys(scanning, _KNOWN_SCANNING, '"scanning"') - if "pairs" in scanning: - pairs = scanning["pairs"] - bad = [p for p in pairs if p not in PAIR_INFO] - if bad: - raise AppConfigError( - f"config.json: unknown pair(s) {bad} in scanning.pairs; " - f"known: {sorted(PAIR_INFO)}") - app.scan_pairs = list(pairs) - if "timeframes" in scanning: - names = scanning["timeframes"] - bad = [n for n in names if n not in _SCANNABLE_TFS] - if bad: - raise AppConfigError( - f"config.json: unsupported timeframe(s) {bad} in " - f"scanning.timeframes; supported: {list(_SCANNABLE_TFS)}") - app.scan_timeframes = [Timeframe[n] for n in names] - - pair_section = raw.get("pairs", {}) - for symbol, overrides in pair_section.items(): - if symbol not in PAIR_INFO: - raise AppConfigError( - f'config.json: unknown pair "{symbol}" in pairs; ' - f"known: {sorted(PAIR_INFO)}") - _check_keys(overrides, _KNOWN_PAIR_KEYS, f'pairs."{symbol}"') - if "blocked_hours_utc" in overrides: - hours = overrides["blocked_hours_utc"] - valid = isinstance(hours, list) and all( - isinstance(h, int) and not isinstance(h, bool) - and 0 <= h <= 23 for h in hours) - if not valid: - raise AppConfigError( - f'config.json: pairs."{symbol}".blocked_hours_utc must ' - "be a list of integers in 0-23") - app.pair_overrides = {s: dict(o) for s, o in pair_section.items()} - - level = raw.get("log_level", app.log_level) - if level not in _VALID_LOG_LEVELS: - raise AppConfigError( - f'config.json: log_level "{level}" not in {_VALID_LOG_LEVELS}') - app.log_level = level - return app - - -# ── Process-wide singleton ──────────────────────────────────────────── - -_cached: Optional[AppConfig] = None - - -def get_app_config() -> AppConfig: - global _cached - if _cached is None: - _cached = load_app_config() - return _cached - - -def set_app_config(app: Optional[AppConfig]) -> None: - """Override the process-wide AppConfig (tests/experiments). - Pass None to re-enable lazy loading from CONFIG_PATH.""" - global _cached - _cached = app - - -# ── Resolution helpers: env var → config.json → default ─────────────── - -def telegram_token(app: Optional[AppConfig] = None) -> str: - app = app or get_app_config() - return os.environ.get("TELEGRAM_TOKEN") or app.telegram_token - - -def telegram_chat_id(app: Optional[AppConfig] = None) -> str: - app = app or get_app_config() - return os.environ.get("TELEGRAM_CHAT_ID") or app.telegram_chat_id - - -def telegram_channel_id(app: Optional[AppConfig] = None) -> str: - """Env set-but-empty ("") means "disable the feed" and beats JSON, - so this checks None-ness, not truthiness.""" - app = app or get_app_config() - env = os.environ.get("TELEGRAM_CHANNEL_ID") - return env if env is not None else app.telegram_channel_id - - -def provider_api_key(app: Optional[AppConfig] = None) -> str: - """API key for the ACTIVE provider. The env override is per-provider - (TWELVE_DATA_API_KEY applies only when twelve_data is active).""" - app = app or get_app_config() - if app.active_provider == "twelve_data": - env = os.environ.get("TWELVE_DATA_API_KEY") - if env: - return env - block = app.provider_settings.get(app.active_provider, {}) - return str(block.get("api_key", "")) - - -# ── PlatformConfig overlay ──────────────────────────────────────────── - -def apply_pair_overrides( - cfg: PlatformConfig, app: Optional[AppConfig] = None -) -> PlatformConfig: - """Stamp deployment settings from config.json onto a PlatformConfig. - - Called by the pair factories BEFORE their validated per-timeframe - deltas, so e.g. the M5 hour-9 append lands on top of the JSON base. - The pair's base blocked_hours_utc is set on BOTH mirrored copies - (xau_strategy + backtest) so they cannot drift. - """ - app = app or get_app_config() - overrides = app.pair_overrides.get(cfg.symbol, {}) - if "blocked_hours_utc" in overrides: - hours = list(overrides["blocked_hours_utc"]) - cfg.xau_strategy.blocked_hours_utc = hours - cfg.backtest.blocked_hours_utc = list(hours) - cfg.scan_pairs = list(app.scan_pairs) - cfg.scan_timeframes = list(app.scan_timeframes) - return cfg -``` - -- [ ] **Step 5: Run tests, verify Module 13 passes and total is 190** - -```bash -python test_all.py 2>&1 | tail -25 -``` - -Expected: `RESULTS: 190 passed, 0 failed, 190 total` (184 baseline + 6 new). All six `app_config:` lines show `✓`. - -- [ ] **Step 6: Commit** - -```bash -git add app_config.py test_all.py -git commit -m "Add app_config.py: config.json loader, validation, env-precedence resolvers" -``` - ---- - -### Task 2: Factory overlay wiring + parity pins - -**Files:** -- Modify: `pair_signals/xauusd.py:81-90` (make_config), `test_all.py` (Module 9 equivalence test ~line 1851; Module 13 additions) - -**Interfaces:** -- Consumes: `app_config.apply_pair_overrides`, `app_config.set_app_config`, `app_config.AppConfig`, `app_config.load_app_config` (Task 1). -- Produces: `make_config` now applies the overlay — every consumer (bot, CLI, backtester) inherits it with no further change. Test symbol `_TEST_APP` (Task 1) is the restore target for any test that swaps the singleton. - -- [ ] **Step 1: Add failing tests (Module 13 additions)** - -Append to Module 13 in `test_all.py`: - -```python -@test("app_config: apply_pair_overrides stamps both blocked-hours mirrors") -def _(): - app = AppConfig(pair_overrides={XAUUSD: {"blocked_hours_utc": [3, 4]}}, - scan_pairs=[XAUUSD], - scan_timeframes=[Timeframe.M15]) - cfg = apply_pair_overrides(PlatformConfig(), app) - assert cfg.xau_strategy.blocked_hours_utc == [3, 4] - assert cfg.backtest.blocked_hours_utc == [3, 4] - assert cfg.scan_timeframes == [Timeframe.M15] - # the two mirrors must be independent lists, not aliases - cfg.xau_strategy.blocked_hours_utc.append(5) - assert cfg.backtest.blocked_hours_utc == [3, 4] - - -@test("app_config: M5 factory appends hour 9 on top of a JSON base") -def _(): - from pair_signals import PAIR_PRODUCERS - app = AppConfig(pair_overrides={XAUUSD: {"blocked_hours_utc": [3, 4]}}, - provider_settings={"twelve_data": {"api_key": "test-key"}}) - set_app_config(app) - try: - cfg = PAIR_PRODUCERS[XAUUSD](Timeframe.M5, None) - finally: - set_app_config(_TEST_APP) - assert cfg.xau_strategy.blocked_hours_utc == [3, 4, 9], \ - "validated M5 hour-9 delta must land on top of the JSON base" - assert cfg.backtest.blocked_hours_utc == [3, 4], \ - "mirror carries the base only (per-TF delta is XAU-strategy-side)" - - -@test("app_config: config.json.example is valid and behavior-neutral") -def _(): - import dataclasses - from pair_signals import PAIR_PRODUCERS - example = load_app_config( - os.path.join(os.path.dirname(__file__), "config.json.example")) - for tf in (Timeframe.M5, Timeframe.M15, Timeframe.H1, Timeframe.H4): - baseline = PAIR_PRODUCERS[XAUUSD](tf, None) # under _TEST_APP - set_app_config(example) - try: - with_example = PAIR_PRODUCERS[XAUUSD](tf, None) - finally: - set_app_config(_TEST_APP) - assert dataclasses.asdict(baseline) == dataclasses.asdict(with_example), \ - f"example config.json must be byte-identical to defaults on {tf}" -``` - -- [ ] **Step 2: Run to verify the new tests fail** - -```bash -python test_all.py 2>&1 | grep "app_config: M5 factory" -``` - -Expected: `✗ app_config: M5 factory appends hour 9 on top of a JSON base` (the factory doesn't apply the overlay yet, so blocked hours are the defaults `[0,1,2,10,11,13,16,21,9]`, not `[3,4,9]`). - -- [ ] **Step 3: Wire the overlay into the factory** - -In `pair_signals/xauusd.py`, change the import line and the top of `make_config`: - -```python -from typing import Optional, List -from config import PlatformConfig, Timeframe -from app_config import apply_pair_overrides -``` - -and in `make_config`, immediately after `config = PlatformConfig()`: - -```python - config = PlatformConfig() - # Deployment overlay (config.json) BEFORE the validated per-TF - # deltas below, so e.g. the M5 hour-9 append lands on the JSON base. - apply_pair_overrides(config) - config.primary_timeframe = primary_tf -``` - -- [ ] **Step 4: Update the Module 9 equivalence test** - -In `test_all.py` (~line 1851, `"xauusd.make_config equals inline PlatformConfig construction"`), the inline construction must apply the same overlay in the same order. After the `inline_cfg = PlatformConfig(...)` construction and BEFORE the per-TF override lines, add: - -```python - app_config.apply_pair_overrides(inline_cfg) -``` - -(`app_config` is already imported at the top of `test_all.py` from Task 1. Under `_TEST_APP` this is a no-op on blocked hours, but it keeps the equivalence definition exact: factory ≡ inline + overlay + per-TF deltas, whatever the active AppConfig.) - -- [ ] **Step 5: Run tests, verify 193 passing** - -```bash -python test_all.py 2>&1 | tail -25 -``` - -Expected: `RESULTS: 193 passed, 0 failed, 193 total`. Watch specifically for `✓ xauusd.make_config equals inline PlatformConfig construction` (Module 9) and the three new Module 13 lines. - -- [ ] **Step 6: Commit** - -```bash -git add pair_signals/xauusd.py test_all.py -git commit -m "Wire config.json overlay into the pair factory (before per-TF deltas)" -``` - ---- - -### Task 3: Data provider — key from app_config, registry, delete hardcoded key - -**Files:** -- Modify: `config.py:346` (delete field), `data_provider.py:72-76` (key resolution), `data_provider.py:265-269` (error message), `data_provider.py` end (registry), `signal_aggregator.py:107`, `backtest/gpu_backtest.py:1682`, `test_all.py` (Module 13 additions) - -**Interfaces:** -- Consumes: `app_config.provider_api_key`, `app_config.get_app_config`, `app_config.AppConfigError` (Task 1). -- Produces: `data_provider.PROVIDER_REGISTRY: Dict[str, type]` and `data_provider.make_data_provider(config: PlatformConfig) -> ForexDataProvider` — Task 4 uses `make_data_provider` in `telegram_bot.py`. - -- [ ] **Step 1: Add failing tests (Module 13 additions)** - -```python -@test("data_provider: api key resolves env → config.json (no code default)") -def _(): - from data_provider import ForexDataProvider - app = AppConfig(provider_settings={"twelve_data": {"api_key": "json-key"}}) - set_app_config(app) - try: - with patch.dict(os.environ, {}, clear=True): - dp = ForexDataProvider(PlatformConfig()) - assert dp._api_key == "json-key" - with patch.dict(os.environ, {"TWELVE_DATA_API_KEY": "env-key"}): - dp = ForexDataProvider(PlatformConfig()) - assert dp._api_key == "env-key" - set_app_config(AppConfig()) # no key anywhere - with patch.dict(os.environ, {}, clear=True): - dp = ForexDataProvider(PlatformConfig()) - assert dp._api_key is None and dp._td is None - finally: - set_app_config(_TEST_APP) - - -@test("data_provider: make_data_provider dispatches on active provider") -def _(): - from data_provider import ForexDataProvider, make_data_provider - assert isinstance(make_data_provider(PlatformConfig()), ForexDataProvider) - set_app_config(AppConfig(active_provider="polygon", - provider_settings={"polygon": {"api_key": "k"}})) - try: - make_data_provider(PlatformConfig()) - assert False, "unregistered provider must raise" - except AppConfigError as e: - assert "polygon" in str(e) - finally: - set_app_config(_TEST_APP) - - -@test("config.py: hardcoded twelve_data_api_key field is gone") -def _(): - assert not hasattr(PlatformConfig(), "twelve_data_api_key"), \ - "credentials must not live in committed source" -``` - -- [ ] **Step 2: Run to verify they fail** - -```bash -python test_all.py 2>&1 | grep -A1 "hardcoded twelve_data" -``` - -Expected: `✗ config.py: hardcoded twelve_data_api_key field is gone` (plus the make_data_provider import failure). - -- [ ] **Step 3: Implement** - -`config.py`: delete line 346 (`twelve_data_api_key: str = ""`). - -`data_provider.py` — add to the local imports: - -```python -from app_config import AppConfigError, get_app_config, provider_api_key -``` - -In `ForexDataProvider.__init__` replace the key resolution: - -```python - self.config = config - self._api_key = provider_api_key() or None -``` - -In `_fetch_twelve_data`, update the no-key error: - -```python - if self._td is None: - raise DataIntegrityError( - "No data-provider API key. Set the TWELVE_DATA_API_KEY env " - "var or data_providers.twelve_data.api_key in config.json." - ) -``` - -At the bottom of `data_provider.py` (after the class): - -```python -# ── Provider registry ───────────────────────────────────────────────── -# config.json data_providers.active selects from here. Adding a provider -# later = one adapter class + one entry + one config block. -PROVIDER_REGISTRY: Dict[str, type] = {"twelve_data": ForexDataProvider} - - -def make_data_provider(config: PlatformConfig) -> ForexDataProvider: - """Build the ACTIVE data provider (config.json: data_providers.active).""" - name = get_app_config().active_provider - cls = PROVIDER_REGISTRY.get(name) - if cls is None: - raise AppConfigError( - f'Unknown data provider "{name}"; ' - f"registered: {sorted(PROVIDER_REGISTRY)}") - return cls(config) -``` - -`signal_aggregator.py` line 18 + 107 — import and use the registry: - -```python -from data_provider import ForexDataProvider, make_data_provider -``` -```python - self.data_provider = make_data_provider(config) -``` - -`backtest/gpu_backtest.py` line 1682 (and its import of `ForexDataProvider`): - -```python - provider = make_data_provider(platform_cfg) -``` - -- [ ] **Step 4: Run tests, verify 196 passing** - -```bash -python test_all.py 2>&1 | tail -25 -``` - -Expected: `RESULTS: 196 passed, 0 failed, 196 total`. If any Module 2 test fails on a missing key, it means it constructed `ForexDataProvider` outside `_TEST_APP` scope — fix the test to run under `_TEST_APP` (which supplies the dummy key), never by re-adding a code default. - -- [ ] **Step 5: Commit** - -```bash -git add config.py data_provider.py signal_aggregator.py backtest/gpu_backtest.py test_all.py -git commit -m "Data provider: key from config.json/env, provider registry, drop hardcoded key" -``` - ---- - -### Task 4: telegram_bot wiring + startup guard - -**Files:** -- Modify: `telegram_bot.py` (credentials block ~93-105, logging ~88, SCAN_PAIRS ~113, alert quality ~478, WS key ~611-614, `_AUTOSCAN_LOOPS` ~797-802, scheduler log ~817, `_get_shared_dp` ~195, `main()` ~1261), `test_all.py` (Module 13 addition) - -**Interfaces:** -- Consumes: `app_config.get_app_config`, resolvers, `data_provider.make_data_provider` (Tasks 1+3). -- Produces: nothing consumed later; this is the final wiring task. - -- [ ] **Step 1: Add failing test (Module 13 addition)** - -```python -@test("telegram_bot: credentials, quality, pairs, loops from app_config") -def _(): - import importlib - import telegram_bot - app = AppConfig(telegram_token="json-tok", telegram_chat_id="42", - telegram_channel_id="", alert_min_quality="B", - scan_timeframes=[Timeframe.M15, Timeframe.H1], - provider_settings={"twelve_data": {"api_key": "k"}}) - set_app_config(app) - try: - with patch.dict(os.environ, {}, clear=True): - tb = importlib.reload(telegram_bot) - assert tb.TOKEN == "json-tok" - assert tb.OWNER_ID == 42 - assert tb.CHANNEL_ID is None, '"" channel id must disable the feed' - assert tb._alert_min_quality == "B" - assert [tf for tf, _ in tb._AUTOSCAN_LOOPS] == \ - [Timeframe.M15, Timeframe.H1] - assert tb._AUTOSCAN_LOOPS == [(Timeframe.M15, 15), - (Timeframe.H1, 60)] - finally: - set_app_config(_TEST_APP) - importlib.reload(telegram_bot) - - -@test("telegram_bot: main() refuses to start without credentials") -def _(): - import telegram_bot - if telegram_bot.TOKEN: # only meaningful in the hermetic no-cred env - return - try: - telegram_bot.main() - assert False, "main() must refuse to start without token/chat_id" - except SystemExit as e: - assert "credentials" in str(e) -``` - -- [ ] **Step 2: Run to verify failure** - -```bash -python test_all.py 2>&1 | grep "telegram_bot: credentials" -``` - -Expected: `✗ telegram_bot: credentials, quality, pairs, loops from app_config` (TOKEN still comes from the hardcoded fallback, not "json-tok"). - -- [ ] **Step 3: Implement the wiring** - -`telegram_bot.py` — add to the local imports (after the `config` import block): - -```python -from app_config import ( - get_app_config, telegram_token, telegram_chat_id, telegram_channel_id, -) -from data_provider import ForexDataProvider, make_data_provider -``` - -Immediately after the imports (before the logging block), add: - -```python -_APP = get_app_config() -``` - -Change the `logging.basicConfig` line (~88) to honor the configured level: - -```python -logging.basicConfig(level=getattr(logging, _APP.log_level, logging.INFO), - handlers=[_console_handler, _file_handler]) -``` - -Replace the credentials block (lines ~93-105) — keep the existing comments about the owner lock and subscriber channel, change only the assignments: - -```python -TOKEN = telegram_token() -CHAT_ID = telegram_chat_id() - -# ... (owner-lock comment unchanged) -OWNER_ID: Optional[int] = int(CHAT_ID) if CHAT_ID else None - -# ... (subscriber-channel comment unchanged) -_CHANNEL_ID_RAW = telegram_channel_id() -CHANNEL_ID: Optional[int] = int(_CHANNEL_ID_RAW) if _CHANNEL_ID_RAW else None -``` - -`SCAN_PAIRS` (~113): - -```python -SCAN_PAIRS = list(_APP.scan_pairs) -``` - -`_get_shared_dp` (~195): - -```python - _shared_dp = make_data_provider(PlatformConfig()) -``` - -Alert quality boot default (~478): - -```python -_alert_min_quality = _APP.alert_min_quality -``` - -WS key (~611-614) — `provider_api_key` needs adding to the `app_config` import list: - -```python -_cfg = PlatformConfig() -_WS_API_KEY = provider_api_key() -_WS_URL = f"wss://ws.twelvedata.com/v1/quotes/price?apikey={_WS_API_KEY}" -_WS_COOLDOWN = _cfg.ws_cooldown_seconds -``` - -`_AUTOSCAN_LOOPS` (~797-802) — derive from configured timeframes: - -```python -_TF_INTERVAL_MINUTES = { - Timeframe.M5: 5, Timeframe.M15: 15, Timeframe.M30: 30, - Timeframe.H1: 60, Timeframe.H4: 240, Timeframe.D1: 1440, -} -_AUTOSCAN_LOOPS = [ - (tf, _TF_INTERVAL_MINUTES[tf]) for tf in _APP.scan_timeframes -] -``` - -Scheduler log line (~817): - -```python - logger.info("Candle-boundary scheduler started (%s)", - "/".join(tf.name for tf, _ in _AUTOSCAN_LOOPS)) -``` - -(The manual `/scan` buttons — `_TF_BUTTON_LABELS` — deliberately stay hardcoded M5/M15/H1/H4: they are the owner's on-demand UI, not the automated feed. Documented decision, not an omission.) - -`main()` (~1261) — first lines of the function body: - -```python -def main() -> None: - if not TOKEN or not CHAT_ID: - raise SystemExit( - "telegram_bot: missing Telegram credentials. Set telegram.token " - "and telegram.chat_id in config.json, or the TELEGRAM_TOKEN and " - "TELEGRAM_CHAT_ID environment variables.") -``` - -- [ ] **Step 4: Run tests, verify 198 passing** - -```bash -python test_all.py 2>&1 | tail -25 -``` - -Expected: `RESULTS: 198 passed, 0 failed, 198 total`. If Module 7 tests break on `OWNER_ID` being `None`, they were relying on the hardcoded chat id — fix by having those tests set `telegram_bot.OWNER_ID`/`CHAT_ID` explicitly in their setup, never by re-adding fallbacks. - -- [ ] **Step 5: Commit** - -```bash -git add telegram_bot.py test_all.py -git commit -m "telegram_bot: credentials/quality/scan-loops from config.json, startup guard" -``` - ---- - -### Task 5: Migration, docs, final verification - -**Files:** -- Create: `config.json` (LOCAL ONLY — gitignored, never committed) -- Modify: `CLAUDE.md` (repo map, env-var table, config section, test count) - -**Interfaces:** -- Consumes: everything above. -- Produces: the deployed machine's real `config.json`; updated authoritative docs. - -- [ ] **Step 1: Create the local config.json with the current live values** - -These are the exact values being deleted from source (from pre-change `telegram_bot.py:93-105` and `config.py:346`), so the running bot behaves identically: - -```bash -cat > /home/harwinder/Development/ForexBot2/config.json <<'EOF' -{ - "telegram": { - "token": "", - "chat_id": "", - "channel_id": "", - "alert_min_quality": "C" - }, - "data_providers": { - "active": "twelve_data", - "twelve_data": { "api_key": "" } - }, - "scanning": { - "pairs": ["XAU/USD"], - "timeframes": ["M5", "M15", "H1", "H4"] - }, - "pairs": { - "XAU/USD": { "blocked_hours_utc": [0, 1, 2, 10, 11, 13, 16, 21] } - }, - "log_level": "INFO" -} -EOF -git status --short # config.json must NOT appear (gitignored) -``` - -(Real values were scrubbed from this doc 2026-07-21 — take them from the previously deployed telegram_bot.py/config.py in git history, and rotate both credentials after merge.) - -- [ ] **Step 2: Boot smoke test (no network needed)** - -```bash -python - <<'EOF' -from app_config import get_app_config, telegram_token, provider_api_key, apply_pair_overrides -from pair_signals import PAIR_PRODUCERS -from config import Timeframe, XAUUSD -app = get_app_config() -assert telegram_token(app), "token missing" -assert provider_api_key(app), "api key missing" -cfg = PAIR_PRODUCERS[XAUUSD](Timeframe.M5, None) -assert cfg.xau_strategy.blocked_hours_utc == [0, 1, 2, 10, 11, 13, 16, 21, 9] -print("boot smoke OK — live config.json loads and factory output unchanged") -EOF -``` - -Expected: `boot smoke OK — live config.json loads and factory output unchanged`. - -- [ ] **Step 3: Update CLAUDE.md** - -- Repository-map table: add rows for `app_config.py` ("config.json loader/validation, env-precedence resolvers, `apply_pair_overrides` deployment overlay") and `config.json.example` ("committed schema template; real gitignored config.json holds secrets + deployment settings"). -- Environment-variables table: note precedence "env var → config.json → none"; state that hardcoded fallbacks were REMOVED 2026-07-21 and the bot refuses to boot without credentials. -- `PlatformConfig` section: delete the `twelve_data_api_key` mention ("hardcoded fallback"); add one line: "Deployment settings (credentials, scan pairs/TFs, per-pair base blocked hours, alert quality, log level) overlay from config.json via `app_config.apply_pair_overrides`, applied in the pair factory BEFORE per-TF deltas." -- `pair_signals` section: mention the overlay call order in `make_config`. -- Test-suite line: update "184 tests in 12 modules" → "198 tests in 13 modules" (verify against the actual final count from Step 4 before writing). - -- [ ] **Step 4: Full-suite final verification** - -```bash -python test_all.py 2>&1 | tail -15 -``` - -Expected: `RESULTS: 198 passed, 0 failed, 198 total` (use the real number if it differs, and make CLAUDE.md match). - -- [ ] **Step 5: Commit docs** - -```bash -git add CLAUDE.md -git commit -m "Docs: config.json deployment overlay (CLAUDE.md repo map, env table, test count)" -``` - -- [ ] **Step 6: Merge/PR decision** - -Implementation complete → follow superpowers:finishing-a-development-branch (options: merge `centralized-config` to main, or push the branch to `origin`/`gitea` for review). After merge, remind the user: **rotate the Telegram token and Twelve Data key** — the old values remain in git history on both remotes. diff --git a/oanda_provider.py b/oanda_provider.py deleted file mode 100644 index d840019..0000000 --- a/oanda_provider.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -ForexBot2 — Oanda provider (back-compat shim) -============================================== -The implementation lives in `providers/oanda.py`; shared behavior is in -`providers/base.py`. This module keeps the historical import path working. -""" - -from providers.base import _is_forex_weekend # noqa: F401 -from providers.oanda import OandaDataError, OandaDataProvider # noqa: F401 diff --git a/test_all.py b/test_all.py index 72d8ac2..37deef3 100644 --- a/test_all.py +++ b/test_all.py @@ -214,29 +214,29 @@ def _(): # ══════════════════════════════════════════════════════════════════════ -# MODULE 2: data_provider.py +# MODULE 2: providers/twelve_data.py # ══════════════════════════════════════════════════════════════════════ -print("\n═══ Module 2: data_provider.py ═══") +print("\n═══ Module 2: providers/twelve_data.py ═══") -from data_provider import ForexDataProvider, DataIntegrityError +from providers import TwelveDataProvider, DataIntegrityError -@test("ForexDataProvider._to_td_symbol conversion") +@test("TwelveDataProvider._to_td_symbol conversion") def _(): - assert ForexDataProvider._to_td_symbol("XAU/USD") == "XAU/USD" + assert TwelveDataProvider._to_td_symbol("XAU/USD") == "XAU/USD" -@test("ForexDataProvider TD_INTERVALS complete mapping") +@test("TwelveDataProvider TD_INTERVALS complete mapping") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) for tf in Timeframe: assert tf in dp.TD_INTERVALS, f"Missing TD_INTERVALS mapping for {tf}" -@test("ForexDataProvider BARS_PER_DAY mapping") +@test("TwelveDataProvider BARS_PER_DAY mapping") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) for tf in Timeframe: assert tf in dp.BARS_PER_DAY, f"Missing BARS_PER_DAY for {tf}" assert dp.BARS_PER_DAY[Timeframe.H1] == 24 @@ -244,9 +244,9 @@ def _(): assert dp.BARS_PER_DAY[Timeframe.D1] == 1 -@test("ForexDataProvider CANDLE_SECONDS mapping") +@test("TwelveDataProvider CANDLE_SECONDS mapping") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) for tf in Timeframe: assert tf in dp.CANDLE_SECONDS, f"Missing CANDLE_SECONDS for {tf}" assert dp.CANDLE_SECONDS[Timeframe.M1] == 60 @@ -254,9 +254,9 @@ def _(): assert dp.CANDLE_SECONDS[Timeframe.D1] == 86400 -@test("ForexDataProvider._validate_and_clean basic valid data") +@test("TwelveDataProvider._validate_and_clean basic valid data") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) df = make_ohlcv(300) result = dp._validate_and_clean(df, "XAU/USD", Timeframe.H1) assert len(result) > 0 @@ -264,9 +264,9 @@ def _(): assert not result.index.has_duplicates -@test("ForexDataProvider._validate_and_clean empty df raises error") +@test("TwelveDataProvider._validate_and_clean empty df raises error") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) try: dp._validate_and_clean(pd.DataFrame(), "XAU/USD", Timeframe.H1) assert False, "Should have raised DataIntegrityError" @@ -274,9 +274,9 @@ def _(): pass -@test("ForexDataProvider._validate_and_clean None df raises error") +@test("TwelveDataProvider._validate_and_clean None df raises error") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) try: dp._validate_and_clean(None, "XAU/USD", Timeframe.H1) assert False, "Should have raised DataIntegrityError" @@ -284,18 +284,18 @@ def _(): pass -@test("ForexDataProvider._validate_and_clean fixes OHLC inconsistencies") +@test("TwelveDataProvider._validate_and_clean fixes OHLC inconsistencies") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) df = make_ohlcv(300) df.iloc[10, df.columns.get_loc("High")] = df.iloc[10]["Low"] - 1 result = dp._validate_and_clean(df, "XAU/USD", Timeframe.H1) assert (result["High"] >= result["Low"]).all() -@test("ForexDataProvider._validate_and_clean drops future timestamps") +@test("TwelveDataProvider._validate_and_clean drops future timestamps") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) df = make_ohlcv(300) future = pd.Timestamp.now(tz="UTC") + pd.Timedelta(hours=10) df.loc[future] = df.iloc[-1] @@ -303,9 +303,9 @@ def _(): assert (result.index <= pd.Timestamp.utcnow() + pd.Timedelta(minutes=5)).all() -@test("ForexDataProvider._validate_and_clean removes duplicates") +@test("TwelveDataProvider._validate_and_clean removes duplicates") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) df = make_ohlcv(300) dup = pd.concat([df, df.iloc[-5:]]) assert dup.index.has_duplicates, "Setup: should have duplicates" @@ -313,9 +313,9 @@ def _(): assert not result.index.has_duplicates, "Should remove duplicate indices" -@test("ForexDataProvider._validate_and_clean forward fills NaN (limit 3)") +@test("TwelveDataProvider._validate_and_clean forward fills NaN (limit 3)") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) df = make_ohlcv(300) df.iloc[100, df.columns.get_loc("Close")] = np.nan df.iloc[101, df.columns.get_loc("Close")] = np.nan @@ -323,9 +323,9 @@ def _(): assert not result["Close"].isna().any() -@test("ForexDataProvider._is_data_fresh weekend override") +@test("TwelveDataProvider._is_data_fresh weekend override") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) # Create data that ends on a Friday, call _is_data_fresh on a Saturday friday = pd.Timestamp("2025-05-09 16:00:00", tz="UTC") old_dates = pd.date_range(end=friday, periods=300, freq="h") @@ -339,16 +339,16 @@ def _(): assert result is True, "Weekend data should always be considered fresh" -@test("ForexDataProvider._is_data_fresh returns False for empty df") +@test("TwelveDataProvider._is_data_fresh returns False for empty df") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) assert dp._is_data_fresh(pd.DataFrame(), "XAU/USD", Timeframe.H1) is False assert dp._is_data_fresh(None, "XAU/USD", Timeframe.H1) is False -@test("ForexDataProvider.clear_cache clears all entries") +@test("TwelveDataProvider.clear_cache clears all entries") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) dp._cache["test_key"] = make_ohlcv(10) dp._cache_timestamps["test_key"] = time.time() count = dp.clear_cache() @@ -357,9 +357,9 @@ def _(): assert len(dp._cache_timestamps) == 0 -@test("ForexDataProvider.get_pair_info returns correct info") +@test("TwelveDataProvider.get_pair_info returns correct info") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) info = dp.get_pair_info(XAUUSD) assert info["symbol"] == XAUUSD assert info["display"] == "XAU/USD" @@ -369,18 +369,18 @@ def _(): assert info_unknown["display"] == "XAU/USD" -@test("ForexDataProvider._throttle rate limiting logic") +@test("TwelveDataProvider._throttle rate limiting logic") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) dp._request_times.clear() for _ in range(10): dp._throttle(credits=1) assert len(dp._request_times) == 10 -@test("ForexDataProvider caching - in-memory cache returns same data") +@test("TwelveDataProvider caching - in-memory cache returns same data") def _(): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) df = make_ohlcv(300) dp._cache["XAU/USD_1h"] = df dp._cache_timestamps["XAU/USD_1h"] = time.time() @@ -2267,7 +2267,7 @@ def _(): @test("Outlier filter drops the spike bar but keeps the snap-back bar") def _(): - provider = ForexDataProvider(PlatformConfig()) + provider = TwelveDataProvider(PlatformConfig()) df = make_ohlcv(n=300, seed=3) k = 150 spike_ts, after_ts = df.index[k], df.index[k + 1] @@ -2288,7 +2288,7 @@ def _(): "Close": v, "Volume": 1000.0}, index=idx) for _attempt in range(2): - provider = ForexDataProvider(PlatformConfig()) + provider = TwelveDataProvider(PlatformConfig()) started = pd.Timestamp.now(tz="UTC").floor("15min") last_closed = started - pd.Timedelta(minutes=15) stale = bars_ending(last_closed - pd.Timedelta(minutes=15)) @@ -2323,13 +2323,13 @@ def _(): "Close": v, "Volume": 1000.0}, index=idx) for _attempt in range(2): - provider = ForexDataProvider(PlatformConfig()) + provider = TwelveDataProvider(PlatformConfig()) started = pd.Timestamp.now(tz="UTC").floor("15min") last_closed = started - pd.Timedelta(minutes=15) lagging = bars_ending(last_closed - pd.Timedelta(minutes=15)) complete = bars_ending(last_closed) with patch("providers.base._is_forex_weekend", return_value=False), \ - patch.object(ForexDataProvider, "FRESH_FETCH_RETRY_SECONDS", 0.0): + patch.object(TwelveDataProvider, "FRESH_FETCH_RETRY_SECONDS", 0.0): # (a) lagging first response → one retry returns the closed bar. with patch.object(provider, "_fetch_twelve_data", side_effect=[lagging.copy(), complete.copy()]) as mf: @@ -2966,30 +2966,30 @@ def _(): f"example config.json must be byte-identical to defaults on {tf}" -@test("data_provider: api key resolves env → config.json (no code default)") +@test("providers: api key resolves env → config.json (no code default)") def _(): - from data_provider import ForexDataProvider + from providers import TwelveDataProvider app = AppConfig(provider_settings={"twelve_data": {"api_key": "json-key"}}) set_app_config(app) try: with patch.dict(os.environ, {}, clear=True): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) assert dp._api_key == "json-key" with patch.dict(os.environ, {"TWELVE_DATA_API_KEY": "env-key"}): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) assert dp._api_key == "env-key" set_app_config(AppConfig()) # no key anywhere with patch.dict(os.environ, {}, clear=True): - dp = ForexDataProvider(PlatformConfig()) + dp = TwelveDataProvider(PlatformConfig()) assert dp._api_key is None and dp._td is None finally: set_app_config(_TEST_APP) -@test("data_provider: make_data_provider dispatches on active provider") +@test("providers: make_data_provider dispatches on active provider") def _(): - from data_provider import ForexDataProvider, make_data_provider - assert isinstance(make_data_provider(PlatformConfig()), ForexDataProvider) + from providers import TwelveDataProvider, make_data_provider + assert isinstance(make_data_provider(PlatformConfig()), TwelveDataProvider) set_app_config(AppConfig(active_provider="polygon", provider_settings={"polygon": {"api_key": "k"}})) try: @@ -3132,30 +3132,12 @@ def _(): print("\n═══ Module 15: Oanda provider / executor / daemon ═══") -import oanda_provider +import providers.oanda import oanda_executor import oanda_daemon -@test("oanda_provider: _is_forex_weekend matches data_provider's") -def _(): - from data_provider import _is_forex_weekend as dp_weekend - from oanda_provider import _is_forex_weekend as oa_weekend - import pandas as pd - for ts_str in [ - "2026-07-17 12:00", # Friday noon - "2026-07-17 22:30", # Friday after close - "2026-07-18 15:00", # Saturday - "2026-07-19 12:00", # Sunday before open - "2026-07-19 22:30", # Sunday after open - "2026-07-20 08:00", # Monday - ]: - ts = pd.Timestamp(ts_str, tz="UTC") - assert dp_weekend(ts) == oa_weekend(ts), \ - f"Weekend check mismatch at {ts_str}" - - -@test("oanda_provider: OandaDataProvider parses Oanda candle JSON into correct DataFrame") +@test("providers.oanda: OandaDataProvider parses Oanda candle JSON into correct DataFrame") def _(): sample_candles = [ { @@ -3190,8 +3172,8 @@ def _(): "raise_for_status": lambda self: None, })() - provider2 = oanda_provider.OandaDataProvider.__new__( - oanda_provider.OandaDataProvider) + provider2 = providers.oanda.OandaDataProvider.__new__( + providers.oanda.OandaDataProvider) provider2.config = PlatformConfig() provider2._base_url = "https://test" provider2._cache = {} @@ -3219,25 +3201,25 @@ def _(): assert abs(spread - 0.30) < 0.01, f"Expected spread ~0.30, got {spread}" -@test("oanda_provider: instrument name mapping") +@test("providers.oanda: instrument name mapping") def _(): - provider = oanda_provider.OandaDataProvider.__new__( - oanda_provider.OandaDataProvider) + provider = providers.oanda.OandaDataProvider.__new__( + providers.oanda.OandaDataProvider) assert provider._to_oanda_instrument("XAU/USD") == "XAU_USD" assert provider._to_oanda_instrument("EUR/USD") == "EUR_USD" -@test("oanda_provider: granularity mapping covers all scan timeframes") +@test("providers.oanda: granularity mapping covers all scan timeframes") def _(): for tf in [Timeframe.M5, Timeframe.M15, Timeframe.H1, Timeframe.H4]: - assert tf in oanda_provider.OandaDataProvider.OANDA_GRANULARITY, \ + assert tf in providers.oanda.OandaDataProvider.OANDA_GRANULARITY, \ f"{tf} missing from OANDA_GRANULARITY" -@test("oanda_provider: get_spread returns default when no cache") +@test("providers.oanda: get_spread returns default when no cache") def _(): - provider = oanda_provider.OandaDataProvider.__new__( - oanda_provider.OandaDataProvider) + provider = providers.oanda.OandaDataProvider.__new__( + providers.oanda.OandaDataProvider) provider._spread_cache = {} spread = provider.get_spread("XAU/USD") assert spread == 0.30, f"Expected default spread 0.30, got {spread}" @@ -3820,15 +3802,15 @@ def _(): assert "oanda.com" in url, f"Expected Oanda URL, got {url}" -@test("oanda_provider: HTTP error surfaces status code and body") +@test("providers.oanda: HTTP error surfaces status code and body") def _(): mock_resp = type("MockResp", (), { "status_code": 401, "text": '{"errorMessage":"Insufficient authorization to perform request"}', })() - provider = oanda_provider.OandaDataProvider.__new__( - oanda_provider.OandaDataProvider) + provider = providers.oanda.OandaDataProvider.__new__( + providers.oanda.OandaDataProvider) provider._base_url = "https://test" provider._spread_cache = {} provider._session = type("S", (), { @@ -3839,17 +3821,17 @@ def _(): try: provider._fetch_oanda_candles("XAU/USD", Timeframe.H1, 300) assert False, "Should have raised OandaDataError" - except oanda_provider.OandaDataError as e: + except providers.oanda.OandaDataError as e: msg = str(e) assert "401" in msg, f"Status code missing from error: {msg}" assert "Insufficient authorization" in msg, \ f"Body detail missing from error: {msg}" -@test("oanda_provider: boundary-retry failure keeps original data") +@test("providers.oanda: boundary-retry failure keeps original data") def _(): - provider = oanda_provider.OandaDataProvider.__new__( - oanda_provider.OandaDataProvider) + provider = providers.oanda.OandaDataProvider.__new__( + providers.oanda.OandaDataProvider) provider.config = PlatformConfig() provider._cache = {} provider._cache_timestamps = {} @@ -3868,7 +3850,7 @@ def _(): call_count["n"] += 1 if call_count["n"] == 1: return original_df - raise oanda_provider.OandaDataError("boom") + raise providers.oanda.OandaDataError("boom") def _validate_and_clean(df, symbol, timeframe): return df @@ -4029,19 +4011,6 @@ def _(): assert TiingoDataProvider.CANDLE_SECONDS is BaseDataProvider.CANDLE_SECONDS -@test("providers: back-compat shims re-export the real classes") -def _(): - import data_provider as dp_shim - import oanda_provider as oa_shim - assert dp_shim.ForexDataProvider is TwelveDataProvider - assert dp_shim.make_data_provider is make_data_provider - assert oa_shim.OandaDataProvider is _POanda - from providers.base import DataIntegrityError as base_die - assert dp_shim.DataIntegrityError is base_die - # Provider-specific errors are catchable as the shared type. - assert issubclass(oa_shim.OandaDataError, base_die) - - @test("providers: fetch_range paginates, dedupes, and trims to the window") def _(): class FakeProvider(BaseDataProvider): @@ -4288,7 +4257,7 @@ def _(): # must never change the session clock. import signal_aggregator as sa assert sa.BaseDataProvider.CANDLE_SECONDS[Timeframe.M15] == 900 - assert not hasattr(sa, "ForexDataProvider"), \ + assert not hasattr(sa, "TwelveDataProvider"), \ "aggregator must not depend on a concrete provider class"