Бот для Binance с индикаторами

Время от времени мне пишут, что хотели бы использовать моего бота для бинанса с таким-то индикатором или в такой-то связке индикаторов для реализации своей стратегии. Раз уж мы закончили цикл статей про индикаторы, давайте применим их в реальной жизни?

Отличия в новой версии:

  1. Стало больше файлов. Ваши настройки нужно прописывать в файле config.py
  2. Бот совершает абсолютно все сделки по рынку.
    1. Вначале, если индикаторы позволяют (об этом ниже), бот создает ордер на покупку по рынку. После создания бот получает с биржи историю сделок и считает средневзвешенную цену (как и то, что вы видите на Binance) в истории торгов.
    2. После того, как ордер на покупку исполнен, бот проверяет текущий курс (в стакане на покупку), и, если рост превысил заданное в конфиге, то продает по рынку. После продажи опять же получает историю сделок и считает курс для истории.
    3. Если включен флаг stop-loss, то бот продает по рынку, когда цена падает на указанный процент.
  3. Бот работает в два потока, один из которых собственно бот, другой синхронизирует время с биржей. Это нужно для тех случаев, когда время постепенно расходится в процессе работы бота.
  4. Убрано всё, что связано с комиссией. Во-первых, бот покупает по рынку и ему плевать на комиссии, во вторых сейчас помимо BNB|НеBNB комиссий появились разные ставки maker/taker для разных уровней участников, и еще возможна ситуация, когда часть комиссии снята в BNB, потом монеты кончились и часть снялась в остальной валюте. Для простого бота обработку всех этих событий считаю излишней, просто держите BNB на балансе и не снимайте галочку.

Теперь собственно про индикаторы (и вообще алгоритм работы).

Рассказываю с самого начала.

  1. Нужно скачать архив с ботом. Распаковать его в любую папку по вашему выбору
  2. Вам нужен установленный python версии 3.6 и выше, скачайте его с официального сайта и установите все галочки.
  3. Запустите setup.bat в папке с ботом.
  4. Откройте файл config.py в папке с ботом и укажите настройки. 
    1. Нужно будет прописать API-ключи (откуда их взять расписано тут)
    2. Указать пары, по которым собираетесь торговать
    3. Суммы для торгов
    4. Признак active пары позволяет пропускать пару, если не хотите её использовать (по ней не будут создаваться новые ордера на покупку)
    5. KLINES_LIMITS – сколько свечей бот должен получать при построении индикаторов
    6. TIMEFRAME – по каким свечам собираетесь работать с индикаторами (в примере – с часовыми)
  5. В принципе бот готов к работе, но нужно еще настроить вашу торговую стратегию. Я думал убрать её в отдельный файл, но решил, что вас это еще больше запутает. Вот суть:

Индикаторы

В файле binance_bot.py  есть вот такой вот фрагмент кода:

log.debug("Проверяем индикаторы")
# Получаем свечи и берем цены закрытия, high, low
klines = bot.klines(
    symbol=pair_name.upper(),
    interval=TIMEFRAME,
    limit=KLINES_LIMITS
)

closes = [float(x[4]) for x in klines]
high = [float(x[2]) for x in klines]
low = [float(x[3]) for x in klines]

# Скользящая средняя
sma_5 = ta.SMA(closes, 5)
sma_100 = ta.SMA(closes, 100)

ema_5 = ta.EMA(closes, 5)
ema_100 = ta.EMA(closes, 100)

enter_points = 0

if ema_5[-1] > ema_100[-1] and sma_5[-1] > sma_100[-1]:
    # Быстрая EMA выше медленной и быстрая SMA выше медленной, считаем, что можно входить
    enter_points += 1

macd, macdsignal, macdhist = ta.MACD(closes, 12, 26, 9)
if macd[-1] > macdsignal[-1] and macdhist[-1] > 0:
    # Линия макд выше сигнальной и на гистограмме они выше нуля
    enter_points += 1.3

rsi_9 = ta.RSI(closes, 9)
rsi_14 = ta.RSI(closes, 14)
rsi_21 = ta.RSI(closes, 21)

if rsi_9[-1] < 70 and rsi_14[-1] < 70 and rsi_21[-1] < 70:
    # RSI не показывает перекупленности
    enter_points += 2

fast, slow = ta.STOCH(high, low, closes, 5, 3, 3)
if fast[-1] > slow[-1]:
    # Быстрая линия стохастика выше медленной, вход
    enter_points += 1.5

fast, slow = ta.STOCHRSI(closes, 14, 3, 3)
if fast[-1] > slow[-1]:
    # Быстрая линия STOCHRSI выше медленной, вход
    enter_points += 1.8

upper, middle, lower = ta.BBANDS(closes, ma_period=20)
if high[-1] > upper[-1]:
    # Свеча пробила верхнюю полосу Боллинджера
    enter_points += 3

log.debug("Свеча набрала {b} баллов".format(b=enter_points))
if enter_points <  POINTS_TO_ENTER:
    log.debug("Минимальный проходной балл {b}. Пропуск пары".format(b=POINTS_TO_ENTER))
    continue

Я его набросал для примера, просто что бы дать вам понимание что и как настраивается. Эта торговая стратегия не является какой-то там оптимальной или известной. Вы можете добавлять или убавлять куски кода так, как вам будет удобнее. Пробегусь по логике:

Работа с индикаторами происходит только перед созданием ордера на покупку, фактически это принятие решения, стоит ли входить в торги.

Сначала мы получаем с биржи свечи по текущей паре:

klines = bot.klines(
    symbol=pair_name.upper(),
    interval=TIMEFRAME,
    limit=KLINES_LIMITS
)

Формируем массивы с ценами закрытия (а также high и low)

closes = [float(x[4]) for x in klines]
high = [float(x[2]) for x in klines]
low = [float(x[3]) for x in klines]

Строим для начала скользящие средние SMA и EMA (это и все что дальше касается индикаторов можно смело менять и удалять).

# Скользящая средняя
sma_5 = ta.SMA(closes, 5)
sma_100 = ta.SMA(closes, 100)

ema_5 = ta.EMA(closes, 5)
ema_100 = ta.EMA(closes, 100)

Проверяем, если последнее значение SMA с периодом 5 выше последнего значения SMA с периодом 100, и если тоже самое справедливо для EMA, то присваиваем одно очко в копилку. Значения могут быть любыми.

if ema_5[-1] > ema_100[-1] and sma_5[-1] > sma_100[-1]:
    # Быстрая EMA выше медленной и быстрая SMA выше медленной, считаем, что можно входить
    enter_points += 1

Если # Линия макд выше сигнальной и на гистограмме они выше нуля, то присваиваем еще 1.3 и т.п. Там вы найдете RSI, STOCH, STOCHRSI, и Боллинджера, по тем же приницпам.

macd, macdsignal, macdhist = ta.MACD(closes, 12, 26, 9)
if macd[-1] > macdsignal[-1] and macdhist[-1] > 0:
    # Линия макд выше сигнальной и на гистограмме они выше нуля
    enter_points += 1.3

В итоге, после того как все индикаторы построены и наши веса посчитаны, можно принимать решение. В данном случае у меня в конфиге стоит проходной балл 7 (параметр POINTS_TO_ENTER), а суммарно можно набрать 10.6, если все индикаторы сработают.

В большинстве случаев какие-то индикаторы будут срабатывать а какие то нет, я проставил 3 очка Боллинджеру, если есть пробитие то это почти на половину увеличивает шансы пары войти на рынок. Если сработают только скользящие, то пара получит одно очко.

Ваша задача подобрать индикаторы, веса и проходной балл так, что бы реализовалась ваша торговая стратегия. Например, если вы используете только MA200 и RSI, и хотите войти на рынок, когда они сработают вдвоем, удалите всё лишнее, дайте каждому из них по 1 и сделайте проходной бал 2. Если достаточно сработки хотя бы одного из них, сделайте проходной балл 1.

Все доступные индикаторы вы можете найти в файле bablofil_ta.

Надеюсь, этот бот поможет вам отлаживать/настраивать/проверять свои или чужие торговые стратегии, а также принесет прибыль при грамотной настройке.

Вы всегда можете остановить бота, поменять настройки (например прибыльности или стоп-лосса) и бот подхватит для всех пар, даже для тех, по которым есть ордера. Если хотите начать все заново, удалите файл binance.db из папки с ботом, это его база данных, он создаст новую при запуске.

В общем удачи и профита вам и вашим роботам.

Задавайте вопросы в комментариях, пишите на форуме.


Это статья из цикла "Популярно о бирже"
Все статьи цикла:

Последнее изменение:

Не забудьте рассказать друзьям об этой статье.
Чтобы поддержать ресурс Bablofil достаточно просто поделиться с друзьями этой статьей в социальных сетях. Каждый репост - это самая высокая оценка качества материала. Спасибо, что читаете этот блог.



Комментарии
23.06.2019 22:16:02
после запуска и остановки в линуксе через ctrl+C и последующего перезапуска после изменения настроек - постоянно выходит ошибка

2019-06-23 23:12:25,782 [DEBUG] Получаем все неисполненные ордера по БД
2019-06-23 23:12:25,782 [DEBUG] Получены неисполненные ордера из БД: [('319031353', 'ETHUSDT'), ('78903358', 'TRXUSDT'), ('59534674', 'ETCUSDT')]
2019-06-23 23:12:25,785 [DEBUG] Starting new HTTPS connection (1): api.binance.com:443
2019-06-23 23:12:31,366 [DEBUG] https://api.binance.com:443 "GET /api/v3/order?symbol=ETHUSDT&orderId;=319031353&timestamp;=1561320744000&signature;=ххххххххх HTTP/1.1" 400 None
2019-06-23 23:12:31,367 [ERROR] 'status'
Traceback (most recent call last):
  File "./binance_bot.py", line 43, in main_flow
    order_status = stock_order_data['status']
KeyError: 'status'
Проголосовать Проголосовать
0 0
24.06.2019 09:39:36
Биржа отвечает с кодом 400, это значит что она не может обработать входящий запрос. А настройки API ключей не менялись? Может там пробелы какие..
Проголосовать Проголосовать
0 0
24.06.2019 13:32:26
Разобрались, обновлен код бота в архиве
Проголосовать Проголосовать
0 0
03.07.2019 23:10:52
Добрый день! Спасибо за Ваш труд.
Протестировал бота - вход происходит в торги удачно: по маркету было куплено три монеты когда условия сложились до 7 входных баллов, однако когда курс купленных монет превысил на утро более 1 процент - продажа не осуществилась ни по одной из них. Пришлось все скидывать вручную.
Можно ли настроить чтобы на продажу выставлялся ордер?
Проголосовать Проголосовать
0 0
05.07.2019 16:52:27
Ордер должен выставляться, когда рост монеты превысит курс, указанный в настройках, может быть в настройках указан большой процент?
Или столкнулись с какой то ошибкой в логах?
Проголосовать Проголосовать
0 0
06.07.2019 02:29:30
Процент указан 1% (ваши настройки по умолчанию, кроме валютных пар и количества закупа), валюта выросла на 2 % - в логах ошибок не было. Но по маркету не продалась ни одна из закупленных пар.
Проголосовать Проголосовать
0 0
20.07.2019 14:16:02
после запуска и остановки  - постоянно выходит ошибка?????? Что делать????
C:\binance_bot_v2\binance_bot_v2>setup.bat
C:\binance_bot_v2\binance_bot_v2>pip install requests
Requirement already satisfied: requests in c:\users\admin\appdata\local\programs\python\python37\lib\site-packages (2.22
.0)
Requirement already satisfied: chardet<3.1.0,>=3.0.2 in c:\users\admin\appdata\local\programs\python\python37\lib\site-p
ackages (from requests) (3.0.4)
Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in c:\users\admin\appdata\local\programs\python\p
ython37\lib\site-packages (from requests) (1.25.3)
Requirement already satisfied: idna<2.9,>=2.5 in c:\users\admin\appdata\local\programs\python\python37\lib\site-packages
 (from requests) (2.8)
Requirement already satisfied: certifi>=2017.4.17 in c:\users\admin\appdata\local\programs\python\python37\lib\site-pack
ages (from requests) (2019.6.16)

C:\binance_bot_v2\binance_bot_v2>pause
Для продолжения нажмите любую клавишу . . .

C:\binance_bot_v2\binance_bot_v2>run.bat
Traceback (most recent call last):
  File "./binance_bot.py", line 11, in <module>
    from config import (bot, pairs, log, TIMEFRAME, KLINES_LIMITS, POINTS_TO_ENTER, USE_OPEN_CANDLES)
  File "C:\binance_bot_v2\binance_bot_v2\config.py", line 24
    'active': True,
           ^
SyntaxError: invalid syntax
Для продолжения нажмите любую клавишу . . .

C:\binance_bot_v2\binance_bot_v2>run.bat
Traceback (most recent call last):
  File "./binance_bot.py", line 11, in <module>
    from config import (bot, pairs, log, TIMEFRAME, KLINES_LIMITS, POINTS_TO_ENTER, USE_OPEN_CANDLES)
  File "C:\binance_bot_v2\binance_bot_v2\config.py", line 24
    'active': True,
           ^
</module></module>
Проголосовать Проголосовать
0 0
22.07.2019 22:08:49
Еще было бы прикольно реализовать нечто вроде дельта-функции для МА и ЕМА, что бы бот закупался при условии, что длинная скользящая идет наверх. А так работа выше всяких похвал)
Проголосовать Проголосовать
0 0
Пожалуйста, авторизуйтесь, что бы оставить свой комментарий
Крипто-кошельки для помощи и благодарности проекту:

Bitcoin адрес проекта: [[address]]

Перевод на сумму [[value]] BTC получен. Спасибо!.
[[error]]

Ethereum адрес проекта: [[address]]