from smolagents import CodeAgent, DuckDuckGoSearchTool, HfApiModel, load_tool, tool import datetime import requests import pytz import yaml from tools.final_answer import FinalAnswerTool from Gradio_UI import GradioUI @tool def analyze_ichimoku_signal(prices_close: list, high_prices: list, low_prices: list) -> str: """Инструмент для технического анализа по системе Ichimoku Cloud. Анализирует TK Zone, положение цены и будущее облако для выдачи торгового вердикта. Args: prices_close: Список цен закрытия (нужно минимум 52 периода). high_prices: Список максимальных цен за те же периоды. low_prices: Список минимальных цен за те же периоды. """ if len(prices_close) < 52: return "Ошибка: Недостаточно данных. Требуется минимум 52 свечи для корректного расчета." # Функция расчета средней цены за период def get_mid(h, l, p): return (max(h[-p:]) + min(l[-p:])) / 2 # Текущие показатели tenkan = get_mid(high_prices, low_prices, 9) kijun = get_mid(high_prices, low_prices, 26) current_price = prices_close[-1] # Будущее облако (проекция на текущий момент) span_a = (tenkan + kijun) / 2 span_b = get_mid(high_prices, low_prices, 52) kumo_bullish = span_a > span_b # Анализ зон in_tk_zone = min(tenkan, kijun) <= current_price <= max(tenkan, kijun) # Формирование вердикта if current_price > max(tenkan, kijun) and kumo_bullish: verdict = "🚀 LONG: Цена выше TK Zone, Облако бычье. Импульс подтвержден." elif current_price < min(tenkan, kijun) and not kumo_bullish: verdict = "📉 SHORT: Цена ниже TK Zone, Облако медвежье. Давление продавцов." elif in_tk_zone: verdict = "⏳ NEUTRAL: Цена в зоне равновесия (TK Zone). Ожидаем выхода." else: verdict = "🤔 MIXED: Сигналы противоречат друг другу. Рекомендуется наблюдение." return f"Анализ Ichimoku: Цена={current_price}, Tenkan={tenkan:.2f}, Kijun={kijun:.2f}. Вердикт: {verdict}" @tool def get_current_time_in_timezone(timezone: str) -> str: """A tool that fetches the current local time in a specified timezone. Args: timezone: A string representing a valid timezone (e.g., 'America/New_York'). """ try: tz = pytz.timezone(timezone) local_time = datetime.datetime.now(tz).strftime("%Y-%m-%d %H:%M:%S") return f"The current local time in {timezone} is: {local_time}" except Exception as e: return f"Error fetching time for timezone '{timezone}': {str(e)}" final_answer = FinalAnswerTool() # Модель Qwen2.5-Coder отлично подходит для исполнения логики инструментов model = HfApiModel( max_tokens=2096, temperature=0.5, model_id='Qwen/Qwen2.5-Coder-32B-Instruct', custom_role_conversions=None, ) # Загрузка шаблонов промптов try: with open("prompts.yaml", 'r') as stream: prompt_templates = yaml.safe_load(stream) except FileNotFoundError: prompt_templates = None # Если файла нет, агент использует стандартные # Создание агента с регистрацией всех инструментов agent = CodeAgent( model=model, tools=[final_answer, analyze_ichimoku_signal, get_current_time_in_timezone], max_steps=6, verbosity_level=1, prompt_templates=prompt_templates ) # Запуск интерфейса if __name__ == "__main__": GradioUI(agent).launch()