На главную > Блог > Категория > 🤖 Как написать торгового робота для биржи: пошаговое руководство с рабочим примером
Вы когда-нибудь завидовали ребятам, у которых график торгуется сам, пока они пьют кофе на Мальдивах? Думаете, это хакеры с трёх экранов? Спойлер: нет. Это обычные люди, которые однажды сели и написали несколько десятков строчек кода.
Сегодня я расскажу вам как создать своего первого торгового робота с нуля. Мы разберём архитектуру, напишем простого, но работающего бота на стратегии скользящих средних и даже запустим его в тестовой среде. Без пафоса, без сложных формул — с юмором и практикой.
«Лучший трейдер — это тот, кто спит, пока его робот работает. А лучший робот — тот, который не сливает депозит быстрее, чем вы успеваете проснуться».
Торговый робот (или торговый бот) — это программа, которая автоматически совершает сделки на бирже по заданным правилам [citation:9]. Вместо того чтобы сидеть перед монитором 24/7 и вручную открывать ордера, вы пишете код, который делает это за вас. И делает это без эмоций, страха и жадности [citation:3].
Важнейшее предупреждение: никогда не запускайте робота на реальные деньги, пока не протестировали его на исторических данных и в демо-режиме [citation:1][citation:8]. Даже «идеальная» стратегия на бумаге может слить депозит за час на живом рынке.
Любой торговый робот, даже самый навороченный, строится по одной схеме из четырёх блоков [citation:5][citation:9]:
Робот должен знать, что происходит на рынке. Для этого он каждую минуту (или секунду) забирает у брокера свечи, котировки, стакан заявок. В примере ниже мы будем получать исторические и текущие цены через API [citation:5][citation:10].
Самый важный блок. Здесь данные превращаются в сигналы: «покупай» или «продавай». Используются индикаторы (SMA, RSI, MACD), паттерны свечей, уровни поддержки/сопротивления [citation:1][citation:8]. В нашем примере стратегия будет простой: пересечение двух скользящих средних.
Блок, который спасает депозит от самого себя. Он проверяет:
Отправляет ордера брокеру через API. Покупает, продаёт, отменяет, проверяет статус [citation:4][citation:10].
┌──────────────────────────────────────────────────────┐
│ ТОРГОВЫЙ РОБОТ │
├────────────┬────────────┬────────────┬───────────────┤
│ Получение │ Анализ и │ Управление │ Исполнение │
│ данных │ решение │ рисками │ сделок │
├────────────┼────────────┼────────────┼───────────────┤
│ Котировки │ Индикаторы │ Stop │ Рыночный │
│ Свечи │ Сигналы │ Loss │ ордер │
│ Объёмы │ Паттерны │ Take │ Лимитный │
│ │ │ Profit │ ордер │
└────────────┴────────────┴────────────┴───────────────┘
Почему Python? Потому что он простой, у него куча библиотек для анализа данных и работы с API, и он не заставит вас плакать над синтаксисом [citation:9]. Альтернативы — MQL5 (для MetaTrader) или C#, но для старта — только Python.
requests — для запросов к API брокера [citation:10]pandas — для работы с временными рядами [citation:6]python-dotenv — для хранения API-ключей [citation:1][citation:10]numpy — для математических расчётовНачнём с демо-счёта/песочницы — это виртуальные деньги, которые не жалко потерять [citation:1][citation:8].
Стратегия: Buy когда быстрая SMA (20) пересекает медленную SMA (50) снизу вверх. Sell при обратном пересечении [citation:7][citation:2]. Робот будет использовать исторические данные с Yahoo Finance (бесплатно и без API-ключей) [citation:7].
# Установка (выполнить один раз в терминале)
# 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
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)} дней")
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())
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())
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)}")
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]
Пример для Bybit (крипта):
Для российских акций используйте Tinkoff Invest API [citation:1][citation:9].
Создайте файл .env в папке проекта (никогда не выкладывайте его в открытый доступ!):
API_KEY=ваш_api_ключ_сюда
API_SECRET=ваш_секретный_ключ_сюда
TRADE_SYMBOL=BTCUSDT
TRADE_SIZE=0.001 # Сумма в базовой валюте
USE_SANDBOX=True # True = демо-счёт, False = реальный [citation:1]
pip install python-dotenv ccxt # ccxt — библиотека для 100+ бирж сразу
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}")
Если вы хотите копнуть глубже, вот готовые Open Source проекты для вдохновения:
«Первый год алгоритмической торговли ты учишься не терять деньги. Второй — зарабатывать на демо-счёте. Третий — доверять своему коду. А на четвёртый начинаешь подумывать: "А не уволиться ли с работы?"»
Создание торгового робота — это увлекательное путешествие из мира трейдинга в мир программирования и обратно. Вы не станете миллиардером за месяц, но вы станете трейдером, который контролирует свои эмоции, автоматизирует скучную работу и спит спокойно, потому что за его депозитом следит код.
Ваш план действий на сегодня:
И помните: лучший робот — это не тот, который зарабатывает 1000% в день, а тот, который не сливает депозит, когда вы отвлеклись на чашку кофе. Удачи в кодинге и торговле!
Дата размещения статьи: 2026-05-16T07:41:16