From 683d070a41b0571c132eee95d7b13f4e3eb2b670 Mon Sep 17 00:00:00 2001 From: Harwinder Date: Mon, 4 May 2026 21:29:48 -0400 Subject: [PATCH] Scan M15/H1/D1/W1 only; grade symbols + legend on all messages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - SCAN_TIMEFRAMES: drop H4, add W1 (4 unique TFs โ†’ fewer API calls) - Confirmations updated to use only the 4 scan TFs (no H4 dependency) - Add _grade_symbol(): ๐Ÿ”ฅA+ โœ…A ๐Ÿ‘B โš ๏ธC ๐Ÿ“‰D โŒF - _GRADE_LEGEND shown on every /signal and /scan message - ๐Ÿง  icon on Signal Analysis and Scan Complete headers - /help grade guide updated with full symbol legend Co-Authored-By: Claude Sonnet 4.6 --- telegram_bot.py | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/telegram_bot.py b/telegram_bot.py index efb6641..c2f28b4 100644 --- a/telegram_bot.py +++ b/telegram_bot.py @@ -40,22 +40,24 @@ logger = logging.getLogger(__name__) # โ”€โ”€ Config โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ -SCAN_TIMEFRAMES = ["M15", "H1", "H4", "D1"] +SCAN_TIMEFRAMES = ["M15", "H1", "D1", "W1"] _TF_MAP = { "M5": Timeframe.M5, "M15": Timeframe.M15, "M30": Timeframe.M30, "H1": Timeframe.H1, "H4": Timeframe.H4, "D1": Timeframe.D1, + "W1": Timeframe.W1, } _TF_CONFIRMATIONS = { - "M15": [Timeframe.M5, Timeframe.H1], - "H1": [Timeframe.M15, Timeframe.H4], - "H4": [Timeframe.H1, Timeframe.D1], - "D1": [Timeframe.H4, Timeframe.W1], + "M15": [Timeframe.H1, 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_LEGEND = "Grade scale: ๐Ÿ”ฅ A+ ยท โœ… A ยท ๐Ÿ‘ B ยท โš ๏ธ C ยท ๐Ÿ“‰ D ยท โŒ F" _EST = ZoneInfo("America/New_York") # โ”€โ”€ Formatting helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ @@ -75,6 +77,10 @@ def _signal_action(signal: SignalStrength) -> str: }.get(signal, "NEUTRAL") +def _grade_symbol(quality: str) -> str: + return {"A+": "๐Ÿ”ฅ", "A": "โœ…", "B": "๐Ÿ‘", "C": "โš ๏ธ", "D": "๐Ÿ“‰"}.get(quality, "โŒ") + + def _indicator_condition(ind) -> str: desc = ind.description if " โ€” " in desc: @@ -114,8 +120,9 @@ def _build_combined_signal( MTF detail block (folded to one line), news unless non-neutral. """ lines: List[str] = [] - lines.append(f"๐ŸŒ {_h(display)} โ€” Signal Analysis") + lines.append(f"๐ŸŒ ๐Ÿง  {_h(display)} โ€” Signal Analysis") lines.append(f"๐Ÿ• {now_str}") + lines.append(f"{_GRADE_LEGEND}") for tf in SCAN_TIMEFRAMES: reports = results_by_tf.get(tf, []) @@ -137,10 +144,11 @@ def _build_combined_signal( continue action = _signal_action(r.final_signal) + sym = _grade_symbol(r.signal_quality) lines.append("") lines.append("โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€") - lines.append(f"{tf} ยท {action} ยท Grade {_h(r.signal_quality)}") + lines.append(f"{sym} {tf} ยท {action} ยท Grade {_h(r.signal_quality)}") lines.append("") # โ”€โ”€ Trade setup (always kept intact) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ @@ -207,15 +215,17 @@ def _build_scan_message( Full entry/TP/SL preserved; no indicator list (use /signal to drill in). """ lines: List[str] = [] - lines.append(f"๐Ÿ“Š Scan Complete ยท {now_str}") + lines.append(f"๐Ÿ“Š ๐Ÿง  Scan Complete ยท {now_str}") lines.append(f"Timeframes: {_h(tfs_str)} | Best signal per pair") + lines.append(f"{_GRADE_LEGEND}") lines.append("") for tf, r in actionable: action = _signal_action(r.final_signal) + sym = _grade_symbol(r.signal_quality) lines.append( - f"{_h(r.display_name)} ยท {action}" + f"{sym} {_h(r.display_name)} ยท {action}" f" ยท {_h(r.signal_quality)} ยท {tf}" ) @@ -325,9 +335,12 @@ class ForexTelegramBot: " /help โ€” This message\n\n" f"Timeframes analyzed: {tfs}\n\n" "Signal Grades:\n" - " A / A+ โ€” High confidence, consider entry\n" - " B โ€” Decent setup, wait for confirmation\n" - " C / D โ€” Low confidence, watch only\n\n" + " ๐Ÿ”ฅ A+ โ€” Strongest signal, MTF aligned, high confidence\n" + " โœ… A โ€” Strong signal, MTF aligned\n" + " ๐Ÿ‘ B โ€” Decent setup, wait for confirmation\n" + " โš ๏ธ C โ€” Weak signal, watch only\n" + " ๐Ÿ“‰ D โ€” Very weak, no action\n" + " โŒ F โ€” No clear signal\n\n" "โš ๏ธ Educational use only. Not financial advice." ) await update.message.reply_text(text, parse_mode=ParseMode.HTML)