preview
Python + API LLM + MetaTrader 5: реальный опыт построения автономного торгового бота

Python + API LLM + MetaTrader 5: реальный опыт построения автономного торгового бота

MetaTrader 5Трейдинг |
1 247 9
Oleg Doykov
Oleg Doykov

Введение

Большинство трейдеров и не подозревают, что ИИ способен:

  • находить уровни,
  • определять свечные модели,
  • распознавать тренды,
  • сравнивать прошлые участки графика,
  • давать осознанные выводы,
  • анализировать несколько таймфреймов,
  • исправлять собственные ошибки при оптимизации промпта.

Это не индикатор и не алгоритм. Это интеллектуальная надстройка, которую можно научить вашей личной торговой системе.

И самое главное — её не нужно обучать программированию. Она понимает обычный человеческий язык.


Что такое LLM и почему они меняют подход к анализу данных

Современные Большие Языковые Модели (LLM, Large Language Model) такие, как ChatGPT, DeepSeek и им подобные, стали универсальными помощниками в самых разных сферах человеческой деятельности. Их успех основан на способности обрабатывать огромные массивы текстовой информации и генерировать осмысленные ответы на самые разные запросы.

LLM отлично выступают в роли консультантов, благодаря своему широкому кругозору и доступу к актуальным знаниям. Они могут помогать в планировании, решении практических задач, предоставлять рекомендации по бизнесу, образованию, праву и многому другому.

В программировании и технических дисциплинах такие модели служат инструментом для написания, отладки и оптимизации кода. Они ускоряют процесс обучения новичков и помогают экспертам решать сложные задачи, предлагая готовые решения и разъяснения.

Кроме того, LLM все чаще внедряются в реальные сервисы и устройства: виртуальные ассистенты, чат-боты для поддержки клиентов, интеллектуальные системы поиска и анализа данных, генерацию контента, автоматизацию рутинных процессов. Это сокращает время и усилия, необходимые людям для получения информации и выполнения различных задач.

Таким образом, большие языковые модели становятся многофункциональным инструментом, который помогает человеку лучше ориентироваться в сложном информационном пространстве и эффективнее взаимодействовать с миром.

Могут ли Большие Языковые Модели самостоятельно анализировать рынок, принимать обоснованные решения и тем самым снижать влияние эмоций при торговле на финансовых, фондовых и криптовалютных рынках?

Я исследую эту возможность, используя связку Python + MetaTrader 5 + API LLM.

Скрипт работает автономно, без участия трейдера: сам анализирует рынок и принимает решение входить в позицию или оставаться вне рынка.


Аппаратные требования

Я использовал компьютер с Windows 10 и Python версии 3.10.11. Благодаря API, вычисления выполняются на стороне сервера, поэтому мощный компьютер с GPU не требуется. Систему можно запустить на CPU с минимальными требованиями к "железу", а по API доступны самые мощные языковые модели. Считаю это конкурентным преимуществом.

Кроме того нам понадобится:

  • MetaTrader 5 — торговый терминал для получения рыночных данных и исполнения сделок;
  • LLM через API OpenRouter — "мозг" системы, анализирующий графики и генерирующий торговые сигналы.


Что такое LLM и почему она становится "мозгом" торговой системы

Современные большие языковые модели (LLM) — ChatGPT, DeepSeek, Claude, Gemini и другие — обычно воспринимаются как обычные чат-боты. Мы привыкли спрашивать у них советы, просить написать текст или объяснить сложную идею. Но важно понять: внутри это не чат-боты, а мощные системы анализа данных, которые могут изучать информацию, делать выводы и даже принимать решения. В контексте автоматической торговли именно LLM становится мозгом всей системы. Объясним просто.

1. LLM действительно анализирует рынок

Когда скрипт получает данные из MetaTrader 5 (свечи OHLCV), он отправляет их модели через API. LLM видит рынок не глазами, а в виде таблицы чисел, и для анализа это даже удобнее.

Когда модель получает набор OHLCV-данных, она моментально понимает общую структуру движения цены, замечает, где формируются ключевые уровни поддержки и сопротивления, распознаёт свечные модели, определяет направленность тренда, различает импульсы и коррекции, а также фиксирует моменты ложных пробоев.

То есть делает то, что делает трейдер вручную… но автоматически и без эмоций.

2. API OpenRouter — это мост между Python и ИИ

LLM работает не на вашем компьютере, а на удалённых мощных серверах, и доступ к ней осуществляется через OpenRouter. Этот сервис выступает чем-то вроде транспортной системы: скрипт отправляет запрос, OpenRouter передаёт его выбранной модели, получает ответ и возвращает его назад в программу.

Такой подход даёт важные преимущества. Система не требует от трейдера сильного компьютера — вся тяжёлая обработка выполняется в облаке. Через OpenRouter можно подключиться к сотням разных моделей, в любой момент переключиться на другую буквально одной строкой в коде и использовать самые современные и продвинутые решения, которые обычно недоступны локально.

По сути, трейдер получает возможность встроить интеллект мирового уровня прямо в свою торговую систему, не заботясь об аппаратных ограничениях.

3. Почему LLM называют "мозгом"

В классических роботах логика жёстко прописана в коде:

«если цена X больше Y — сделать Z».

Здесь всё иначе.

LLM не просто сравнивает цифры, а размышляет, интерпретирует, оценивает вероятности, ищет закономерности, формирует стратегическое решение. То есть в системе нет “жёстких правил” — есть искусственный трейдер, который просматривает данные, оценивает контекст, принимает решение и объясняет, почему сделал именно так.

Это делает систему гибкой — вы можете менять стратегию простым изменением текста промпта, а не переписыванием кода.

4. LLM сама генерирует торговые сигналы

После анализа модель возвращает конкретику:

ACTION: BUY  
ENTRY_PRICE: 1.08530  
SL: 1.08380  
TP: 1.08890  
REASON: Bullish pin bar at support + H1 trend up.  

Это полноценный торговый сигнал с указанием направления сделки, логикой принятия решения, стоп-лоссом, тек-профитом, ценой входа и объяснением.

Фактически LLM выступает как внутренний аналитик, который не устает, не ошибается от стресса и не нарушает дисциплину.


Структура проекта

Скачайте ZIP-архив и распакуйте в удобную папку. Вы получите три файла:

LLM-trader-mvp/
├── .env
├── requirements.txt
└── run_mvp.py



Как работает скрипт

Пайплайн работы:

  1. получить котировки из терминала MetaTrader 5;
  2. сформировать промпт и передать его по API в LLM;
  3. получить ответ LLM с анализом;
  4. извлечь значения для открытия ордера или бездействия;
  5. открыть ордер или ждать;
  6. повторить цикл.

Шаг 1: Подключение к терминалу MetaTrader 5

Скрипт подключается к терминалу MetaTrader 5 через официальную библиотеку MetaTrader 5:

# Функция для подключения к MT5
def connect_to_mt5():
    try:
        if not mt5.initialize():
            logging.error("MT5 initialize() failed")
            raise Exception("Failed to initialize MT5")
        # Если нужно, добавьте mt5.login(login=your_login, password=your_password, server=your_server)
        # Для демо-аккаунта это может не требоваться, но проверьте в терминале
        logging.info("Successfully connected to MT5")
    except Exception as e:
        logging.error(f"Connection error: {e}")
        raise

Эта функция позволяет получать реальные рыночные данные и размещать ордера напрямую из скрипта Python. С появлением специализированной python-библиотеки, значительно расширился функционал платформы. При этом остается возможность в ручном режиме управлять позицией, перемещать стоп-лосс и тейк-профит, закрывать сделки, включать трейлинг-стоп, смотреть статистику. В общем и целом пользоваться всеми "прелестями" современной торговой платформы.

Шаг 2: Получение данных OHLCV

Скрипт запрашивает исторические данные (Open, High, Low, Close, Volume) за последние 100 баров:

# Функция для получения OHLCV данных
def get_ohlcv(symbol, timeframe, count=100):
    try:
        rates = mt5.copy_rates_from_pos(symbol, timeframe, 0, count)
        if rates is None:
            logging.error("Failed to get OHLCV data")
            return None
        df = pd.DataFrame(rates)
        df['time'] = pd.to_datetime(df['time'], unit='s')  # Конвертируем время в datetime
        logging.info(f"Retrieved {len(df)} bars for {symbol}")
        return df[['time', 'open', 'high', 'low', 'close', 'tick_volume']]  # Используем tick_volume как объем
    except Exception as e:
        logging.error(f"Error getting OHLCV: {e}")
        return None

Эти данные представляют "картину" рынка для анализа LLM. Данная реализация не включает показатели индикаторов, новости и другую информацию рыночной активности. Возможно стоит подумать, какие дополнительные данные помогут улучшить качество анализа.

Шаг 3: Анализ с помощью LLM

Самая интересная часть — отправка данных языковой модели для анализа:

# Функция для анализа данных с помощью OpenRouter LLM
def analyze_with_llm(api_key, ohlcv_df):
    try:
        client = OpenAI(
            base_url="https://openrouter.ai/api/v1",
            api_key=api_key
        )
        
        # Формируем промпт на основе стратегии (без строгих ограничений на формат, чтобы позволить рассуждения)
        prompt = """
        Ты - внутридневной трейдер, торгуешь и на основе уровней поддержки и сопротивления и паттернов Price Action.
        Анализируй предоставленные OHLCV данные (time, open, high, low, close, volume).
        Шаги анализа:
        1. Определи ключевые уровни поддержки и сопротивления (локальные max/min за последние 50 баров).
        2. На уоровнях ищи свечные паттерны Price Action.
        3. Если обнаружен bearish signal, рекомендуй SELL.
           Если обнаружен bullish signal, рекомендуй BUY.
           Иначе - HOLD.
        4. Для сигнала укажи предполагаемый SL (за экстремум) и TP (1:2 риск/прибыль от ENTRY_PRICE).
        
        Данные в CSV формате:
        {}
        
        Ответ в формате:
        ACTION: BUY/SELL/HOLD
        ENTRY_PRICE: цена входа
        SL: стоп-лосс
        TP: тейк-профит
        REASON: краткое объяснение
        """.format(ohlcv_df.to_csv(index=False))  # Преобразуем DF в CSV для промпта
        
        completion = client.chat.completions.create(
            extra_headers={
                "HTTP-Referer": "https://www.mql5.com/ru/users/baxter_by", # Optional. Site URL for rankings on openrouter.ai.
                "X-Title": "LLM-trader-mvp", # Optional. Site title for rankings on openrouter.ai.
            },
            extra_body={},
            # model="google/gemma-3-27b-it:free",
            model="tngtech/deepseek-r1t2-chimera:free",
            # model="tngtech/deepseek-r1t-chimera:free",
            # model="deepseek/deepseek-chat-v3-0324:free",
            messages=[
                {
                    "role": "user",
                    "content": prompt
                }
            ]
        )
        
        result = completion.choices[0].message.content.strip()
        logging.info(f"LLM response: {result}")
        
        # Robust парсинг с regex (ищет ключи независимо от порядка и лишнего текста)
        action_match = re.search(r'ACTION:\s*(BUY|SELL|HOLD)', result, re.IGNORECASE)
        entry_match = re.search(r'ENTRY_PRICE:\s*([\d.]+)', result, re.IGNORECASE)
        sl_match = re.search(r'SL:\s*([\d.]+)', result, re.IGNORECASE)
        tp_match = re.search(r'TP:\s*([\d.]+)', result, re.IGNORECASE)
        reason_match = re.search(r'REASON:\s*(.*)', result, re.IGNORECASE)
        
        action = action_match.group(1).upper() if action_match else 'HOLD'
        entry = float(entry_match.group(1)) if entry_match else 0.0
        sl = float(sl_match.group(1)) if sl_match else 0.0
        tp = float(tp_match.group(1)) if tp_match else 0.0
        reason = reason_match.group(1).strip() if reason_match else 'No reason provided'
        
        # Валидация: если action BUY/SELL, но цены нулевые - fallback на HOLD
        if action in ['BUY', 'SELL'] and (entry == 0 or sl == 0 or tp == 0):
            action = 'HOLD'
            reason = 'Invalid signal parameters'
        
        logging.info(f"Parsed signal: {action}, Entry: {entry}, SL: {sl}, TP: {tp}, Reason: {reason}")
        
        return {'action': action, 'entry': entry, 'sl': sl, 'tp': tp, 'reason': reason}
    except Exception as e:
        logging.error(f"LLM analysis error: {e}")
        return {'action': 'HOLD', 'reason': 'Analysis failed'}

Важно: в функции есть строка с указанием модели LLM, например:

model="deepseek/deepseek-chat-v3-0324:free"

Для качественного анализа лучше использовать более мощные модели, которые обучены на больших массивах данных, благодаря чему обеспечивают высокую точность и детализацию ответов. Список моделей можно найти на https://openrouter.ai/models

По ключевому слову 'free' есть бесплатные модели. Подходят для экспериментов, с невысокими требованиями по скорости и точности, такие модели имеют лимиты и часто возвращают ошибки.

  • В тексте промпта есть фигурные скобки '{}'. При внесении изменений в текст не удаляйте их, именно туда приходит рыночная информация полученная из терминала.
  • Использование регулярных выражений (робастный парсинг) для извлечения данных из ответа LLM гарантирует работу даже при нестандартном форматировании ответа LLM.

Почему это работает. Современные LLM построены на архитектуре трансформеров, которая отлично справляется с выявлением сложных закономерностей и контекстных взаимосвязей в данных. Обучаясь на огромных массивах данных, включая финансовые отчёты, аналитические обзоры, различные стратегии торговли, исторические котировки и обсуждения рынков, модель натренирована распознавать типичные шаблоны поведения цен, сигналы технического анализа. 

Шаг 4: Размещение ордера

Если LLM генерирует сигнал BUY или SELL, скрипт автоматически размещает рыночный ордер:

# Функция для размещения ордера
def place_order(symbol, action, volume, entry, sl, tp, deviation=20, magic=234000, comment="LLM-trader"):
    """
    Размещение торгового ордера с улучшенной обработкой ошибок и актуальными ценами
    
    Args:
        symbol: Торговый инструмент
        action: Тип действия ('BUY' или 'SELL')
        volume: Объем лота
        entry: Цена входа
        sl: Стоп-лосс
        tp: Тейк-профит
        deviation: Максимальное отклонение цены
        magic: "Магический" номер для идентификации ордера
        comment: Комментарий к ордеру
    """
    print('place_order')

    # Получаем актуальные данные по символу
    symbol_info = get_symbol_info(symbol)
    if symbol_info is None:
        return False

    # Получаем текущую цену непосредственно перед отправкой ордера
    tick = mt5.symbol_info_tick(symbol)
    if tick is None:
        logging.error(f"Failed to get tick data for {symbol}")
        return False

    # Устанавливаем цену в зависимости от типа ордера
    order_type = mt5.ORDER_TYPE_BUY if action == 'BUY' else mt5.ORDER_TYPE_SELL
    if order_type == mt5.ORDER_TYPE_BUY:
        price = tick.ask
        # Для ордера на покупку корректируем SL и TP если они заданы
        sl_price = sl if sl > 0 else 0.0
        tp_price = tp if tp > 0 else 0.0
    elif order_type == mt5.ORDER_TYPE_SELL:
        price = tick.bid
        # Для ордера на продажу корректируем SL и TP если они заданы
        sl_price = sl if sl > 0 else 0.0
        tp_price = tp if tp > 0 else 0.0
    else:
        logging.error(f"Unsupported order type: {action}")
        return False

    # Подготавливаем структуру запроса
    request = {
        "action": mt5.TRADE_ACTION_DEAL,  # Тип операции: немедленное исполнение (рыночный)
        "symbol": symbol,
        "volume": float(volume),
        "type": order_type,
        "price": price,  # Используем актуальную цену
        "sl": sl_price,  # Цена стоп-лосса
        "tp": tp_price,  # Цена тейк-профита
        "deviation": deviation,  # Допустимое отклонение цены в пунктах
        "magic": magic,
        "comment": comment,
        "type_time": mt5.ORDER_TIME_GTC,  # Время действия ордера: Good till cancel
        "type_filling": mt5.ORDER_FILLING_FOK,  # Тип исполнения ордера
    }

    # Отправляем торговый запрос
    result = mt5.order_send(request)

    # Проверяем результат исполнения
    if result.retcode != mt5.TRADE_RETCODE_DONE:
        logging.error(f"Order failed, retcode={result.retcode}, comment={result.comment}")
        # Выводим всю информацию из результата для отладки
        result_dict = result._asdict()
        for field in result_dict.keys():
            logging.error(f"   {field}={result_dict[field]}")
        return False
    else:
        logging.info(f"Order placed successfully: {action} {volume} lots at {price}, SL: {sl_price}, TP: {tp_price}, Ticket: {result.order}")
        # Выводим информацию о результате в виде словаря
        result_dict = result._asdict()
        for field in result_dict.keys():
            logging.info(f"   {field}={result_dict[field]}")
        return True

Ордер включает:

  • стоп-лосс (SL) для ограничения убытков,
  • тейк-профит (TP) для фиксации прибыли,
  • актуальную рыночную цену (Ask для покупки, Bid для продажи).

Для текущей стратегии риск-реворд имеет соотношение 1:2. 

Шаг 5: Мониторинг в реальном времени

Основной цикл запускает анализ каждые N секунд (по умолчанию 300 секунд = 5 минут):

# Основная функция мониторинга
def main_loop(symbol='EURUSD', timeframe=mt5.TIMEFRAME_M5, volume=0.01, api_key='', interval=60, visualize=False):
    connect_to_mt5()
    try:
        while True:
            print('main_loop')
            ohlcv = get_ohlcv(symbol, timeframe)
            if ohlcv is not None:
                signal = analyze_with_llm(api_key, ohlcv)
                if signal['action'] != 'HOLD':
                    place_order(symbol, signal['action'], volume, signal['entry'], signal['sl'], signal['tp'], deviation=20, magic=5115, comment="Liquidity Grab Trade")
                    if visualize:
                        visualize_chart(ohlcv, signal)
                else:
                    logging.info("No signal: HOLD")
            time.sleep(interval)  # Задержка в секундах (e.g., 60 для минуты)
    except KeyboardInterrupt:
        logging.info("Script stopped by user")
    except Exception as e:
        logging.error(f"Main loop error: {e}")
    finally:
        mt5.shutdown()
        logging.info("Disconnected from MT5")

Скрипт работает автономно, постоянно анализируя рынок и реагирует на возможности до тех пор, пока оператор не прервет выполнение из командной строки сочетанием клавиш Ctrl+C.

Дополнительные возможности
  • Логирование: все действия записываются в файл LLM_trader.log с временными метками для последующего анализа.
  • Настройка параметров торговли: блок настроек в конце скрипта. Изменяйте переменные на свое усмотрение.
if __name__ == "__main__":
    SYMBOL = "EURUSD"          # Валютная пара
    TIMEFRAME = mt5.TIMEFRAME_M5   # Таймфрейм (M5 = 5 минут)
    VOLUME = 0.10              # Объем лота (начните с минимального!)
    INTERVAL = 300             # Интервал проверки в секундах (5 минут)
    VISUALIZE = True           # Создавать графики (True/False)
  • Визуализация: опциональная функция visualize_chart() создает график с отмеченными уровнями входа, SL и TP.

chart


Установка и настройка

1. Установка Python для Windows

Скачайте установщик:

  • перейдите на https://www.python.org/downloads/windows/,
  • найдите версию Python 3.10.11 (подойдут и другие версии) и скачайте "Download Windows installer (64-bit)".

Запустите установщик:

  • откройте скачанный файл и запустите установку,
  • обязательно поставьте галочку "Add Python to PATH" — это позволит запускать Python из командной строки,
  • выберите стандартную установку,
  • дождитесь окончания и нажмите "Close".

Проверьте установку: откройте командную строку (cmd) или PowerShell и введите:

python --version

Вы должны увидеть:

Python 3.10.11

Командная строка

2. Получение ключа API OpenRouter

OpenRouter — API-агрегатор для доступа к более чем 300 моделям ИИ через единый интерфейс.

Шаги получения ключа:

  • зарегистрируйтесь на https://openrouter.ai,
  • перейдите в раздел "API Keys" (в меню под аватаром пользователя),
  • нажмите "Create API Key",
  • введите название ключа (например, "TestKey"),
  • нажмите "Create" и сразу скопируйте ключ — он показывается только один раз,
  • сохраните ключ в надежном месте.

    Настройка ключа в проекте:

    • найдите в папке проекта файл .env,
    • откройте его в текстовом редакторе,
    • найдите строку:
      OPENROUTER_API_KEY=your_actual_api_key_here
    • замените your_actual_api_key_here на ваш ключ,
    • сохраните файл.

    3. Подготовка к торговле

    Настройка MetaTrader 5:

    1. убедитесь, что MetaTrader 5 установлен и запущен,
    2. откройте демонстрационный счет и активируйте его,
    3. нажмите кнопку [Алготрейдинг] на панели инструментов:

    button pressed

    Установка зависимостей: откройте командную строку (cmd) или PowerShell и выполните:

    # Перейдите в папку со скриптом
    cd c:\LLM-trader-mvp

    # Установите зависимости (выполняется один раз)
    pip install -r requirements.txt

    Запуск скрипта:

    python run_mvp.py

    Вы увидите сообщения:

    The script is running. To stop, press Ctrl+C.
    Loop

    Поздравляю, скрипт работает! Теперь он:

    • подключился к MetaTrader 5,
    • каждые 5 минут анализирует график EURUSD,
    • записывает результаты в LLM_trader.log,
    • при обнаружении сигнала размещает ордер.

    Остановка скрипта: нажмите Ctrl+C в командной строке.

    Примечание: в дальнейшем run_mvp.py можно запускать двойным кликом, как обычное приложение.

    4. Анализ работы

    Лог-файл LLM_trader.log  сохраняется в папке со скриптом. В нем фиксируются:

    • этапы торговли,
    • ошибки,
    • рассуждения LLM.

    Лог следует внимательно изучать и принимать решения об изменении кода или промпта, для повышения точности анализа и принятия решений.

    Файл легко читается обычным блокнотом windows.


    Что дальше: направления развития

    Улучшение качества анализа

    • Более мощные модели. Как показывают эксперименты, качество анализа и сигналов значительно повышается при использовании более мощных (платных) моделей LLM. Отнеситесь к LLM как к своему сотруднику, возможно ему требуется зарплата. Мне попадались бесплатные модели, которые выдавали правильный анализ, например лонг, но сигнал предлагал как SELL.
    • Уточнение промпта. Это как инструкция вашему трейдеру в вашем личном хедж фонде. Чем точнее вы сформулируете стратегию, тем осознаннее будут сигналы. Промпт должен быть логичным, формулировки точными, не противоречащими друг другу. 
    • Настройка модели. При инициализации модели в коде следует использовать дополнительные параметры, для того чтобы управлять ответами модели:
      • max_tokens — максимальное количество токенов в ответе. Это помогает контролировать длину генерируемого текста.
      • temperature — параметр, который контролирует степень случайности генерируемого текста. Более высокие значения приводят к более случайному тексту, в то время как более низкие значения делают генерацию более детерминированной.
      • n — количество независимых ответов, которые должна сгенерировать модель.
    • Старшие таймфреймы. Анализ H1, H4, D1 вероятно повысит качество сигналов.
    • Мультифреймовый анализ. А что если в промпт передавать информацию не только одного тамфрейма? Например, пусть на старшем таймфрйме определяет тренд и уровни, а на младшем ищет свечные паттерны.  

    Оптимизация работы

    Как следует из моих наблюдений, при каждой итерации LLM анализирует рынок так, как будто видит впервые. Поэтому даже когда сделка открыта, модель может выдавать сигналы на открытие позиции. Есть несколько вариантов решения:

    • можно передавать в промпт дополнительную информацию о текущих открытых ордерах, типа "Сейчас сделка открыта, сопровождай позицию";
    • можно ограничить количество одновременно открытых ордеров программно, на уровне кода.

      Система не подходит для скальпинга и высокочастотной торговли. В зависимости от модели и линии связи, возможны значительные задержки между запросом по API, обработкой запроса на стороне сервера и ответом, поступающим в систему. Это надо учитывать при разработке стратегии.

      Отправлять запрос на анализ нужно сразу после закрытия свечи. Закрытие периода — тот момент, когда следует принимать решение.

      Профессиональная разработка

      Разработчику потребуется Интегрированная среда разработки (IDE) типа Visual Studio Code или PyCharmдля написания, отладки и тестирования кода. 


      Заключение

      Подход демонстрирует концепцию использования API LLM для автоматической торговли на рынках. Проект находится на ранней стадии и требует доработки перед использованием на реальных счетах.

      Следует подумать о способах тестирования системы и стратегии перед началом торговли на "боевом" счете. Скорее всего придется запускать систему на продолжительный период онлайн, собирать статистику и по результатам делать выводы. Широкий простор для экспериментов!

      Приглашаю к конструктивному обсуждению в комментариях.


      Disclaimer

      Представленный скрипт — это минимально работающий продукт (MVP), прототип для демонстрации концепции. НЕ используйте этот скрипт для торговли на реальном счете! Примитивный промпт и таймфрейм M5 выбраны в демонстрационных целях для быстрого получения сигналов.

      Торговля на финансовых рынках несет высокие риски. Автор не несет ответственности за финансовые потери, возникшие в результате использования представленного кода. Используйте только на демо-счетах для обучения и тестирования.

      Прикрепленные файлы |
      LLM-trader-mvp.zip (5.62 KB)
      Последние комментарии | Перейти к обсуждению на форуме трейдеров (9)
      Oleg Doykov
      Oleg Doykov | 28 нояб. 2025 в 07:28
      Stanislav Korotky #:
      В обсуждении другой статьи (где модель скачивается и запускается локально), где было и ваше участие, я приводил ссылку на сравнительное исследование общих языковых моделей (которые на таймсериях не обучались) и обученных целенаправленно на таймсериях. Результат не в пользу больших языковых моделей.

      Станислав, спасибо за статью, нашел, очень полезно. Как то пропустил, видимо поленился переводить.


      В это статье исследуется проблема классического прогнозирования временных рядов. Временные ряды это определенный, узкий сектор для решения задач трейдинга. 

      Авторы приходят к выводу, что для классического прогнозирования временных рядов LLM сейчас почти не дают пользы по качеству, при этом сильно увеличивают вычислительные затраты, и тот же уровень (или лучше) можно получить гораздо более простыми архитектурами без языковой модели.

      Однако авторы так же считают, что LLM стоит использовать не для “голого” прогноза временных рядов, а там, где вместе с рядами есть текстовый контекст и нужны рассуждения на естественном языке.
      Мультимодальные задачи “тайм-серии + текст”: когда модель должна учитывать новости, описания событий, социальный контекст, текстовые инструкции и т.п. (time series reasoning, social understanding, financial reasoning). 

      Прямо на первой странице:


      time series reasoning

      Перевод:

      На самом деле, недавние работы указывают на множество интересных и многообещающих способов взаимодействия языка и временных рядов, таких как рассуждения о временных рядах [25, 7, 45, 42, 37], социальное понимание [6] и финансовые рассуждения [36, 20].

      Я как раз про это, про мультимодальность.

      Моя гипотеза состоит в том, что Современная LLM самодостаточный “организм” который “знает все”, в том числе и трейдинг. 
      Задача - сузить “картину мира” языковой модели для решения определенной задачи. Воспитать трейдера.
      Да, выглядит как “из пушки по воробьям”. 

      Stanislav Korotky #:
      Из моего общения с общими LLM следует, что они очень любят приврать в фактической части ответа, особенно связанной с числовыми показателями.

      О да. Здесь есть на чем подумать. Выбрать подходящую модель, сформулировать стратегию в промпте, поставить в рамки, не простая задача. Обычно модели из лидербордов дают адекватнее ответы. Осмысленно анализируют и принимают решения.

      Соглашусь с комментарием:

      Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

      Обсуждение статьи "Быстрая интеграция большой языковой модели и MetaTrader 5 (Часть I): Создаем модель"

      Edgar Akhmadeev, 2025.11.13 00:33

      Я начал разрабатывать эту тему не так давно. OpenAI API пишу на чистом MQL5. И сервер для модели - llama.cpp.

      Надо модели давать максимально математически чёткие инструкции, требовать чётких ответов, без воды. Снижать температуру до предела (0-0.2), чтобы не фантазировала. Выбирать максимально большие локальные модели, какие тянет система (на моём VRAM 12 Gb - до 15B, а с небольшим замедлением - до 30B). Тестировать и выбирать лучшую (а их очень много). Пока занимаешься этим, идёт прогресс в моделях, появляются маленькие умные модели. Затем можно дообучать модель (LoRA). Если, не дай бог, появится подозрение на потенциальную прибыльность проекта, можно перейти на платные большие онлайн-модели. Или хотя бы сделать апгрейд компьютера на 2 GPU с 24 Gb и много памяти.

      Работы - выше крыши. Посмотрим. Пробуем работать с моделями, учитывая их милые особенности.



      Oleg Doykov
      Oleg Doykov | 28 нояб. 2025 в 08:08
      Yevgeniy Koshtenko #:
      Здравствуйте. Скоро выйдет моя статья про файтюн локальной Ollama на 1000 сделках. Удивительно, но результаты на синтетических искусственных сэмплах идеальных сделок в разы лучше, чем на настоящих реальных сделках. 

      Также будет третья часть - с заменой встроенной модели на собственную доработанную для финансов архитектуру языкового трансформера. 

      В целом они неплохо торгуют, с галлюцинациями борюсь снижением температуры и ещё делаю версию с новой фичей MIT для языковых моделей - SEAL, когда делается самообучающийся пайплайн,  и прямо через инструкции в запросах к модели идет доообучение, длина контекста немного мешает, но зато в контексте можно хранить сжатый опыт сети - требуя его из её же ответов. LoRa адаптер также можно включить и дообучить именно на финансовых данных. Опять же - сильно мешает необходимость крутого железа для больших моделей... 

      Еще классно идет Грок 4.1 в версии с 1 млн. токенов контекста, вот это отличный размер окна, туда можно загрузить кучу сделок и данных, вопрос упирается в стоимость токенов, недешевое это удовольствие) 

      Интересное исследование. С нетерпением жду продолжения сезона )). 

      Датасет с искусственными сделками, что то новенькое.

      Токены vs Железо.

      [Удален] | 28 нояб. 2025 в 11:09
      Кто бы написал хороший бектестер под ллмовские апи, а то пока что непонятно что обсуждать :)
      Edgar Akhmadeev
      Edgar Akhmadeev | 28 нояб. 2025 в 11:43
      Maxim Dmitrievsky #:
      Кто бы написал хороший бектестер под ллмовские апи, а то пока что непонятно что обсуждать :)
      До тестера рано или поздно дело дойдёт, но работать он будет почти в реальном времени. С моим железом на минутках анализ проходит за 12-13 сек. При скорости 19.25 tps.
      Stanislav Korotky
      Stanislav Korotky | 11 дек. 2025 в 16:06

      По теме: 5 LLM автономно торговали 8 месяцев по рыночным данным и новостям (подход обучения моделей не раскрывается).

      Автономная торговля 5-ю LLM на протяжении 8 месяцев

      Нейросети в трейдинге: Пространственно-временная модель состояния для анализа финансовых данных (E-STMFlow) Нейросети в трейдинге: Пространственно-временная модель состояния для анализа финансовых данных (E-STMFlow)
      Предлагаем познакомиться с фреймворком E-STMFlow, который эффективно обрабатывает потоки событий, извлекая информативные эмбеддинги, фильтруя шум и выявляя ключевые движения. Его архитектура позволяет выявлять сложные взаимосвязи между признаками и обеспечивает масштабируемость, точность и высокую вычислительную эффективность для интеллектуального анализа и прогнозирования.
      Разложение по динамическим модам в применении к одномерным временным рядам в языке MQL5 Разложение по динамическим модам в применении к одномерным временным рядам в языке MQL5
      Разложение по динамическим модам (Dynamic mode decomposition, DMD) — метод, который обычно применяют к наборам многомерных данных. В этой статье мы демонстрируем применение DMD на одномерных временных рядах, выявляя его способность характеризовать ряды, а также делать прогнозы. При этом рассмотрим встроенную в MQL5 реализацию разложения по динамическим модам, уделяя особое внимание новому матричному методу DynamicModeDecomposition().
      Моделирование рынка (Часть 16): Сокеты (X) Моделирование рынка (Часть 16): Сокеты (X)
      Мы близки к завершению данного испытания. Однако, прежде чем приступить, я хочу, чтобы вы попытались понять эти две статьи, данную и предыдущую. Так вы действительно поймете следующую статью, в которой я рассмотрю исключительно ту часть, которая касается программирования на MQL5. Но я также постараюсь сделать её понятной. Если вы не понимаете эти две последние статьи, то вам будет тяжело понять и следующую, потому что материалы накапливаются. Чем больше вещей нужно сделать, тем больше нужно создать и понять для достижения цели.
      Разработка инструментария для анализа движения цен (Часть 15): Введение в теорию четвертей (I) — Скрипт Quarters Drawer Разработка инструментария для анализа движения цен (Часть 15): Введение в теорию четвертей (I) — Скрипт Quarters Drawer
      Точки поддержки и сопротивления являются критическими уровнями, которые сигнализируют о возможном развороте и продолжении тренда. Хотя определение этих уровней может оказаться непростой задачей, ее решение позволит вам хорошо ориентироваться на рынке. В статье представлен инструмент Quarters Drawer. Он поможет вам определить как основные, так и второстепенные уровни поддержки и сопротивления.