Как на Python написать свой паттерн и торговать с ним на Bybit
Привет, на связи Григорий, CTO Trade2Good. Алгоритмическая торговля — это не просто автоматизация кнопок «купить» и «продать» на бирже. В её основе лежит чёткая логика входа и выхода из позиции. Не простые шаблоны из сети, а именно та система, которую вы разрабатываете сами, с учетом своих наблюдений и понимания рынка.
В этом материале я покажу, как реализовать собственный торговый паттерн на Python. В качестве примера возьмем простую, но действенную идею: пробой и закрепление за пределами полос Боллинджера. Вы узнаете, как визуализировать сигналы на графике и как подключить эту логику к реальной торговле через API Bybit.
Почему стоит разрабатывать собственные паттерны
Если вы хотите строить эффективную и устойчивую торговую стратегию, вам неизбежно придётся отходить от универсальных индикаторов. Они хороши для базовой ориентации, но слишком общие и широко распространены.
Разработка собственной логики даёт ряд существенных преимуществ:
- Гибкость. Вы можете адаптировать стратегию под конкретный инструмент или рыночные условия.
- Снижение рыночного шума. Меньше ложных входов, особенно в период высокой неопределённости.
- Контроль над рисками. Вы сами задаёте, когда входить и выходить, какие фильтры использовать.
- Готовность к автоматизации. Собственный паттерн можно напрямую связать с API биржи и создать торгового бота.
Описание паттерна: пробой и закрепление за пределами полос Боллинджера
Идея довольно простая и основана на принципе импульсной торговли. Мы предполагаем, что если цена выходит за пределы полос Боллинджера и удерживается там, это может свидетельствовать о продолжении текущего движения.
Правила следующие:
- Сигнал на покупку: если две свечи подряд закрываются выше верхней полосы Боллинджера.
- Сигнал на продажу: если две свечи подряд закрываются ниже нижней полосы.
Такой подход помогает избежать преждевременных входов, когда цена лишь «проколола» границу, но быстро вернулась обратно.
Подготовка данных
1. Импорт необходимых библиотек
Для начала импортируем всё, что понадобится:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from ta.volatility import BollingerBands
import plotly.graph_objects as go
2. Загрузка и предобработка исторических данных
Мы будем использовать исторические свечные данные по BTC. Их можно, например, экспортировать с Bybit или другой платформы и сохранить в виде файла btc_data.csv.
# Загрузка данных
df = pd.read_csv("btc_data.csv")
# Преобразование временной метки в формат datetime
df['Open time'] = pd.to_datetime(df['Open time'])
# Установка времени в качестве индекса
df.set_index('Open time', inplace=True)
# Оставляем только нужные столбцы
df = df[['Open', 'High', 'Low', 'Close', 'Volume']]
# Убедимся, что данные отсортированы по времени
df = df.sort_index()
3. Расчет полос Боллинджера
Теперь добавим индикатор, который будет основой нашего паттерна.
# Расчет полос Боллинджера
bb = BollingerBands(close=df['Close'], window=20, window_dev=2)
df['bb_upper'] = bb.bollinger_hband()
df['bb_lower'] = bb.bollinger_lband()
Реализация паттерна «пробой и закрепление»
# Сигнал на покупку: две свечи подряд выше верхней полосы
df['buy_signal'] = (
(df['Close'].shift(1) > df['bb_upper'].shift(1)) &
(df['Close'] > df['bb_upper'])
)
# Сигнал на продажу: две свечи подряд ниже нижней полосы
df['sell_signal'] = (
(df['Close'].shift(1) < df['bb_lower'].shift(1)) &
(df['Close'] < df['bb_lower'])
)
Визуализация сигналов
import plotly.graph_objects as go
Создаем основной график цены с полосами Боллинджера
fig = go.Figure()
Линия закрытия
fig.add_trace(go.Scatter(x=df.index, y=df['Close'], mode='lines', name='Цена BTC', line=dict(color='black')))
Верхняя и нижняя полосы Боллинджера
fig.add_trace(go.Scatter(x=df.index, y=df['bb_upper'], mode='lines', name='Верхняя полоса Боллинджера', line=dict(dash='dot')))<br>fig.add_trace(go.Scatter(x=df.index, y=df['bb_lower'], mode='lines', name='Нижняя полоса Боллинджера', line=dict(dash='dot')))
Сигналы на покупку
fig.add_trace(go.Scatter(<br>x=df[df['buy_signal']].index,<br>y=df[df['buy_signal']]['Close'],<br>mode='markers',<br>name='Сигнал на покупку',<br>marker=dict(symbol='triangle-up', size=10, color='green')<br>))
Сигналы на продажу
fig.add_trace(go.Scatter(<br>x=df[df['sell_signal']].index,<br>y=df[df['sell_signal']]['Close'],<br>mode='markers',<br>name='Сигнал на продажу',<br>marker=dict(symbol='triangle-down', size=10, color='red')<br>))
Настройка графика
fig.update_layout(<br>title='Сигналы паттерна: Пробой и закрепление за полосами Боллинджера',<br>xaxis_title='Дата',<br>yaxis_title='Цена BTC',<br>legend=dict(x=0, y=1),<br>template='plotly_white',<br>hovermode='x unified'<br>)
fig.show()

Как применять на практике
- Бэктестинг: можно проверить, как сигналы работали на исторических данных.
- Автоматизация: библиотека
pybitпозволяет взаимодействовать с API Bybit — можно подключить сигналы к торговому роботу. - Фильтрация: сигналы можно усиливать с помощью объёма или других индикаторов.
Как использовать паттерн для торговли на Bybit с помощью Python
После того как вы реализовали и протестировали собственный паттерн (например, «пробой и закрепление за пределами полос Боллинджера»), следующим логичным шагом будет его интеграция в процесс реальной торговли. В данном случае — на бирже Bybit, через их официальное API.
Что потребуется:
- API-ключи от Bybit.Получить их можно в личном кабинете пользователя на официальном сайте: https://www.bybit.com
- Библиотека
pybit. Это официальный Python SDK от Bybit, позволяющий работать с их API. - Готовая логика сигналов. Вы уже написали код, который определяет сигналы на вход в позицию. Осталось связать эти сигналы с API-запросами к бирже.
1. Установка pybit
pip install pybit
2. Подключение к API Bybit
from pybit.unified_trading import HTTP
# Подключение к API
session = HTTP(
api_key='ВАШ_API_КЛЮЧ',
api_secret='ВАШ_SECRET',
testnet=True # True = тестовая среда (не бойтесь тестировать!)
)
⚠️ Важно: обязательно тестируйте на testnet перед переходом к реальным деньгам.
3. Пример функции для отправки ордера
def open_order(symbol: str, side: str, qty: float, price: float = None, order_type: str = "Market"):
"""Отправляет рыночный или лимитный ордер на покупку или продажу"""
try:
response = session.place_order(
category="linear", # Для USDT perpetual контрактов
symbol=symbol,
side=side, # 'Buy' или 'Sell'
order_type=order_type,
qty=qty,
price=price if order_type == "Limit" else None,
time_in_force="GoodTillCancel"
)
print(f"{side} ордер отправлен: {response}")
except Exception as e:
print(f"Ошибка при отправке ордера: {e}")
4. Связь паттерна с отправкой ордера
Добавим автоматическую торговлю при появлении сигнала.
latest_row = df.iloc[-1]
# Пример: покупаем 0.01 BTC, если есть сигнал
if latest_row['buy_signal']:
open_order(symbol='BTCUSDT', side='Buy', qty=0.01)
elif latest_row['sell_signal']:
open_order(symbol='BTCUSDT', side='Sell', qty=0.01)
Результат
Теперь у вас есть:
- Свой собственный паттерн, определяемый программно.
- Интерактивная визуализация через Plotly.
- Полностью работающая интеграция с Bybit, которая может открывать сделки по сигналу.
Риски и рекомендации
- Никогда не торгуйте сразу на реальные деньги — сначала используйте
testnet. - Обязательно добавьте ограничения: количество открытых позиций,
stop-loss,take-profit, логгирование. - Паттерн необходимо бэктестить и оптимизировать — это всего лишь пример логики.
Заключение
Полный исходный код паттерна и примера интеграции с Bybit доступен в репозитории на GitHub. Если материал оказался полезным, вы можете поддержать проект — поставьте звездочку на репозитория или подпишитесь на обновления.
Создание собственного паттерна — это первый шаг к построению системного подхода в трейдинге. Такой подход позволяет разрабатывать адаптивные стратегии, которые можно проверять, улучшать и масштабировать.
Паттерн, реализованный в этом примере, — всего лишь один из множества возможных. Его цель — показать базовый принцип: вы можете формализовать собственное рыночное наблюдение и превратить его в автоматическую торговую логику.
Продолжайте тестировать идеи, анализировать поведение рынка и развивать свою торговую систему. Именно такой путь даёт наилучшие шансы на устойчивые результаты.