import tkinter as tk
from tkinter import ttk, messagebox
import requests
import time
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import ta
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

# تابع برای دریافت قیمت لایو از LBank
def get_live_price():
    url = "https://api.lbank.info/v1/ticker?symbol=shibusdt"
    try:
        response = requests.get(url)
        response.raise_for_status()  # Raise an error for bad responses (4XX or 5XX)
        data = response.json()
        
        # بررسی ساختار پاسخ
        if 'data' in data and 'last' in data['data']:
            return float(data['data']['last'])
        else:
            print("Unexpected response structure:", data)
            return None  # Return None if the structure is unexpected
            
    except requests.exceptions.RequestException as e:
        print("Error with the request:", e)
    except ValueError as json_err:
        print("JSON decode error:", json_err)

    return None  # Return None if any error occurs

# تابع برای محاسبه سیگنال خرید و فروش
def calculate_signals(price_data):
    price_data['MA5'] = price_data['close'].rolling(window=5).mean()
    price_data['MA10'] = price_data['close'].rolling(window=10).mean()
    price_data['RSI'] = ta.momentum.RSIIndicator(price_data['close']).rsi()
    
    features = price_data[['MA5', 'MA10', 'RSI']].iloc[10:].dropna()
    
    if features.empty:
        return 0

    X = features.values
    y = [1 if price_data['close'].iloc[i + 1] > price_data['close'].iloc[i] else 0 for i in range(len(features) - 1)]

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

    model = DecisionTreeClassifier()
    model.fit(X_train, y_train)

    latest_features = features.values[-1].reshape(1, -1)
    latest_signal = model.predict(latest_features)

    return latest_signal[0]

# تابع برای خرید یا فروش
def execute_trade():
    global balance_usdt, balance_shiba, trade_history, prices, price_data, trade_log

    current_price = get_live_price()
    
    # بررسی قیمت معتبر
    if current_price is None:
        alert_user("Unable to retrieve current price. Please check connection or API.")
        return

    prices.append(current_price)

    new_row = pd.DataFrame({'close': [current_price]})
    price_data = pd.concat([price_data, new_row], ignore_index=True)

    if len(price_data) < 10:
        return

    latest_signal = calculate_signals(price_data)
    
    amount = 5  # مقدار که معامله می‌کنیم
    profit_loss = 0  # محاسبه سود و زیان در اینجا

    if latest_signal == 1 and balance_usdt >= amount:
        balance_usdt -= amount
        balance_shiba += amount / current_price
        trade_history.append((time.strftime("%Y-%m-%d %H:%M:%S"), 'buy', current_price, amount))

        trade_log = trade_log.append({
            'زمان': time.strftime("%Y-%m-%d %H:%M:%S"),
            'نوع': 'buy',
            'قیمت': current_price,
            'مقدار': amount,
            'سود/زیان': profit_loss
        }, ignore_index=True)

        alert_user("Buy signal executed!")

    elif latest_signal == 0 and balance_shiba >= amount / current_price:
        balance_shiba -= amount / current_price
        balance_usdt += amount
        trade_history.append((time.strftime("%Y-%m-%d %H:%M:%S"), 'sell', current_price, amount))

        trade_log = trade_log.append({
            'زمان': time.strftime("%Y-%m-%d %H:%M:%S"),
            'نوع': 'sell',
            'قیمت': current_price,
            'مقدار': amount,
            'سود/زیان': profit_loss
        }, ignore_index=True)

        alert_user("Sell signal executed!")

    update_display()
    update_graph()

def alert_user(message):
    messagebox.showinfo("Trade Alert", message)

def update_display():
    lbl_balance_usdt.config(text=f"موجودی USDT: {balance_usdt:.2f} $")
    lbl_balance_shiba.config(text=f"موجودی Shiba: {balance_shiba:.6f} SHIBA")
    
    for row in tree.get_children():
        tree.delete(row)

    for row in trade_history:
        tree.insert("", "end", values=row)

    for row in trade_log.itertuples(index=False, name=None):
        tree_log.insert("", "end", values=row)

# ایجاد پنجره اصلی
root = tk.Tk()
root.title("ربات اسکالپینگ Shiba/USDT")
root.geometry("800x600")
root.configure(bg="black")

# متغیرها
balance_usdt = 10.0  # موجودی USDT
balance_shiba = 410000.0  # موجودی Shiba
trade_history = []
trade_log = pd.DataFrame(columns=['زمان', 'نوع', 'قیمت', 'مقدار', 'سود/زیان'])
prices = []
price_data = pd.DataFrame(columns=['close'])

# لایه برای اطلاعات مالی
frame = tk.Frame(root, bg='black')
frame.pack(pady=10)

lbl_balance_usdt = tk.Label(frame, text=f"موجودی USDT: {balance_usdt:.2f} $", bg='black', fg='gold')
lbl_balance_usdt.pack()

lbl_balance_shiba = tk.Label(frame, text=f"موجودی Shiba: {balance_shiba:.6f} SHIBA", bg='black', fg='gold')
lbl_balance_shiba.pack()

lbl_current_price = tk.Label(frame, text="قیمت فعلی: 0.0 USDT", bg='black', fg='gold')
lbl_current_price.pack()

# جدول تاریخچه معاملات
columns = ('زمان', 'عملیات', 'قیمت', 'مقدار')
tree = ttk.Treeview(root, columns=columns, show='headings', height=10)
for col in columns:
    tree.heading(col, text=col)
tree.pack(pady=20)

# جدول لاگ معاملات
columns_log = ('زمان', 'نوع', 'قیمت', 'مقدار', 'سود/زیان')
tree_log = ttk.Treeview(root, columns=columns_log, show='headings', height=10)
for col in columns_log:
    tree_log.heading(col, text=col)
tree_log.pack(pady=5)

# دکمه برای اجرای معامله
btn_trade = tk.Button(root, text="اجرا معامله", command=execute_trade, bg='gold', fg='black')
btn_trade.pack(pady=10)

# ایجاد گراف
fig, ax = plt.subplots(figsize=(6, 3), facecolor='black')
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack()

def update_graph():
    ax.clear()
    ax.plot(prices, color='gold', label='قیمت Shiba/USDT')
    ax.set_title('گراف قیمت Shiba/USDT')
    ax.set_xlabel('زمان')
    ax.set_ylabel('قیمت در USDT')
    ax.legend()
    canvas.draw()

# تابع برای به‌روزرسانی قیمت
def update_price():
    current_price = get_live_price()
    
    # بررسی قیمت معتبر
    if current_price is None:
        alert_user("Unable to retrieve current price. Please check connection or API.")
        return

    prices.append(current_price)
    lbl_current_price.config(text=f"قیمت فعلی: {current_price:.6f} USDT")
    
    new_row = pd.DataFrame({'close': [current_price]})
    global price_data
    price_data = pd.concat([price_data, new_row], ignore_index=True)
    
    if len(price_data) >= 10:
        calculate_signals(price_data)
    
    update_graph()
    root.after(5000, update_price)  # هر 5 ثانیه قیمت به‌روز می‌شود

# شروع به‌روزرسانی قیمت
update_price()

# اجرای برنامه
root.mainloop()


از api کوکوین استفاده کن بجای ال بنک و تست رو هم روی کوکوین انجام بده