В текущей реализации код начинает отслеживать сессию и ведет отсчет времени только после первого выполненного заказа на покупку через функцию buy. Таким образом, session_start_time устанавливается в момент, когда выполняется первая покупка. Однако, если вы хотите, чтобы бот начинал торговлю (и, например, отсчитывал таймер) сразу после нажатия на кнопку “Торговать”, а не только при выполнении первой сделки, вот что нужно сделать:

1. Инициализировать session_start_time при начале работы торгового бота (то есть, при нажатии кнопки “Торговать”).
2. Показать визуально, что торговля активна, например, путем изменения текста кнопки или добавления индикатора.

Вот как это может быть изменено в коде:

import tkinter as tk
from tkinter import messagebox
import ccxt
import logging
from datetime import datetime

# Логирование
logging.basicConfig(filename=‘trading_bot.log’, level=logging.INFO)

# Инициализация биржи MEXC
exchange = ccxt.mexc({
    ‘apiKey’: ‘YOUR_MEXC_API_KEY’,  # Замените на ваш API ключ
    ‘secret’: ‘YOUR_MEXC_SECRET_KEY’,  # Замените на ваш секретный ключ
})

# Проверка подключения к бирже
def check_connection():
    try:
        exchange.fetch_time()
        return True
    except Exception as e:
        logging.error(“Ошибка подключения к бирже: %s”, e)
        return False

connected = check_connection()

# Загрузка доступных рынков
try:
    markets = exchange.load_markets()
    symbols = list(markets.keys())
    logging.info(f"Загружено {len(symbols)} символов")
except Exception as e:
    logging.error(“Ошибка при загрузке рынков: %s”, e)
    messagebox.showerror(“Ошибка”, “Не удалось загрузить рынки с биржи - проверьте подключение к сети или конфигурацию API.”)
    symbols = []

# Глобальные переменные для отслеживания сделок и прибыли
open_positions = []
session_profit = 0.0
session_start_time = None
trading_active = False

# Список для отслеживания операций
trade_history = []

# Функция фильтрации символов
def filter_symbols():
    search_text = entry_search.get().lower()
    filtered_symbols = [symbol for symbol in symbols if search_text in symbol.lower()]
    menu = symbol_menu[‘menu’]
    menu.delete(0, ‘end’)
    for symbol in filtered_symbols:
        menu.add_command(label=symbol, command=lambda value=symbol: selected_symbol.set(value) or update_units())
    if filtered_symbols:
        selected_symbol.set(filtered_symbols[0])
        update_units()

# Обновление доступных единиц торговли
def update_units():
    symbol = selected_symbol.get()
    base, quote = symbol.split(‘/’)
    unit_menu[‘menu’].delete(0, ‘end’)
    unit_menu[‘menu’].add_command(label=base, command=lambda value=base: selected_unit.set(value))
    unit_menu[‘menu’].add_command(label=quote, command=lambda value=quote: selected_unit.set(value))
    selected_unit.set(base)

# Обновление существенных переменных и интерфейса
def update_ui():
    # Обновляем текущую цену
    symbol = selected_symbol.get()
    current_price = get_current_price(symbol)
    if current_price:
        label_current_price.config(text=f"Текущая цена: {current_price:.2f}“)

    # Обновляем таймер сессии
    if session_start_time:
        elapsed_time = datetime.now() - session_start_time
        label_session_time.config(text=f"Время сессии: {str(elapsed_time).split(‘.’)[0]}”)
    
    # Обновляем состояние подключения
    connection_status.config(bg=“green” if connected else “red”)

    root.after(5000, update_ui)  # Обновляем каждые 5 секунд

# Получение цены
def get_current_price(symbol):
    try:
        ticker = exchange.fetch_ticker(symbol)
        return ticker[‘last’]
    except Exception as e:
        logging.error(“Ошибка при получении текущей цены: %s”, e)
        return None

# Покупка
def buy(symbol, amount):
    global session_profit
    try:
        order = exchange.create_market_buy_order(symbol, amount)
        logging.info(“Покупка: %s”, order)
        open_positions.append(order)
        log_trade(‘buy’, order)
    except Exception as e:
        logging.error(“Ошибка покупки: %s”, e)
        messagebox.showerror(“Ошибка”, f"Не удалось купить: {e}“)

# Продажа
def sell(symbol, amount):
    global session_profit
    try:
        order = exchange.create_market_sell_order(symbol, amount)
        logging.info(“Продажа: %s”, order)
        if open_positions:
            last_buy_order = open_positions.pop()
            profit = (order[‘price’] - last_buy_order[‘price’]) * amount
            session_profit += profit
            log_trade(‘sell’, order, profit)
    except Exception as e:
        logging.error(“Ошибка продажи: %s”, e)
        messagebox.showerror(“Ошибка”, f"Не удалось продать: {e}”)

# Логирование сделки
def log_trade(action, order, profit=0):
    trade_info = {
        ‘action’: action,
        ‘symbol’: order[‘symbol’],
        ‘amount’: order[‘amount’],
        ‘price’: order[‘price’],
        ‘timestamp’: datetime.now().strftime(“%Y-%m-%d %H:%M:%S”),
        ‘profit’: profit,
    }
    trade_history.append(trade_info)
    update_trade_history_display()

# Обновление отображения истории торгов
def update_trade_history_display():
    text_history.delete(1.0, tk.END)
    for trade in trade_history:
        text_history.insert(tk.END, f"{trade[‘timestamp’]} {trade[‘action’].upper()} {trade[‘amount’]} {trade[‘symbol’]} @ {trade[‘price’]} Profit: {trade[‘profit’]}\n")

# Функция запуска операций
def execute_trade():
    global session_profit, session_start_time, trading_active
    try:
        if not trading_active:
            trading_active = True
            session_start_time = datetime.now()
            button_trade.config(text=“Торговля активна”)

        symbol = selected_symbol.get()
        amount = float(entry_amount.get())
        dip_threshold = float(entry_dip.get()) / 100  # перевод в доли
        rise_threshold = float(entry_rise.get()) / 100  # перевод в доли

        current_price = get_current_price(symbol)
        if current_price is None:
            return

        # Сохранение и инициализация метки предыдущей цены
        if not hasattr(execute_trade, “previous_price”):
            execute_trade.previous_price = current_price

        # Покупка при просадке
        if current_price <= execute_trade.previous_price * (1 - dip_threshold):
            buy(symbol, amount)
            execute_trade.previous_price = current_price

        # Продажа при росте
        elif current_price >= execute_trade.previous_price * (1 + rise_threshold):
            sell(symbol, amount)
            execute_trade.previous_price = current_price

        # Обновление информации
        label_positions.config(text=f"Открытых сделок: {len(open_positions)}“)
        label_profit.config(text=f"Прибыль сессии: {session_profit:.2f}”)

    except ValueError:
        messagebox.showerror(“Ошибка”, “Некорректный ввод. Убедитесь, что все значения заданы корректно.”)

# Создание интерфейса
root = tk.Tk()
root.title(“MEXC Trading Bot”)

# Добавляем поле для поиска торговой пары
label_search = tk.Label(root, text=‘Поиск символа:’)
label_search.pack()
entry_search = tk.Entry(root)
entry_search.pack()
entry_search.bind(‘<KeyRelease>’, lambda event: filter_symbols())

# Выбор символа
label_symbol = tk.Label(root, text=‘Символ:’)
label_symbol.pack()

selected_symbol = tk.StringVar(root)
if symbols:
    selected_symbol.set(symbols[0])  # Установка значения по умолчанию
    symbol_menu = tk.OptionMenu(root, selected_symbol, *symbols, command=lambda _: update_units())
    symbol_menu.pack()
else:
    messagebox.showerror(“Ошибка”, “Список символов пуст. Проверьте соединение с биржей.”)

# Выбор единицы торговли
label_unit = tk.Label(root, text=‘Торговая единица:’)
label_unit.pack()
selected_unit = tk.StringVar(root)
unit_menu = tk.OptionMenu(root, selected_unit, “”)
unit_menu.pack()

# Ввод количества
label_amount = tk.Label(root, text=‘Количество:’)
label_amount.pack()
entry_amount = tk.Entry(root)
entry_amount.pack()
entry_amount.insert(tk.END, ‘0.001’)  # Значение по умолчанию

# Ввод порога для покупки при просадке
label_dip = tk.Label(root, text=‘Покупка при просадке (%):’)
label_dip.pack()
entry_dip = tk.Entry(root)
entry_dip.pack()
entry_dip.insert(tk.END, ‘0.5’)  # Значение по умолчанию

# Ввод порога для продажи при росте
label_rise = tk.Label(root, text=‘Продажа при росте (%):’)
label_rise.pack()
entry_rise = tk.Entry(root)
entry_rise.pack()
entry_rise.insert(tk.END, ‘1’)  # Значение по умолчанию

# Кнопка для начала торговли
button_trade = tk.Button(root, text=“Начать торговлю”, command=execute_trade)
button_trade.pack()

# Метки для отображения информации
label_current_price = tk.Label(root, text="Текущая цена: ")
label_current_price.pack()

label_positions = tk.Label(root, text=“Открытых сделок: 0”)
label_positions.pack()

label_profit = tk.Label(root, text=“Прибыль сессии: 0.00”)
label_profit.pack()

label_session_time = tk.Label(root, text=“Время сессии: 00:00:00”)
label_session_time.pack()

# Текстовое поле для отображения истории торгов
text_history = tk.Text(root, height=10, width=50)
text_history.pack()

# Индикатор подключения
connection_status = tk.Label(root, text=“Статус подключения”, width=20, bg=“red”)
connection_status.pack(anchor=‘se’)

# Запуск обновления интерфейса
update_ui()

root.mainloop()


### Примечания:
- Инициализация торговли: В execute_trade, проверяется, активна ли торговля. При первом запуске (при нажатии кнопки), торговля активируется, и начинается отсчет времени сессии.

- Визуальное подтверждение: Кнопка “Начать торговлю” обновляется текстом “Торговля активна”, что дает визуальную индикацию активации торгового бота. Вы также можете добавить другие визуальные индикаторы или уведомления.

Соблюдайте осторожность при изменении функциональности торгового бота, чтобы избежать случайных транзакций или потерь на реальном аккаунте. Проверьте функциональность в тестовой среде или используйте простые проверки для тестирования.
Добавь функцию пауза в бота и её отображение, так же я хочу чтобы бот выкупал каждую просадку от цены старта и проддавал этот же ордер на заданную величину, так же делать покупку новую если цена отрастёт до продажи ордера а потом снова упадёт на заданное значение от цены продажи ордера её откупить тоже. Добавь еще одно поле рядом с боку с полем с историей ордеров, но это поле будет с ткрытыми ордерами и нужна кнопка подсвеченная для немедленного закрытия ордера по рынку. Так же к открытым ордерам добавь информацию о текущей прибыли или убытке которая так же обновляется. Закрытые ордера должны содержать в себе так же информацию а прибыли убытке, дату создания закрытия,количестве. Так же логируй ордера в exel таблицу, подсвети прибыль убыток, делай итого месячно (такие как оборот, и общая прибыль и колво сделок)