Scan only M15 and H1; keep D1 as confirmation, drop W1 entirely

Trades are intraday (M15/H1) only. D1 stays as a confirmation TF
for both so higher-timeframe trend context still gates A/A+ grades.
W1 is no longer used anywhere — removes one batch call.

Scan now: 3 batch calls (M15, H1, D1) × 7 pairs = 21 credits, ~2 min.
Was:      4 batch calls (M15, H1, D1, W1) = 28 credits, ~3 min.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Harwinder
2026-05-05 14:13:44 -04:00
parent 2f6eed7309
commit 492b39313a
2 changed files with 15 additions and 17 deletions
+12 -13
View File
@@ -43,30 +43,30 @@ After every fetch the data goes through `_validate_and_clean`:
### Per scan or /signal command ### Per scan or /signal command
The bot does **one shared prefetch** before spawning the 4 TF analyses. The bot does **one shared prefetch** before spawning TF analyses.
It collects all unique timeframes needed across all scans, then makes It collects all unique timeframes needed across scans, then makes
one batch API call per timeframe (all pairs in a single request). one batch API call per timeframe (all pairs in a single request).
Current SCAN_TIMEFRAMES: M15, H1, D1, W1 Current SCAN_TIMEFRAMES: M15, H1 (only intraday trade signals)
Confirmations: Confirmations:
- M15 uses: H1, D1 - M15 uses: H1, D1
- H1 uses: M15, D1 - H1 uses: M15, D1
- D1 uses: H1, W1
- W1 uses: D1
Unique timeframes: M15, H1, D1, W1 = **4 batch calls** D1 is kept as a confirmation for higher-timeframe trend context but
no D1 trade signals are produced. W1 has been dropped entirely.
Unique timeframes: M15, H1, D1 = **3 batch calls**
Each call: 7 pairs × 1 credit = **7 credits per call** Each call: 7 pairs × 1 credit = **7 credits per call**
Total per scan: **4 calls × 7 credits = 28 credits** Total per scan: **3 calls × 7 credits = 21 credits**
With the 8 credits/minute limit: With the 8 credits/minute limit:
- Call 1 (7 credits): fires immediately — 1 credit remaining - Call 1 (7 credits): fires immediately — 1 credit remaining
- Call 2 (7 credits): must wait ~60s for window to clear - Call 2 (7 credits): must wait ~60s for window to clear
- Call 3 (7 credits): waits another ~60s - Call 3 (7 credits): waits another ~60s
- Call 4 (7 credits): waits another ~60s
**Minimum scan time: ~3 minutes.** **Minimum scan time: ~2 minutes.**
After the shared prefetch, the 4 concurrent TF analyses read from After the shared prefetch, the 4 concurrent TF analyses read from
the in-memory cache and make **zero additional API calls**. the in-memory cache and make **zero additional API calls**.
@@ -204,13 +204,12 @@ Telegram /scan or /signal
▼ ▼
_analyze_all_tfs(pairs) _analyze_all_tfs(pairs)
│ │
├── prefetch_batch(pairs, [M15, H1, D1, W1]) ├── prefetch_batch(pairs, [M15, H1, D1])
│ ├── Batch call 1: all pairs @ M15 (7 credits, wait if needed) │ ├── Batch call 1: all pairs @ M15 (7 credits, wait if needed)
│ ├── Batch call 2: all pairs @ H1 (7 credits, wait if needed) │ ├── Batch call 2: all pairs @ H1 (7 credits, wait if needed)
│ ├── Batch call 3: all pairs @ D1 (7 credits, wait if needed) │ └── Batch call 3: all pairs @ D1 (7 credits, wait if needed)
│ └── Batch call 4: all pairs @ W1 (7 credits, wait if needed)
│ │
└── 4 threads (one per TF), all reading from warm cache └── 2 threads (M15 + H1), all reading from warm cache
│ │
└── per thread: SignalAggregator.analyze_all_pairs() └── per thread: SignalAggregator.analyze_all_pairs()
│ │
+3 -4
View File
@@ -40,20 +40,19 @@ logger = logging.getLogger(__name__)
# ── Config ────────────────────────────────────────────────────────── # ── Config ──────────────────────────────────────────────────────────
SCAN_TIMEFRAMES = ["M15", "H1", "D1", "W1"] SCAN_TIMEFRAMES = ["M15", "H1"]
_TF_MAP = { _TF_MAP = {
"M5": Timeframe.M5, "M15": Timeframe.M15, "M5": Timeframe.M5, "M15": Timeframe.M15,
"M30": Timeframe.M30, "H1": Timeframe.H1, "M30": Timeframe.M30, "H1": Timeframe.H1,
"H4": Timeframe.H4, "D1": Timeframe.D1, "H4": Timeframe.H4, "D1": Timeframe.D1,
"W1": Timeframe.W1,
} }
# D1 kept as confirmation for higher-timeframe trend context.
# W1 dropped — only the D1 scan used it, and we no longer scan D1.
_TF_CONFIRMATIONS = { _TF_CONFIRMATIONS = {
"M15": [Timeframe.H1, Timeframe.D1], "M15": [Timeframe.H1, Timeframe.D1],
"H1": [Timeframe.M15, Timeframe.D1], "H1": [Timeframe.M15, Timeframe.D1],
"D1": [Timeframe.H1, Timeframe.W1],
"W1": [Timeframe.D1],
} }
_GRADE_RANK = {"A+": 0, "A": 1, "B": 2, "C": 3, "D": 4, "F": 5} _GRADE_RANK = {"A+": 0, "A": 1, "B": 2, "C": 3, "D": 4, "F": 5}