#!/usr/bin/env python3
import json
import time

# 数据
river_15min = [{"open": 8.6451, "close": 8.649}, {"open": 8.977, "close": 8.6663}, {"open": 8.9046, "close": 8.9654}, {"open": 8.8001, "close": 8.9138}, {"open": 8.9766, "close": 8.848}, {"open": 9.0217, "close": 8.9522}, {"open": 9.4223, "close": 9.0225}, {"open": 9.4289, "close": 9.4221}, {"open": 9.3397, "close": 9.4532}, {"open": 9.2324, "close": 9.3456}, {"open": 9.398, "close": 9.2191}, {"open": 8.9044, "close": 9.3974}, {"open": 8.9736, "close": 8.9045}, {"open": 8.9463, "close": 8.9763}, {"open": 8.7745, "close": 8.9377}, {"open": 8.6183, "close": 8.7744}, {"open": 8.6608, "close": 8.6193}, {"open": 8.8778, "close": 8.6571}, {"open": 8.7502, "close": 8.8696}, {"open": 8.6954, "close": 8.7498}]
eth_15min = [{"open": 1956.23, "close": 1951.61}, {"open": 1959.89, "close": 1957.0}, {"open": 1963.45, "close": 1960.2}, {"open": 1959.12, "close": 1963.13}, {"open": 1965.0, "close": 1959.62}, {"open": 1965.9, "close": 1965.44}, {"open": 1966.35, "close": 1966.31}, {"open": 1963.41, "close": 1966.08}, {"open": 1974.19, "close": 1963.36}, {"open": 1977.88, "close": 1973.82}, {"open": 1972.25, "close": 1977.38}, {"open": 1970.84, "close": 1973.46}, {"open": 1969.0, "close": 1970.6}, {"open": 1972.75, "close": 1969.0}, {"open": 1977.19, "close": 1972.4}, {"open": 1981.08, "close": 1976.6}, {"open": 1982.45, "close": 1981.37}, {"open": 1983.44, "close": 1982.64}, {"open": 1984.57, "close": 1983.52}, {"open": 1983.73, "close": 1983.49}]
river_5min = [{"open": 8.6838, "close": 8.6447}, {"open": 8.6658, "close": 8.6863}, {"open": 8.6451, "close": 8.6661}, {"open": 8.706, "close": 8.6663}, {"open": 8.7621, "close": 8.7062}, {"open": 8.977, "close": 8.75}, {"open": 8.9817, "close": 8.9654}, {"open": 8.9331, "close": 8.9811}, {"open": 8.9046, "close": 8.9215}, {"open": 8.9178, "close": 8.9138}, {"open": 9.0885, "close": 8.9807}, {"open": 8.8001, "close": 9.0934}, {"open": 8.8189, "close": 8.848}, {"open": 8.987, "close": 8.8154}, {"open": 8.9766, "close": 8.9872}, {"open": 9.1563, "close": 8.9522}, {"open": 9.1239, "close": 9.1641}, {"open": 9.0217, "close": 9.1318}, {"open": 9.1389, "close": 9.0225}, {"open": 9.07, "close": 9.1391}]
eth_5min = [{"open": 1952.13, "close": 1950.91}, {"open": 1955.13, "close": 1951.39}, {"open": 1956.23, "close": 1955.69}, {"open": 1957.81, "close": 1957.0}, {"open": 1961.07, "close": 1957.98}, {"open": 1959.89, "close": 1960.51}, {"open": 1963.1, "close": 1960.2}, {"open": 1962.45, "close": 1962.7}, {"open": 1963.45, "close": 1961.94}, {"open": 1962.89, "close": 1963.13}, {"open": 1959.83, "close": 1962.19}, {"open": 1959.12, "close": 1960.18}, {"open": 1958.83, "close": 1959.62}, {"open": 1964.48, "close": 1958.75}, {"open": 1965.0, "close": 1964.46}, {"open": 1965.84, "close": 1965.44}, {"open": 1966.43, "close": 1966.27}, {"open": 1965.9, "close": 1966.51}, {"open": 1965.55, "close": 1966.31}, {"open": 1967.52, "close": 1965.76}]
river_1min = [{"open": 8.6462, "close": 8.6447}, {"open": 8.626, "close": 8.649}, {"open": 8.6838, "close": 8.6222}, {"open": 8.687, "close": 8.6863}, {"open": 8.6518, "close": 8.6915}, {"open": 8.6951, "close": 8.6521}, {"open": 8.6692, "close": 8.6953}, {"open": 8.6658, "close": 8.6693}, {"open": 8.6738, "close": 8.6661}, {"open": 8.6362, "close": 8.6705}, {"open": 8.6727, "close": 8.6533}, {"open": 8.6328, "close": 8.6677}, {"open": 8.6451, "close": 8.6333}, {"open": 8.6901, "close": 8.6663}, {"open": 8.6857, "close": 8.6903}, {"open": 8.6522, "close": 8.6806}, {"open": 8.6599, "close": 8.6551}, {"open": 8.706, "close": 8.6637}, {"open": 8.7192, "close": 8.7062}, {"open": 8.7218, "close": 8.7115}]
eth_1min = [{"open": 1952.02, "close": 1950.91}, {"open": 1951.61, "close": 1951.61}, {"open": 1952.13, "close": 1951.07}, {"open": 1951.26, "close": 1951.39}, {"open": 1951.38, "close": 1952.29}, {"open": 1952.22, "close": 1952.21}, {"open": 1952.72, "close": 1952.72}, {"open": 1955.13, "close": 1952.38}, {"open": 1955.35, "close": 1955.69}, {"open": 1956.17, "close": 1956.01}, {"open": 1956.56, "close": 1955.15}, {"open": 1955.78, "close": 1956.16}, {"open": 1956.23, "close": 1956.22}, {"open": 1956.75, "close": 1957.0}, {"open": 1957.43, "close": 1957.43}, {"open": 1957.74, "close": 1957.74}, {"open": 1957.75, "close": 1957.75}, {"open": 1957.81, "close": 1957.75}, {"open": 1957.01, "close": 1957.98}, {"open": 1955.91, "close": 1956.86}]

def analyze_filtered_consecutive_up(klines, max_reverse=2, small_reverse_threshold=0.3):
    if len(klines) < 3:
        return 0, 0.0, []
    
    candle_changes = []
    for i, k in enumerate(klines):
        open_price = k['open']
        close_price = k['close']
        change_pct = (close_price - open_price) / open_price * 100
        direction = 'up' if close_price > open_price else ('down' if close_price < open_price else 'neutral')
        candle_changes.append({
            'index': i,
            'open': open_price,
            'close': close_price,
            'change_pct': change_pct,
            'direction': direction
        })
    
    max_consecutive = 0
    best_sequence = None
    best_up_gains = 0
    best_down_losses = 0
    
    for start_idx in range(len(candle_changes)):
        if candle_changes[start_idx]['direction'] != 'up':
            continue
            
        consecutive_up = 0
        reverse_count = 0
        total_up_gains = 0
        total_down_losses = 0
        sequence = []
        
        for i in range(start_idx, len(candle_changes)):
            candle = candle_changes[i]
            if candle['direction'] == 'up':
                consecutive_up += 1
                reverse_count = 0
                total_up_gains += candle['change_pct']
                sequence.append('🔺')
            elif candle['direction'] == 'down':
                if total_up_gains > 0:
                    ratio = abs(candle['change_pct']) / total_up_gains if total_up_gains > 0 else 1
                    if ratio < small_reverse_threshold:
                        continue
                reverse_count += 1
                if reverse_count > max_reverse:
                    break
                total_down_losses += abs(candle['change_pct'])
                sequence.append('⬇️')
        
        if consecutive_up > max_consecutive:
            max_consecutive = consecutive_up
            best_sequence = sequence.copy()
            best_up_gains = total_up_gains
            best_down_losses = total_down_losses
        
        if max_consecutive >= 10:
            break
    
    net_gain = best_up_gains - best_down_losses
    return max_consecutive, net_gain, best_sequence if best_sequence else []

def get_grade(consecutive_count):
    if consecutive_count >= 13: return "SS级"
    elif consecutive_count >= 11: return "S级"
    elif consecutive_count >= 9: return "A级"
    elif consecutive_count >= 7: return "B级"
    elif consecutive_count >= 5: return "C级"
    elif consecutive_count >= 3: return "D级"
    return None

configs = [
    ('RIVER', 'USDT', '15分钟', river_15min),
    ('RIVER', 'USDT', '5分钟', river_5min),
    ('RIVER', 'USDT', '1分钟', river_1min),
    ('ETH', 'USDT', '15分钟', eth_15min),
    ('ETH', 'USDT', '5分钟', eth_5min),
    ('ETH', 'USDT', '1分钟', eth_1min),
]

results = []
for symbol, quote, period, klines in configs:
    consecutive_count, net_gain, sequence = analyze_filtered_consecutive_up(klines)
    grade = get_grade(consecutive_count)
    
    result = {
        'symbol': f"{symbol}/{quote}",
        'period': period,
        'current_price': klines[0]['close'],
        'consecutive_count': consecutive_count,
        'net_gain': net_gain,
        'grade': grade,
        'sequence': ''.join(sequence) if sequence else ''
    }
    results.append(result)
    print(f"{symbol}/{quote} - {period}级别: 价格={result['current_price']:.4f}, 连续={consecutive_count}, 净涨幅={net_gain:.2f}%, 评级={grade}, 序列={result['sequence']}")

# 检查通知
print("\n=== 信号检测 ===")
notified = {"RIVER/USDT-15分钟-B级": 1771501953}
current_time = int(time.time())

for r in results:
    if r['grade']:
        key = f"{r['symbol']}-{r['period']}-{r['grade']}"
        if key in notified:
            elapsed = current_time - notified[key]
            if elapsed < 300:
                print(f"⏸️ {key} - 冷却中 ({elapsed}s/300s)")
                continue
        print(f"📢 需要通知: {key}")
