← Back
"""
Parser for Profit_GAME Telegram channel posts.

Post format:
  PROVE фьючи - актив в ИГРЕ! 💥
  #PROVE | #Futures | #Chart | PROVEUSDT
  ❗ Точка входа → 📈

Extracts: ticker, market (futures/spot), pair (TICKERUSDT)
"""

import re
import logging

logger = logging.getLogger(__name__)


def parse_profit_game_post(text: str) -> dict | None:
    """Parse a Profit_GAME channel post and extract signal data."""
    if not text:
        return None

    # Must contain "ИГРЕ" or "актив" to be a signal post
    if "ИГРЕ" not in text and "актив" not in text:
        return None

    result = {
        "ticker": None,
        "market": None,  # "futures" or "spot"
        "pair": None,    # e.g. "BTCUSDT"
        "raw_text": text,
    }

    # Extract market type
    text_lower = text.lower()
    if "фьючи" in text_lower or "futures" in text_lower:
        result["market"] = "futures"
    elif "спот" in text_lower or "spot" in text_lower:
        result["market"] = "spot"

    # Extract ticker from hashtags: #PROVE | #Futures | #Chart | PROVEUSDT
    # Look for pattern: #TICKER |
    hashtag_match = re.search(r'#(\w+)\s*\|\s*#(?:Futures|Spot|futures|spot)', text)
    if hashtag_match:
        result["ticker"] = hashtag_match.group(1).upper()

    # Fallback: extract from first word before "фьючи"/"спот"
    if not result["ticker"]:
        first_word_match = re.match(r'(\w+)\s+(?:фьючи|спот)', text_lower)
        if first_word_match:
            result["ticker"] = first_word_match.group(1).upper()

    # Extract pair: TICKERUSDT at end of hashtag line
    pair_match = re.search(r'(\w+USDT)\b', text.upper())
    if pair_match:
        result["pair"] = pair_match.group(1)
    elif result["ticker"]:
        result["pair"] = f"{result['ticker']}USDT"

    # Extract % move if present in image caption
    # Pattern: TICKER/USDT (15m) +72.15% ▲ $0.0862
    move_match = re.search(r'([+-]?\d+\.?\d*)\s*%', text)
    if move_match:
        result["move_percent"] = float(move_match.group(1))

    if not result["ticker"]:
        logger.debug(f"Could not parse ticker from: {text[:100]}")
        return None

    logger.info(f"Parsed signal: {result['ticker']} ({result['market']}) pair={result['pair']}")
    return result


def classify_signal(move_percent: float) -> dict:
    """Classify signal by move magnitude."""
    abs_move = abs(move_percent)

    if abs_move >= 30:
        priority = "HIGH"
        emoji = "🔥"
        if move_percent > 0:
            strategy = "momentum_long"
            description = "Strong pump - momentum play"
        else:
            strategy = "mean_reversion_long"
            description = "Strong dump - bounce play"
    elif abs_move >= 10:
        priority = "MEDIUM"
        emoji = "⚡"
        strategy = "check_pattern"
        description = "Moderate move - check for pattern"
    else:
        priority = "LOW"
        emoji = "😐"
        strategy = "skip"
        description = "Noise - skip"

    return {
        "priority": priority,
        "emoji": emoji,
        "strategy": strategy,
        "description": description,
        "move_percent": move_percent,
    }

📜 Git History

c6f6bd5chore: initial commit — version control setup5 weeks ago
Show last diff
Loading...