import ccxt
import pandas as pd
import ta
import time

# =========================
# تنظیمات
# =========================
symbols = [
    'BTC/USDT', 'ETH/USDT', 'BNB/USDT', 'XRP/USDT', 'SOL/USDT',
    'DOGE/USDT', 'ADA/USDT', 'AVAX/USDT', 'DOT/USDT', 'LINK/USDT'
]
timeframe = '15m'
limit = 200
ema_fast = 9
ema_slow = 21
rsi_period = 14

tp_percent = 2      # Take Profit % (برای لانگ/شورت)
sl_percent = 1      # Stop Loss % (برای لانگ/شورت)

exchange = ccxt.binance({'options': {'defaultType': 'future'}})

# =========================
# داده ها
# =========================
def get_data(symbol):
    try:
        ohlcv = exchange.fetch_ohlcv(symbol, timeframe=timeframe, limit=limit)
        df = pd.DataFrame(ohlcv, columns=['timestamp','open','high','low','close','volume'])
        df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
        return df
    except Exception as e:
        print(f"Error fetching {symbol}: {e}")
        return None

# =========================
# اندیکاتورها
# =========================
def apply_indicators(df):
    df['ema_fast'] = ta.trend.EMAIndicator(df['close'], window=ema_fast).ema_indicator()
    df['ema_slow'] = ta.trend.EMAIndicator(df['close'], window=ema_slow).ema_indicator()
    df['rsi'] = ta.momentum.RSIIndicator(df['close'], window=rsi_period).rsi()
    return df

# =========================
# سیگنال و اسکور
# =========================
def signal_score(df):
    latest = df.iloc[-1]
    score = 0
    signal = "HOLD"

    if (latest['ema_fast'] > latest['ema_slow']) and (latest['rsi'] < 70):
        score += 1
        signal = "BUY"
    if (latest['ema_fast'] < latest['ema_slow']) and (latest['rsi'] > 30):
        score -= 1
        signal = "SELL"

    score += (latest['ema_fast'] - latest['ema_slow']) / latest['close']
    score += (50 - abs(latest['rsi'] - 50)) / 100
    return signal, round(score, 3), latest['close']

# =========================
# محاسبه TP و SL
# =========================
def calculate_tp_sl(signal, price):
    if signal == "BUY":
        tp = price * (1 + tp_percent/100)
        sl = price * (1 - sl_percent/100)
    elif signal == "SELL":
        tp = price * (1 - tp_percent/100)
        sl = price * (1 + sl_percent/100)
    else:
        tp, sl = None, None
    return round(tp, 4) if tp else None, round(sl, 4) if sl else None

# =========================
# برآورد زمان رسیدن به TP/SL
# =========================
def estimate_time_to_target(df, price, target, timeframe_minutes=15):
    recent = df['close'].iloc[-20:]
    avg_move = recent.diff().abs().mean()
    if avg_move == 0 or target is None:
        return None
    distance = abs(target - price)
    candles_needed = distance / avg_move
    minutes_needed = candles_needed * timeframe_minutes
    return round(minutes_needed)

# =========================
# اسکن بازار
# =========================
def scanner():
    results = []
    for sym in symbols:
        df = get_data(sym)
        if df is None:
            continue
        df = apply_indicators(df)
        sig, score, price = signal_score(df)
        tp, sl = calculate_tp_sl(sig, price)
        tp_time = estimate_time_to_target(df, price, tp)
        sl_time = estimate_time_to_target(df, price, sl)
        results.append((sym, sig, score, price, tp, sl, tp_time, sl_time))
        print(f"{sym:<10} | {sig:<5} | Score: {score:<6} | Price: {price:.4f} | TP: {tp} (~{tp_time} min) | SL: {sl} (~{sl_time} min)")

    ranked = sorted(results, key=lambda x: x[2], reverse=True)
    best = ranked[0]
    print("\n🚀 بهترین موقعیت فعلی:")
    print(f"{best[0]} → {best[1]} @ {best[3]:.4f} | TP: {best[4]} (~{best[6]} min) | SL: {best[5]} (~{best[7]} min) | Score {best[2]}")

# =========================
# اجرای اصلی
# =========================
def main():
    while True:
        print("\n================= SCANNING MARKETS =================")
        scanner()
        time.sleep(60 * 5)  # هر ۵ دقیقه آپدیت شود

if __name__ == "__main__":
    main()

