Автоматизация торговли: закодируй своё преимущество, убери эмоции
3 часа ночи. Твой сетап на свипе срабатывает. Ты спишь.
Твой бот открывает сделку, ставит стоп и целится в 3R. Пока ты видишь сны.
6 утра. Ты просыпаешься. Позиция закрыта. +2,8R прибыли. Кофе кажется вкуснее.
🎯 Обещание автоматизации
Никакого FOMO. Никакого страха. Никаких колебаний. Только код, который безупречно исполняет твои правила — каждый раз.
Это не фантастика. Именно так торгуют профессионалы в 2024 году.
📉 РАЗБОР СЛУЧАЯ: маржин-колл Майка на 19 000 $
Расстановка: Майк Салливан (собирательный пример), Python-разработчик, счёт 200 000 $. Бот на API Alpaca (покупать SPY при RSI<30). Backtest 2020-2023: 67 % прибыльных, +140 000 $. Запущен с НУЛЁМ защитных механизмов.
Катастрофа (утро шока по инфляции): Бот работал 8 недель (+14 000 $, 71 % прибыльных). SPY открылся гэпом -2,8 % на 510 $. Бот увидел RSI 22 и продолжил покупать: 200 000 $ по 510 $, 505 $, 495 $ и 490 $ = позиция на 800 000 $ (плечо 4, средняя цена 499,87 $). К 15:00: SPY на 488 $ — на 7 % ниже вчерашнего закрытия — позиция стоила 781 000 $, минус 19 005 $, и пришло требование довнести маржу. Майк был на работе и ничего не мог сделать.
Восстановление: Счёт после провала: 195 000 $. Перестроен с 5 механизмами: позиция не больше 50 000 $, VIX>25 = отключение, не больше 3 сделок в день, оповещение на -5 % от максимума, полная остановка на -10 %. Результат за следующие 8 месяцев: 195 000 $ → 218 000 $ (+12 %), и ни один механизм ни разу не подвёл.
Урок: Кодируй защитные механизмы В ПЕРВУЮ ОЧЕРЕДЬ: (1) лимиты позиции, (2) фильтры волатильности, (3) отключение по максимальному drawdown, (4) аварийная кнопка. Backtest лжёт: он не видит чёрных лебедей.
Вопрос: бот Майка получил маржин-колл ЗА ОДНО УТРО. Что стало причиной?
⚡ Быстрые шаги на завтра (нажмите, чтобы раскрыть)
- Сначала торгуй на демо — Никогда не ставь настоящие деньги за непроверенную автоматизацию. Сначала демо, а по части 2 это означает месяцы, а не недели.
- Добавь лимиты позиции — Пропиши в коде максимальный размер позиции: 2 % риска счёта на сделку И потолок по номиналу, потому что 2 % риска — это не 2 % экспозиции.
- Сделай аварийную кнопку — Создай ручное отключение, которое одним кликом или командой останавливает всю активность бота.
Человеческая проблема в трейдинге
Ты 6 месяцев доводил стратегию до ума. Прогнал backtest. Проверил вперёд. Доля прибыльных: 62 %. Средний R: 2,3. Преимущество подтверждено.
Начинаешь торговать её вживую. Результат?
| Месяц | Результат стратегии (при идеальном следовании) | Твой фактический результат | Проблема |
|---|---|---|---|
| Месяц 1 | +4 200 $ (62 % прибыльных) | +1 800 $ (48 % прибыльных) | Пропустил 3 сетапа (страх после серии убытков) |
| Месяц 2 | +3 900 $ (60 % прибыльных) | -2 100 $ (38 % прибыльных) | Отыгрывался, удваивал объём после убытков |
| Месяц 3 | +5 100 $ (65 % прибыльных) | +900 $ (52 % прибыльных) | Колебался на пробойных сетапах, упустил 40 % сигналов |
Жестокая правда: У тебя есть прибыльная стратегия. Но слабое звено — ТЫ.
Три убийцы исполнения
1. Колебания (пропуски из страха)
- Ты только что получил 2 убытка. Появляется сетап № 3. Ты думаешь: «Может, дождусь подтверждения…»
- Ты ждёшь. Цена уходит без тебя. Это была сделка на 4R. Ты упустил её из-за страха.
- Последствие: Пропуск прибыльных сделок разрушает положительное матожидание
2. Перебор со сделками (входы на FOMO)
- Рынок улетает вверх. Стратегия говорит «сетапа нет». Но смотреть на это невыносимо. Ты входишь всё равно.
- Стоп не выставлен. Плана нет. Только надежда. Разворот. Убыток.
- Последствие: Случайные входы размывают твоё преимущество шумом
3. Непостоянный размер позиции
- Сетап A: рискуешь 1 % (осторожничаешь после недавнего убытка)
- Сетап B: рискуешь 5 % (уверен, «чувствую его»)
- Сетап A даёт 3R. Ты зарабатываешь 3 %. Сетап B даёт -1R. Ты теряешь 5 %. Итого: -2 %.
- Последствие: Одно неверное решение по объёму съедает 3 хорошие сделки
💡 Что решает автоматизация
Автоматический торговый бот исполняет с безупречной дисциплиной:
- Никаких колебаний: Появился сетап → сделка исполняется (даже после 5 убытков подряд)
- Никакого FOMO: Сетапа нет → бот ждёт (каким бы скучным ни казался рынок)
- Идеальный объём: Каждая сделка рискует ровно 2 % (или тем, что ты задал), каждый раз
Итог: Твой результат в backtest становится твоим результатом вживую. Преимущество, которое ты проверял, — это преимущество, которое ты получаешь.
Проблема масштаба (пределы ручной торговли)
Ручная торговля ставит потолок твоему потенциалу:
| Ограничение | Ручной предел | Автоматизированный потенциал |
|---|---|---|
| Рынки | Следить за 1-3 инструментами (предел человеческого внимания) | Отслеживать более 50 инструментов одновременно |
| Таймфреймы | Держать в голове максимум 1-2 таймфрейма | Сканировать 5m, 15m, 1h и дневной одновременно |
| Часы | Торговать 6-8 часов в день (риск выгорания) | Торговать круглосуточно (крипта) или всю сессию (акции) |
| Сетапы | Ловить 5-10 сетапов в неделю (реалистично для дискреционного трейдера) | Ловить 50-200 сетапов в неделю (бот не спит и ничего не пропускает) |
Пример: Ручной трейдер следит за ES (фьючерс на S&P) на 15-минутном графике. Ловит около 8 сетапов в неделю. Зарабатывает в среднем 3 200 $ в месяц — примерно 92 $ на сетап.
Тот же трейдер, но с автоматизацией: Бот сканирует ES, NQ и RTY (индексные фьючерсы) плюс GC и CL (металлы и энергоносители) на 5m, 15m и 1h. Ловит около 24 сетапов в неделю. При тех же 92 $ на сетап это 9 600 $ в месяц.
Что это даёт: Ты торгуешь не лучше. Ты торгуешь БОЛЬШЕ — не выгорая.
И где потолок: ES, MES, SPY и QQQ — по большей части одна и та же сделка. Добавляя коррелированные инструменты, ты умножаешь количество сигналов, а не преимущество, и умножаешь риск, когда четыре из них срабатывают разом. Считай некоррелированные возможности, а не тикеры.
Когда автоматизация оправдана (а когда нет)
Автоматизация лучше всего работает для:
- Стратегий по правилам: Чёткие критерии входа и выхода (например, «покупать, когда цена снимает минимум и возвращается выше»)
- Частых сетапов: Стратегий, которые срабатывают более 10 раз в неделю (объём оправдывает время на код)
- Скучного исполнения: Стратегий, где дискреция не добавляет ценности (механические преимущества)
Автоматизации тяжело с:
- Дискреционными сетапами: «Я беру это, только когда *чувствую*» (интуицию не закодируешь)
- Сделками, зависящими от контекста: «Этот пробой работает, если объём больше 2 средних И есть новостной катализатор» (сложный контекст трудно оцифровать)
- Редкими стратегиями: Сетапы, которые срабатывают 1-2 раза в месяц (не стоят усилий на код)
⚠️ Автоматизация не чинит плохую стратегию
Частая ошибка: «Моя стратегия не работает вручную. Может, бот сделает её прибыльной?»
Реальность: Автоматизация исполняет твою стратегию РОВНО так, как ты её закодировал. Если у стратегии нет преимущества, бот будет стабильно терять — только быстрее и эффективнее.
Правило: Автоматизируй ТОЛЬКО стратегии с доказанным положительным матожиданием на более чем 100 ручных сделках. Автоматизация усиливает преимущества. Она их не создаёт.
Сравнение брокерских API
Не каждый брокер поддерживает автоматическую торговлю. А те, кто поддерживает, сильно отличаются по качеству, цене и возможностям.
Лучшие брокерские API для автоматической торговли
| Брокер | Классы активов | Качество API | Стоимость | Лучше всего для |
|---|---|---|---|---|
| Alpaca | Акции, ETF, крипта | ⭐⭐⭐⭐⭐ Отлично (RESTful + WebSocket, хорошая документация) | Акции без комиссии, 0,1-0,25 % по крипте | Новички (самый простой API, бесплатное демо, библиотека для Python) |
| Interactive Brokers (IBKR) | Акции, опционы, фьючерсы, валюта, CFD (глобальные рынки) | ⭐⭐⭐⭐ Хорошо (мощный, но сложный, крутая кривая обучения) | 0,005 $ за акцию, 0,65 $ за опционный контракт | Продвинутые трейдеры (хотят автоматизировать опционы и фьючерсы, глобальный доступ) |
| Binance | Крипта (более 600 пар; основная биржа закрыта для резидентов США — Binance.US это отдельная и гораздо меньшая площадка) | ⭐⭐⭐⭐⭐ Отлично (REST + WebSocket, высокая пропускная способность) | 0,1 % спот, 0,02-0,04 % фьючерсы (со скидкой за BNB) | Крипто-алготрейдеры (рынки без выходных, высокая ликвидность) |
| Schwab (бывший TD Ameritrade / thinkorswim) | Акции, опционы, фьючерсы | ⭐⭐⭐ Средне (старый API TD Ameritrade отключили в 2024 году; на смену пришёл Schwab Trader API, он ещё дозревает) | 0 $ по акциям, 0,65 $ за опционный контракт | Действующие клиенты Schwab (счёт уже есть, хотят автоматизировать) |
| TradeStation | Акции, опционы, фьючерсы | ⭐⭐⭐⭐ Хорошо (программирование на EasyLanguage, встроенный backtesting) | 0 $ по акциям, 0,60 $ за опционный контракт | Активные трейдеры (хотят единую платформу без стороннего кода) |
Краткая шпаргалка по выбору
Выбирай Alpaca, если: ты учишься автоматизации (самый простой API, бесплатное демо, лучшая документация). Выбирай Interactive Brokers, если: нужны опционы, фьючерсы или глобальные рынки (все классы активов, 0,005 $ за акцию, институциональный уровень). Выбирай Binance, если: тебе нужна только крипта (рынки без выходных, более 600 пар, комиссия 0,1 %).
💡 Совет профи: всегда начинай с демо
Каждый брокер из списка выше предлагает демо-счёт (торговля понарошку на реальных данных).
Рекомендуемый график:
- Недели 1-2: Подключиться к API и проверить базовую отправку заявок (покупка, продажа, стоп-лосс)
- Недели 3-8: Написать стратегию, запустить её на демо, проверять каждый день
- Недели 9-12: Проверить результат стратегии (совпадает ли он с backtest?)
- С 4-го месяца: Если она прибыльна 3 месяца подряд на демо, выходи вживую с 10 % капитала
- С 6-го месяца: Если прибыльность сохраняется, наращивай до полного объёма
Никогда не пропускай демо. Майк (разбор случая выше) пропустил его и за одно утро получил маржин-колл.
От торговой идеи к исполняемому коду
У тебя есть ручная стратегия. Как перевести её в код, который сможет исполнить бот?
Каркас перевода стратегии из 5 шагов
Шаг 1: задать условия входа (только явные правила)
Ручной трейдер думает: «Я покупаю, когда цена снимает минимум и отскакивает вверх».
Для бота это слишком расплывчато. Боту нужна точная логика:
- Что такое «свип»? → Минимум текущей свечи опускается минимум на 0,3 % ниже предыдущего свингового минимума
- Что значит «отскакивает вверх»? → Цена закрывается обратно выше свингового минимума в течение 1-3 свечей
- Что такое «свинговый минимум»? → Самый низкий минимум за последние 20 свечей
Версия в коде:
swing_low = min([bar.low for bar in last_20_bars])
current_low = current_bar.low
current_close = current_bar.close
if current_low < swing_low * 0.997: # снят на 0,3 % ниже
if current_close > swing_low: # цена вернулась выше
ENTRY = True # сетап на свипе подтверждён
Шаг 2: задать условия выхода (стоп и цель)
Ручной трейдер: «Ставлю стоп под свип, а прибыль забираю при соотношении риск-прибыль 3 к 1».
Версия в коде:
entry_price = current_close
stop_loss = swing_low * 0.995 # чуть ниже свипа
stop_distance = entry_price - stop_loss
target = entry_price + (stop_distance * 3) # цель 3R
Шаг 3: задать размер позиции (управление риском)
Ручной трейдер: «Я рискую примерно 2 % на сделку».
Версия в коде:
account_equity = 100000 # счёт 100 000 $
risk_per_trade = 0.02 # 2 %
risk_amount = account_equity * risk_per_trade # 2 000 $
stop_distance = entry_price - stop_loss
position_size = risk_amount / stop_distance # сколько акций купить
# Пример: вход 520 $, стоп 518 $, расстояние 2 $
# Размер позиции = 2 000 $ / 2 $ = 1 000 акций
# ...то есть 520 000 $ в SPY на счёте в 100 000 $. Правило про 2 %
# ничего не говорит о номинале: узкий стоп тихо покупает тебе плечо.
max_notional = account_equity * 1.5 # жёсткий потолок: 1,5 капитала
position_size = min(position_size, max_notional / entry_price)
# С потолком: 288 акций. Реальный риск теперь 576 $, а не 2 000 $ -
# это и есть цена вопроса, и именно она держит тебя в игре.
Шаг 4: задать сопровождение сделки (по желанию)
Ты выходишь частями? Двигаешь стоп? Забираешь часть прибыли?
Пример: «На 2R я забираю 50 % прибыли, а остаток веду до 3R».
if current_price >= entry_price + (stop_distance * 2):
SELL_HALF = True # на 2R закрыть половину
# Перенести стоп в безубыток для оставшихся 50 %
Шаг 5: задать фильтры (отсечь плохие сетапы)
Какие условия отменяют сетап?
- Фильтр по времени: Торговать только в первые 2 часа сессии (9:30-11:30 ET)
- Фильтр волатильности: Пропускать сделки, когда VIX выше 30 (слишком рвано)
- Фильтр тренда: Только лонговые сетапы, когда цена выше 50-периодной EMA
if VIX > 30:
SKIP_TRADE = True # рынок слишком волатилен
if current_time < "09:30" or current_time > "11:30":
SKIP_TRADE = True # вне торгового окна
✅ Полный пример стратегии (логика бота на свипах)
Все 5 шагов, собранные в исполняемый псевдокод:
# Шаг 1: условия входа
swing_low = min([bar.low for bar in last_20_bars])
if current_bar.low < swing_low * 0.997: # свип
if current_bar.close > swing_low: # цена вернулась выше
# Шаг 2: выходы
entry = current_bar.close
stop = swing_low * 0.995
target = entry + ((entry - stop) * 3)
# Шаг 3: размер позиции
risk_amount = account_equity * 0.02
size = risk_amount / (entry - stop)
# Шаг 4: сопровождение сделки (50 % на 2R)
profit_target_partial = entry + ((entry - stop) * 2)
# Шаг 5: фильтры
if VIX < 30 and time_in_window():
PLACE_ORDER(symbol, size, entry, stop, target)
Теперь это исполнимо. Бот может безупречно следовать этим правилам каждый раз.
Полная реализация бота (стратегия на свипе и развороте)
import alpaca_trade_api as tradeapi
from alpaca_trade_api.rest import TimeFrame
import os, time
# Настройка
API_KEY = os.getenv('ALPACA_API_KEY') # НИКОГДА не вписывай в код!
API_SECRET = os.getenv('ALPACA_API_SECRET')
api = tradeapi.REST(API_KEY, API_SECRET, 'https://paper-api.alpaca.markets')
MAX_NOTIONAL_MULT = 1.5 # никогда не держать больше 1,5 капитала
MAX_DAILY_LOSS = 0.03 # аварийная кнопка: на -3 % закрываем день
def get_swing_low(bars, lookback=20):
# Исключи текущую свечу. Если её оставить, свинговый минимум И ЕСТЬ
# текущий минимум, проверка свипа никогда не сработает, бот не откроется.
lows = [bar.l for bar in bars[-(lookback + 1):-1]]
return min(lows)
def check_sweep(current_price, current_low, swing_low):
# Свип = текущий минимум < свингового (0,3 %), затем возврат выше
if current_low < swing_low * 0.997 and current_price > swing_low:
return True
return False
def calculate_position_size(api, entry, stop):
equity = float(api.get_account().equity)
risk_amount = equity * 0.02 # риск 2 %
by_risk = risk_amount / (entry - stop)
by_notional = (equity * MAX_NOTIONAL_MULT) / entry # механизм, которого не было у Майка
return int(min(by_risk, by_notional))
def kill_switch_tripped(api):
acct = api.get_account()
move = (float(acct.equity) - float(acct.last_equity)) / float(acct.last_equity)
return move <= -MAX_DAILY_LOSS
def in_position(api, symbol):
# Спроси у брокера, не доверяй локальной переменной. Bracket, который
# исполнился и закрылся ночью, не должен блокировать завтрашний сетап.
try:
api.get_position(symbol)
return True
except Exception:
return False
def place_bracket_order(api, symbol, size, entry, stop, target):
try:
order = api.submit_order(
symbol=symbol, qty=size, side='buy', type='limit',
limit_price=entry, time_in_force='gtc',
order_class='bracket',
stop_loss={'stop_price': stop},
take_profit={'limit_price': target}
)
print(f"✓ Заявка: {size} акций @ ${entry} | Стоп: ${stop} | Цель: ${target}")
return order
except Exception as e:
print(f"✗ Заявка не прошла: {e}")
return None
def run_bot(symbol='SPY'):
print(f"Бот запущен. Слежу за {symbol} в поисках сетапов на свипе...")
while True:
try:
if not api.get_clock().is_open: # механизм 1: часы торгов
time.sleep(60)
continue
if kill_switch_tripped(api): # механизм 2: дневной лимит убытка
print("🛑 Дневной лимит убытка достигнут. Останавливаюсь.")
break
bars = api.get_bars(symbol, TimeFrame.Minute, limit=50)
current_price = bars[-1].c
current_low = bars[-1].l
swing_low = get_swing_low(bars)
if not in_position(api, symbol) and check_sweep(current_price, current_low, swing_low):
print(f"🎯 Свип замечен @ ${current_price}")
entry = current_price
stop = swing_low * 0.995
target = entry + (entry - stop) * 3 # 3R
size = calculate_position_size(api, entry, stop) # механизм 3: потолок номинала
if size > 0:
place_bracket_order(api, symbol, size, entry, stop, target)
time.sleep(60) # проверять каждую минуту
except Exception as e:
print(f"Ошибка: {e}")
time.sleep(60)
run_bot() # ~75 строк - и три самые важные из них это защитные механизмы.
Что это делает: Подключается к Alpaca, забирает минутные свечи по SPY, находит развороты после свипа (минимум уходит под свинговый минимум, а затем цена возвращается выше), считает объём по 2 % риска с потолком по номиналу, выставляет bracket-заявку (вход + стоп + цель 3R) и повторяет всё это каждые 60 секунд — но только пока рынок открыт, только когда брокер подтверждает, что позиции нет, и никогда, если день в минусе на 3 %. Безупречная дисциплина, ноль эмоций и три тормоза.
💡 момент озарения
Ты только что убрал человеческий слой. Больше никаких «брать или не брать?». Больше никаких «может, подожду».
Появился сетап → бот торгует. Не появился → бот ждёт. Безупречная дисциплина.
Демо ≠ реальная торговля
Твой бот идеально работает на демо. Ты выводишь его вживую. Он падает. Заявки отклоняются. Ты в недоумении.
Добро пожаловать в продакшен.
Частые ошибки (и как их обрабатывать)
Частые ошибки: Таймаут соединения, отклонённая заявка, частичные исполнения, лимиты запросов, закрытый рынок. Решения: Логика повторов (3× с экспоненциальной паузой), предварительные проверки (средства, часы торгов, цена), обработка частичных исполнений, ограничение частоты (200 запросов в минуту), проверка часов торгов (9:30-16 ET). Профессиональные боты обрабатывают ошибки аккуратно.
Логика повторов (обязательна)
import uuid
def place_order_with_retry(api, **order_params):
"""Повторить отправку заявки до 3 раз"""
max_retries = 3
# Один и тот же id на каждой попытке. Если первый запрос всё же дошёл до
# брокера и потерялся только ответ, повтор отклонят как дубль вместо того,
# чтобы удвоить твою позицию.
order_params.setdefault('client_order_id', f"bot-{uuid.uuid4()}")
for attempt in range(max_retries):
try:
order = api.submit_order(**order_params)
return order # Успех!
except Exception as e:
if attempt < max_retries - 1:
wait = 2 ** attempt # 1с, затем 2с (экспоненциальная пауза)
print(f"Заявка не прошла: {e}. Повтор через {wait}с...")
time.sleep(wait)
else:
# Последняя попытка провалилась
print(f"Заявка не прошла после {max_retries} попыток: {e}")
# Отправить оповещение (почта, SMS)
raise # Пробросить исключение дальше
Мониторинг и оповещения (критично)
Твой бот работает на VPS в облаке. Ты на ужине. Он натыкается на ошибку.
Вы прошли половину пути. Ключевые стратегии уже изучены.
Отличный прогресс! При необходимости сделайте короткую разминку, а затем мы перейдём к продвинутым концепциям.
Как ты об этом узнаешь?
Ответ: Через оповещения.
import smtplib
from email.mime.text import MIMEText
def send_alert(subject, message):
"""Отправить оповещение по почте"""
msg = MIMEText(message)
msg['Subject'] = subject
msg['From'] = 'bot@yourbot.com'
msg['To'] = 'you@gmail.com'
# Отправка через SMTP Gmail - здесь нужен пароль приложения Gmail,
# а не пароль от аккаунта; базовую авторизацию отключили в 2022 году.
with smtplib.SMTP('smtp.gmail.com', 587) as server:
server.starttls()
server.login('bot@yourbot.com', os.getenv('EMAIL_PASSWORD'))
server.send_message(msg)
# Использование
try:
# Торговая логика
pass
except Exception as e:
send_alert(
subject="🚨 Ошибка торгового бота",
message=f"Бот наткнулся на ошибку: {e}"
)
raise
Теперь ты узнаешь о поломке за считаные минуты.
🚨 Аварийная кнопка (обсуждению не подлежит)
Твой бот обязан автоматически прекращать торговлю, если:
- Дневной drawdown превышает -3 % (перестроенный бот Майка вдобавок отключался насовсем на -10 % от максимума)
- Подряд идут 5 убытков
- Ошибок API больше 10 в час
- Замечено неожиданное поведение
Закодируй это. Протестируй. От этого зависит твой счёт.
Хостинг: где запускать бота
Почему домашний ПК подводит
- Отключение электричества: ПК выключается, бот встаёт
- Обрыв интернета: Нет связи = пропущенные сделки
- Обновления Windows: Автоматическая перезагрузка в 3 ночи = бот мёртв
- Вы: «Я только быстренько перезагружу ПК…»
Доступность: 95 % (для алготрейдинга неприемлемо)
Почему выигрывает облачный VPS
- Доступность 99,9 %: AWS, DigitalOcean, Linode
- Никаких отключений света: Резервное питание, бэкапы
- Быстрый интернет: Низкие задержки до брокерских API
- Автоперезапуск: Бот упал? Поднимется за 30 секунд
Издержки: 5-20 $ в месяц (самый дешёвый усилитель преимущества, который ты купишь)
Автоматизация — это не «настроил и забыл»
Ты выводишь бота. Он торгует месяц. Доля успешных: 65 %. Ровно как в backtest. Ты в восторге.
Месяц 2: доля успешных падает до 48 %. Ты в недоумении.
Что произошло?
Изменился рыночный режим. Твоя стратегия работает на трендовых рынках. Рынок ушёл в боковик. Бот продолжил торговать. Результаты просели.
🚨 Неудобная правда
Автоматизация усиливает твоё преимущество. Но она не подстраивается под смену режима сама.
Тебе всё равно нужно наблюдать, проверять и корректировать. Просто реже.
Ежемесячный чек-лист обслуживания бота
1. Показатели результата: Доля прибыльных в пределах 5 % от backtest? Средний R положительный? Drawdown приемлемый? Slippage ухудшился? 2. Журналы ошибок: Ошибки соединения, отклонённые заявки, пограничные случаи. 3. Проверка режима: Рынок всё ещё благоприятен для стратегии? VIX повышен → пауза. Низкая волатильность → пробоям тяжело.
🎓 Главное
- Автоматизация убирает эмоции, но не чинит плохую стратегию
- Начинай с Alpaca (акции) или Binance (крипта) ради простого доступа к API
- Торгуй на демо 3-6 месяцев, прежде чем выходить вживую
- Обработка ошибок критична: логика повторов, оповещения, аварийная кнопка
- Размещай бота на облачном VPS (5-20 $ в месяц) ради доступности 99,9 %
- Проверяй раз в месяц: результат, ошибки, соответствие режиму
📝 Практическое задание
Собери свой первый торговый скрипт на API
- Заведи демо-счёт в Alpaca
- Зарегистрируйся на alpaca.markets (бесплатное демо)
- Сгенерируй ключ API и секрет
- Установи библиотеку для Python:
pip install alpaca-trade-api
- Напиши простой скрипт стратегии
- Подключись к API Alpaca
- Запрашивай цену SPY каждые 60 секунд
- Реализуй базовую логику: если цена пересекает 20-периодную SMA снизу вверх, отправь заявку на покупку
- Добавь расчёт размера позиции (риск 2 % на сделку)
- Поставь стоп-лосс на -1R
- Добавь обработку ошибок
- Оберни вызовы API в блоки try/except
- Записывай все ошибки в файл
- Реализуй логику повторов (3 попытки)
- Протестируй 1 неделю на демо
- Следи за исполнением: заявки исполняются корректно?
- Проверь журналы: есть ли ошибки соединения?
- Разбери результат: он совпадает с твоим backtest?
Цель: Собери и запусти свой первый автоматический торговый скрипт в демо-режиме. Освой базу, прежде чем рисковать реальными деньгами.
🎮 Проверьте себя (без напряжения)
Вопрос 1: ты написал бота, который идеально работает на демо. Какой минимальный срок тестирования перед выходом вживую?
Вопрос 2: доля успешных сделок бота была 65 % в backtest, но вживую спустя 2 месяца она 48 %. Какая причина наиболее вероятна?
Если ты дочитал досюда, ты понял: автоматизация — не магия, а дисциплинированное исполнение в масштабе. Закодируй своё преимущество. Тестируй строго. Выводи осторожно. Наблюдай постоянно.
Связанные уроки
Машинное обучение в трейдинге
Используй ML-модели, чтобы генерировать автоматические торговые сигналы.
Читать урок →Продвинутый backtesting
Проверяй свои автоматические стратегии, прежде чем выводить их вживую.
Читать урок →Атрибуция результата
Разбирайся, какие автоматические стратегии дают вклад в доходность.
Читать урок →⏭️ Дальше
Урок #58: продвинутая теория портфеля — Современная теория портфеля, эффективная граница, паритет риска и профессиональные подходы к построению портфеля.
💬 Обсуждение (0 комментариев)
Загрузка комментариев…
Только в образовательных целях. Торговля сопряжена со значительным риском убытков. Это не финансовая консультация. Прошлые результаты не гарантируют будущих.