🤖 Как написать торгового робота для биржи: пошаговое руководство с рабочим примером


На главную > Блог > Категория > 🤖 Как написать торгового робота для биржи: пошаговое руководство с рабочим примером

trade_bot

От страха до первой сделки: почему боты — это не магия, а просто код

Вы когда-нибудь завидовали ребятам, у которых график торгуется сам, пока они пьют кофе на Мальдивах? Думаете, это хакеры с трёх экранов? Спойлер: нет. Это обычные люди, которые однажды сели и написали несколько десятков строчек кода.

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

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

1. Что такое торговый робот и зачем он нужен?

Торговый робот (или торговый бот) — это программа, которая автоматически совершает сделки на бирже по заданным правилам [citation:9]. Вместо того чтобы сидеть перед монитором 24/7 и вручную открывать ордера, вы пишете код, который делает это за вас. И делает это без эмоций, страха и жадности [citation:3].

Почему боты лучше людей (и почему иногда хуже)?

  • Без эмоций — не боятся убытков и не впадают в эйфорию от трёх зелёных свечей подряд.
  • Скорость — реагируют на изменения рынка за миллисекунды. Попробуйте-ка сделать 100 сделок вручную за минуту.
  • Дисциплина — никогда не нарушают риск-менеджмент. Даже если очень хочется «удвоить на отскоке».
  • Круглосуточная работа — пока вы спите, бот торгует на азиатских сессиях.
  • Глупость — бот не умеет «чувствовать рынок». Он делает только то, что вы ему запрограммировали.
  • Зависимость от API — если у брокера упал сервер, бот может начать творить странные вещи [citation:5].

Важнейшее предупреждение: никогда не запускайте робота на реальные деньги, пока не протестировали его на исторических данных и в демо-режиме [citation:1][citation:8]. Даже «идеальная» стратегия на бумаге может слить депозит за час на живом рынке.

2. Архитектура торгового робота: из чего он состоит?

Любой торговый робот, даже самый навороченный, строится по одной схеме из четырёх блоков [citation:5][citation:9]:

1. Получение рыночных данных (Data Feed)

Робот должен знать, что происходит на рынке. Для этого он каждую минуту (или секунду) забирает у брокера свечи, котировки, стакан заявок. В примере ниже мы будем получать исторические и текущие цены через API [citation:5][citation:10].

2. Анализ и принятие решений (Strategy Engine)

Самый важный блок. Здесь данные превращаются в сигналы: «покупай» или «продавай». Используются индикаторы (SMA, RSI, MACD), паттерны свечей, уровни поддержки/сопротивления [citation:1][citation:8]. В нашем примере стратегия будет простой: пересечение двух скользящих средних.

3. Управление рисками (Risk Manager)

Блок, который спасает депозит от самого себя. Он проверяет:

  • Достаточно ли денег на счёте для сделки?
  • Не превышен ли дневной лимит убытков?
  • Не пора ли выставить стоп-лосс? [citation:6]

4. Исполнение сделок (Order Executor)

Отправляет ордера брокеру через API. Покупает, продаёт, отменяет, проверяет статус [citation:4][citation:10].


┌──────────────────────────────────────────────────────┐
│                   ТОРГОВЫЙ РОБОТ                     │
├────────────┬────────────┬────────────┬───────────────┤
│ Получение  │  Анализ и  │ Управление │  Исполнение   │
│   данных   │   решение  │  рисками   │    сделок     │
├────────────┼────────────┼────────────┼───────────────┤
│ Котировки  │ Индикаторы │   Stop     │   Рыночный    │
│ Свечи      │ Сигналы    │   Loss     │   ордер       │
│ Объёмы     │ Паттерны   │   Take     │   Лимитный    │
│            │            │   Profit   │   ордер       │
└────────────┴────────────┴────────────┴───────────────┘

3. Инструментарий: Что нужно для старта?

Язык программирования: Python — король алгоритмической торговли

Почему Python? Потому что он простой, у него куча библиотек для анализа данных и работы с API, и он не заставит вас плакать над синтаксисом [citation:9]. Альтернативы — MQL5 (для MetaTrader) или C#, но для старта — только Python.

Что нужно установить:

  • Python 3.8+ — скачать с официального сайта
  • Библиотеки:
    • requests — для запросов к API брокера [citation:10]
    • pandas — для работы с временными рядами [citation:6]
    • python-dotenv — для хранения API-ключей [citation:1][citation:10]
    • numpy — для математических расчётов
  • IDE — VS Code, PyCharm или даже просто блокнот, если вы мазохист
  • Аккаунт у брокера с API — например, Bybit (крипта), Tinkoff Invest (акции РФ), Binance (крипта) или Kraken [citation:5][citation:8][citation:9]

Начнём с демо-счёта/песочницы — это виртуальные деньги, которые не жалко потерять [citation:1][citation:8].

4. Простой пример: Робот на пересечении скользящих средних (код внутри!)

Стратегия: Buy когда быстрая SMA (20) пересекает медленную SMA (50) снизу вверх. Sell при обратном пересечении [citation:7][citation:2]. Робот будет использовать исторические данные с Yahoo Finance (бесплатно и без API-ключей) [citation:7].

Шаг 1: Установка и импорт библиотек

# Установка (выполнить один раз в терминале)
# pip install pandas yfinance matplotlib numpy

import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
import numpy as np
from datetime import datetime

Шаг 2: Загрузка исторических данных

def get_data(ticker, start_date, end_date):
    """Загружает данные с Yahoo Finance"""
    print(f"Загружаем {ticker} с {start_date} по {end_date}...")
    data = yf.download(ticker, start=start_date, end=end_date)
    return data

# Загружаем данные Биткоина за последние 2 года
data = get_data('BTC-USD', '2023-01-01', '2025-01-01')
print(f"Загружено {len(data)} дней")

Шаг 3: Расчёт скользящих средних

def calculate_sma(data, short_window=20, long_window=50):
    """Считает быструю и медленную SMA"""
    data['SMA_short'] = data['Close'].rolling(window=short_window).mean()
    data['SMA_long'] = data['Close'].rolling(window=long_window).mean()
    return data

data = calculate_sma(data)
print(data[['Close', 'SMA_short', 'SMA_long']].tail())

Шаг 4: Генерация сигналов

def generate_signals(data):
    """1 = BUY, -1 = SELL, 0 = ничего"""
    data['Signal'] = 0
    
    # Проходим по всем дням, начиная с 50-го (чтобы были обе SMA)
    for i in range(50, len(data)):
        # Если быстрая SMA была ниже, а стала выше — BUY
        if (data['SMA_short'].iloc[i-1] < data['SMA_long'].iloc[i-1] and 
            data['SMA_short'].iloc[i] > data['SMA_long'].iloc[i]):
            data.loc[data.index[i], 'Signal'] = 1
        # Если быстрая SMA была выше, а стала ниже — SELL
        elif (data['SMA_short'].iloc[i-1] > data['SMA_long'].iloc[i-1] and 
              data['SMA_short'].iloc[i] < data['SMA_long'].iloc[i]):
            data.loc[data.index[i], 'Signal'] = -1
    
    return data

data = generate_signals(data)
print("Сигналы сгенерированы!")
print(data[data['Signal'] != 0].head())

Шаг 5: Симуляция торговли с риск-менеджментом

def backtest(data, initial_capital=10000, stop_loss_pct=0.05):
    """Симуляция торговли с учётом стоп-лосса"""
    capital = initial_capital
    position = 0  # Количество акций в портфеле
    trades = []
    
    for i in range(len(data)):
        price = data['Close'].iloc[i]
        signal = data['Signal'].iloc[i] if not pd.isna(data['Signal'].iloc[i]) else 0
        
        # Проверка стоп-лосса (если есть позиция)
        if position > 0:
            # Для длинной позиции: стоп-лосс ниже цены входа на stop_loss_pct
            entry_price = trades[-1]['price'] if trades else price
            if price < entry_price * (1 - stop_loss_pct):
                # Продаём по стопу
                capital += position * price
                trades.append({'date': data.index[i], 'type': 'STOP_LOSS', 
                               'price': price, 'shares': position})
                position = 0
                continue
        
        if signal == 1 and position == 0:  # BUY сигнал и нет позиции
            # Покупаем на все деньги
            shares_to_buy = int(capital / price)
            if shares_to_buy > 0:
                position = shares_to_buy
                capital -= shares_to_buy * price
                trades.append({'date': data.index[i], 'type': 'BUY', 
                               'price': price, 'shares': shares_to_buy})
        
        elif signal == -1 and position > 0:  # SELL сигнал и есть позиция
            capital += position * price
            trades.append({'date': data.index[i], 'type': 'SELL', 
                           'price': price, 'shares': position})
            position = 0
    
    # Закрываем позицию в конце
    if position > 0:
        capital += position * data['Close'].iloc[-1]
        trades.append({'date': data.index[-1], 'type': 'SELL (final)', 
                       'price': data['Close'].iloc[-1], 'shares': position})
    
    final_value = capital
    total_return = (final_value - initial_capital) / initial_capital * 100
    
    return final_value, total_return, trades

final_value, total_return, trades = backtest(data)
print(f"Стартовый капитал: $10,000")
print(f"Конечная стоимость портфеля: ${final_value:.2f}")
print(f"Общая доходность: {total_return:.2f}%")
print(f"Совершено сделок: {len(trades)}")

Шаг 6: Визуализация результатов

def plot_results(data, trades):
    """Рисует график цены, SMA и сигналов"""
    plt.figure(figsize=(14, 7))
    
    # Цена и SMA
    plt.plot(data.index, data['Close'], label='Цена закрытия', color='black', alpha=0.6)
    plt.plot(data.index, data['SMA_short'], label='SMA 20', color='blue', linestyle='--')
    plt.plot(data.index, data['SMA_long'], label='SMA 50', color='orange', linestyle='--')
    
    # Сигналы
    buy_signals = data[data['Signal'] == 1]
    sell_signals = data[data['Signal'] == -1]
    plt.scatter(buy_signals.index, buy_signals['Close'], 
                color='green', marker='^', s=100, label='Покупка')
    plt.scatter(sell_signals.index, sell_signals['Close'], 
                color='red', marker='v', s=100, label='Продажа')
    
    plt.title('Торговый робот: пересечение SMA 20/50')
    plt.xlabel('Дата')
    plt.ylabel('Цена (USD)')
    plt.legend()
    plt.grid(True, alpha=0.3)
    plt.show()

plot_results(data, trades)

❗Важно: Этот код — обучающий пример. Не используйте его на реальные деньги без доработок и тестирования! [citation:5]

5. Как подключить бота к реальной бирже (пошагово)

Шаг 1: Регистрация у брокера и получение API-ключей

Пример для Bybit (крипта):

  • Зарегистрируйтесь на Bybit
  • Зайдите в «Управление API» → «Создать новый ключ»
  • Выдайте права: «Чтение», «Торговля» (в демо-режиме достаточно «Чтения»)
  • Скопируйте API Key и Secret Key [citation:8]

Для российских акций используйте Tinkoff Invest API [citation:1][citation:9].

Шаг 2: Настройка окружения (файл .env)

Создайте файл .env в папке проекта (никогда не выкладывайте его в открытый доступ!):

API_KEY=ваш_api_ключ_сюда
API_SECRET=ваш_секретный_ключ_сюда
TRADE_SYMBOL=BTCUSDT
TRADE_SIZE=0.001  # Сумма в базовой валюте
USE_SANDBOX=True  # True = демо-счёт, False = реальный [citation:1]

Шаг 3: Установка дополнительных библиотек

pip install python-dotenv ccxt  # ccxt — библиотека для 100+ бирж сразу

Шаг 4: Простой код для отправки ордера (пример для Bybit)

import os
from dotenv import load_dotenv
import ccxt

load_dotenv()

# Инициализация биржи (тестовая сеть)
exchange = ccxt.bybit({
    'apiKey': os.getenv('API_KEY'),
    'secret': os.getenv('API_SECRET'),
    'options': {'defaultType': 'spot'},
    'enableRateLimit': True,
})

if os.getenv('USE_SANDBOX') == 'True':
    exchange.set_sandbox_mode(True)  # Демо-режим [citation:8]

# Получить баланс
balance = exchange.fetch_balance()
print(f"Баланс USDT: {balance['USDT']['free']}")

# Разместить рыночный ордер на покупку
try:
    order = exchange.create_market_buy_order('BTC/USDT', 0.001)
    print(f"Ордер размещён: {order}")
except Exception as e:
    print(f"Ошибка: {e}")

6. Реальные примеры роботов с GitHub (что можно изучить)

Если вы хотите копнуть глубже, вот готовые Open Source проекты для вдохновения:

  • ScalpbotTbank — скальпинг-робот для Tinkoff Invest. Динамический выбор волатильных акций, адаптивные стратегии (скользящие средние + полосы Боллинджера), управление через Telegram [citation:1].
  • QTrader — стратегия пробития уровней с веб-интерфейсом. Анализ тренда, RSI, SMA, MACD, поддержка 100+ криптовалют через Bybit API [citation:8].
  • trading_bot_algorithm — простой бот на скользящих средних с бэктестингом и стоп-лоссом. Идеален для обучения [citation:2].
  • python101-bot-trading — пошаговый курс создания минимального бота «подбрось монетку» на Binance TH [citation:10].

7. Что дальше? Как не слить депозит после запуска

Чек-лист безопасности:

  1. Тысячи часов бэктестинга — прогоните стратегию на исторических данных за 5-10 лет. Посмотрите, как бы она пережила кризисы 2008, 2020 и 2022 годов [citation:3].
  2. Демо-счёт — ваш лучший друг. Торгуйте на виртуальные деньги минимум месяц, прежде чем пустить реальный рубль [citation:1][citation:8].
  3. Начните с копеечных сумм — 10-20 долларов. Убедитесь, что бот не глючит и API работает стабильно [citation:5].
  4. Всегда устанавливайте стоп-лосс. Даже «самая надёжная» стратегия может пойти против вас [citation:6].
  5. Мониторинг и логирование. Бот должен писать отчёты в файл или Telegram, чтобы вы знали, что происходит, пока вы спите [citation:1].
  6. Никогда не верьте «100% прибыльным стратегиям». Если бы они существовали, их создатели не продавали бы их за 99 долларов [citation:2].
«Первый год алгоритмической торговли ты учишься не терять деньги. Второй — зарабатывать на демо-счёте. Третий — доверять своему коду. А на четвёртый начинаешь подумывать: "А не уволиться ли с работы?"»

8. Заключение: с чего начать прямо сегодня?

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

Ваш план действий на сегодня:

  1. Скопируйте код из примера выше и запустите его у себя на компьютере. Посмотрите на график сигналов.
  2. Зарегистрируйтесь у брокера и получите API-ключи для демо-счёта.
  3. Покрутите параметры (окна SMA, стоп-лосс, сумму сделки) и посмотрите, как меняется результат.
  4. Прочитайте документацию CCXT — библиотеки для подключения к 100+ биржам одной командой.
  5. Зайдите на GitHub, найдите проект по душе и попробуйте его запустить [citation:1][citation:10].

И помните: лучший робот — это не тот, который зарабатывает 1000% в день, а тот, который не сливает депозит, когда вы отвлеклись на чашку кофе. Удачи в кодинге и торговле!

 

Дата размещения статьи: 2026-05-16T07:41:16