.png)
Ваш первый торговый робот на Python: Автоматизируем стратегию "Пересечение скользящих средних" с помощью AI и Trade API
Наша цель — не создать "машину для печатания денег", а научиться автоматизировать торговую логику и взаимодействовать с биржей через Finam Trade API.
Что нам понадобится:
- Установленный Python 3.
- API-ключ от вашего брокера. В нашем примере мы будем использовать Finam TradeAPI.
- Доступ к любому AI-помощнику.
Шаг 1: Логика стратегии. Что такое "Золотой крест"?
Стратегия "Пересечение скользящих средних" (Moving Average Crossover) очень проста и наглядна. Мы берем цену акции и рассчитываем две линии:
1. Быстрая скользящая средняя (SMA50): Средняя цена закрытия за последние 50 дней. Она быстро реагирует на недавние изменения цены.
2. Медленная скользящая средняя (SMA200): Средняя цена за последние 200 дней. Она показывает долгосрочный тренд.
Торговые сигналы:
- Сигнал на покупку ("Золотой крест"): Когда быстрая SMA50 пересекает медленную SMA200 снизу вверх. Это говорит о возможном начале восходящего тренда.
- Сигнал на продажу ("Крест смерти"): Когда быстрая SMA50 пересекает медленную SMA200 сверху вниз. Это говорит о возможном начале нисходящего тренда.
Теперь давайте автоматизируем это.
Шаг 2: Получаем исторические данные через API
Нашей модели нужны данные. Нам нужно получить дневные свечи для конкретного инструмента, например, акций Сбера (SBER).
🤖 Промпт для вашего AI-помощника:
Напиши функцию на Python get_historical_data(symbol, api_token). Она должна делать GET-запрос к API для получения дневных свечей.
Детали:
Эндпоинт: https://api.finam.ru/v1/candles/{symbol}
Метод: GET
Заголовки: {'X-Api-Key': api_token}
Параметры: {'timeframe': 'D1', 'count': 250}
Функция должна обрабатывать возможные ошибки и возвращать данные в виде pandas DataFrame с колонками: ['open', 'high', 'low', 'close', 'volume', 'ts'].Шаг 3: Рассчитываем скользящие средние
Теперь, когда у нас есть данные, нужно рассчитать наши индикаторы — SMA50 и SMA200.
🤖 Промпт для вашего AI-помощника:
Напиши функцию на Python add_moving_averages(df). Она должна принимать на вход pandas DataFrame со свечами (включая колонку close). Функция должна рассчитать 50-дневную и 200-дневную простые скользящие средние (SMA) по колонке close и добавить их в DataFrame как новые колонки SMA50 и SMA200.Шаг 4: Генерируем торговые сигналы
Это мозг нашего робота. Здесь мы пишем логику, которая будет анализировать скользящие средние и принимать решение о покупке или продаже.
Ключевой момент: нам нужно проверить не просто, какая линия выше, а факт пересечения, который произошел именно на последней свече.
🤖 Промпт для вашего AI-помощника:
Напиши функцию на Python generate_signal(df). Она принимает DataFrame с колонками SMA50 и SMA200.
Логика:
1. Возьми две последние строки данных (предпоследний и последний день).
2. Сигнал 'BUY' ("Золотой крест"): Если на предпоследний день SMA50 была ниже SMA200, а на последний день стала выше.
3. Сигнал 'SELL' ("Крест смерти"): Если на предпоследний день SMA50 была выше SMA200, а на последний день стала ниже.
4. В остальных случаях возвращай 'HOLD'.
Функция должна вернуть одну из строк: 'BUY', 'SELL' или 'HOLD'.Шаг 5: Исполнение сделки через API
Сигнал сгенерирован, осталось самое главное — отправить заявку на биржу.
🤖 Промпт для вашего AI-помощника:
Напиши функцию на Python execute_trade(symbol, side, quantity, api_token, account_id).
Детали:
Она должна отправлять POST запрос на эндпоинт https://api.finam.ru/v1/orders.
Заголовки: {'X-Api-Key': api_token}.
Тело запроса (JSON): { "accountId": account_id, "securityBoard": "TQBR", "securityCode": symbol, "buySell": side, "quantity": quantity, "useCredit": false, "property": "Uncovered" }, где
side может быть 'Buy' или 'Sell'.
Функция должна выводить в консоль ответ от сервера.Собираем все вместе
Теперь у нас есть все строительные блоки. Осталось собрать их в один скрипт.
# Здесь будут функции, сгенерированные AI:
# get_historical_data(...)
# add_moving_averages(...)
# generate_signal(...)
# execute_trade(...)
def main():
# --- Настройки ---
API_TOKEN = "your_finam_api_token"
ACCOUNT_ID = "your_account_id"
SYMBOL = "SBER"
TRADE_QUANTITY = 10 # Количество лотов для торговли
print(f"1. Получаем данные для {SYMBOL}...")
candles_df = get_historical_data(SYMBOL, API_TOKEN)
if candles_df is not None and not candles_df.empty:
print("2. Рассчитываем скользящие средние...")
candles_df = add_moving_averages(candles_df)
print("3. Генерируем торговый сигнал...")
signal = generate_signal(candles_df)
print(f"Сгенерированный сигнал: {signal}")
if signal == 'BUY':
print("4. Отправляем заявку на покупку...")
execute_trade(SYMBOL, 'Buy', TRADE_QUANTITY, API_TOKEN, ACCOUNT_ID)
elif signal == 'SELL':
print("4. Отправляем заявку на продажу...")
execute_trade(SYMBOL, 'Sell', TRADE_QUANTITY, API_TOKEN, ACCOUNT_ID)
else:
print("4. Нет сигнала для входа в сделку. Ничего не делаем.")
if __name__ == "__main__":
main()Заключение и следующие шаги
Поздравляем! Вы только что спроектировали и написали код для своего первого торгового робота.
Важное замечание: Эта стратегия является образовательным примером. Перед использованием любого робота на реальных деньгах необходимо провести тщательное бэктестирование (проверку на исторических данных) и внедрить надежные механизмы управления рисками.
Теперь, когда у вас есть база, вы можете ее улучшать:
- Добавить управление рисками: Используйте OCO-заявки в Finam TradeAPI, чтобы автоматически выставлять Stop Loss и Take Profit для каждой сделки.
- Протестировать другие индикаторы: Замените SMA на RSI, MACD или полосы Боллинджера.
- Запустить робота по расписанию: Настройте его запуск раз в день на сервере для полной автоматизации.
Мир алгоритмической торговли огромен и увлекателен. Надеемся, эта статья стала для вас отличной отправной точкой. Удачи!