Введение
В этой статье представлен простой бот для торговли на бирже Binance.
Бот создает ордер на покупку, основываясь на средней цене из указанного количества предложений на покупку, после чего отслеживает его. Если ордер не выполнен в течении определенного количества времени, ордер отменяется. Если ордер исполнен, выставляется ордер на продажу с указанным профитом. После исполнения ордера на продажу торговля идет по новому кругу.
Поддерживается торговля по нескольким парам, по умолчанию бот работает с комиссией BNB, но поддерживается так же торговля с обычным видом комиссии.
Об особенностях торговли
Цены и объемы
Binance, в отличии от многих бирж, жестко регламентирует размеры лотов и порядки цен. Нельзя купить произвольное количество валюты по произвольному курсу - для каждой пары заведены ограничения, которых необходимо придерживаться при создании ордера.
Существует шаг цены – например, для пары NEOUSDT цена должна быть кратной 0.00100000. Нельзя выставить ордер по цене, 0.1234 – можно либо 0.123, либо 0.125.
Существует шаг продаваемых/покупаемых монет – например, для пары NEOUSDT шаг объема 0.001 – поэтому не получится продать или купить 123.45678 – можно либо 123.456, либо 123.457.
Ну, и как везде, нельзя создавать ордера меньше указанного объема.
Эти ограничения находятся можно получать через api-метод exchangeInfo (подробности о работе API Binance тут), нужная информация находится в разделе filters по каждой паре. Для цены это tickSize, для объема stepSize в соответствующих структурах данных.
Бот учитывает эти ограничения, но обратите внимание, как меняется цена торгов:
Допустим, вы собираетесь торговать на 11 USDT.
Бот получает цены из стакана – например, 5 цен - [118.753, 118.750, 118.730, 118.712, 118.704]. Берет среднюю - 118,7298. Т.к. минимальный шаг цены 0.001, то берется цена 118,729 (в нижнюю сторону).
После этого бот вычисляет количество валюты, которое можно купить по этой цене – делит 11 USDT на 118,729, получает 0,092648. Т.к. минимальный шаг по монетам 0.001, то выбирается количество 0,092.
В итоге бот покупает 0.092 NEO по курсу 118,729 – и итоговая сумма торгов составит 10,923068. Это меньше, чем указано в настройках, но бот вынужден подстраиваться под требования биржи.
При продаже бот будет продавать так, чтобы получить 10,923068 + нужный процент профита.
Комиссии
У бинанса своя система взимания комиссии. Точнее, их две. По умолчанию, используется такой вид комиссии – неважно, по какой паре вы торгуете, комиссия списывается с вашего счета в валюте BNB. BNB – это собственная валюта Binance, подробнее я расскажу о ней отдельно, но суть такая:
Вы, например, торгуете NEO-USDT. Совершаете покупку по курсу X, рассчитывая купить Y монет NEO и потратить Z USDT. Вы выставляете ордер, он исполняется, и вы получаете Y монет NEO, потратив Z USDT. Вы, как бы, ничего не потеряли на этих торгах – но с вас списалось S монет BNB.
В общем-то, это хорошо – потому что Binance даёт скидку. Оплачивая комиссию через BNB, вы платите на 50% меньше. Теоретически, если комиссия 0.1%, то оплачивая комиссию таким образом, вы платите 0.05% с каждой сделки. Бот рассчитан в первую очередь на такую комиссию, и рекомендуется использовать именно её. Если вдруг вы хотите торговать с обычным видом комиссии, то зайдите в свой профиль и переключите флажок:
После этого в боте нужно будет поменять переменную
USE_BNB_FEES = True
На
USE_BNB_FEES = False
Правда, я не вижу, зачем бы вам это делать. В любом случае, если вы раньше не торговали на Binance, то первым делом нужно прикупить немного BNB. Прикупить, и пусть лежат. Если вы, тем более, будете торговать с базовой парой BNB, вам это будет на руку.
Как лучше пользоваться ботом
Бот покупает чуть ниже текущего курса, и продает с профитом, чуть задирая цену. Т.к. цена имеет тенденцию то расти, то падать, вполне вероятна такая ситуация, что бот купит, выставит на продажу, и будет долго ждать роста. Что бы снизить количество таких ситуаций, лучше отслеживать обстановку и запускать бота по тем парам, которые обещают рост.
Такой вывод вы можете сделать, либо используя индикаторы, либо новости – например, если валюту добавили на биржу, скорее всего она первое время будет расти. Если IBM решил вложиться в Etherium, скорее всего эфир будет расти. Если MACD и RSI показывают сигналы к покупке, скорее всего будет расти, и т.п.
Выбрав пару для торгов, вы останавливаете бота (если запущен), и добавляете пару в конфиг, вот так:
"""
Пропишите пары, на которые будет идти торговля.
base - это базовая пара (BTC, ETH, BNB, USDT) - то, что на бинансе пишется в табличке сверху
quote - это квотируемая валюта. Например, для торгов по паре NEO/USDT базовая валюта USDT, NEO - квотируемая
"""
pairs = [
{
'base': 'USDT',
'quote': 'BTC',
'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
# Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
'spend_sum': 11, # Сколько тратить base каждый раз при покупке quote
'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
},{
'base': 'USDT',
'quote': 'NEO',
'offers_amount': 5, # Сколько предложений из стакана берем для расчета средней цены
# Максимум 1000. Допускаются следующие значения:[5, 10, 20, 50, 100, 500, 1000]
'spend_sum': 11, # Сколько тратить base каждый раз при покупке quote
'profit_markup': 0.005, # Какой навар нужен с каждой сделки? (0.001 = 0.1%)
}
]
Пар можно добавлять любое количество, угрозу бана это не спровоцирует, просто отдельные пары будут реже проверяться, но ответы сервера тут шустрые, так что это особо не скажется на производительности.
Если же вы думаете, что ситуация становится опасной, и пора бы прекратить торги, то дождитесь, когда бот выставит ордер на продажу, остановите бота, и удалите пару из конфигурации. Бот продолжит отслеживать ордер на продажу, но новых покупок создавать не будет.
Если вы отменили ордера или что-то еще сделали на бирже, но бот «запомнил» и теперь проверяет несуществующие ордера, у вас есть два варианта:
- Удалите файл binance.db из папки с ботом. Это вынудит бота начать всё с чистого листа, и он начнет работать с нуля по всем парам из конфигурации. Открытые ордера на бирже пропадут из его надзора, и вам нужно будет разрешить их судьбу самостоятельно.
- Если вы не хотите терять открытые ордера по другим парам, то откройте файл binance.db с помощью программы SQLiteStudio, Вы запустите программу, добавите базу данных через обзор, там откроете таблицу orders и удалите оттуда только нужный ордер. Кстати говоря, т.к. бот записывает все свои покупки и продажи, с помощью этой программы вы можете выгружать историю торгов бота в Excel и анализировать.
Установка и запуск
- Зарегистрироваться на Binance (если еще не сделали, вот инструкция)
- Пополнить баланс
- Убедиться, что на балансе есть BNB (если нет, докупить чуток)
- Получить API-ключи (инструкция). Потребуется включить двухфакторную авторизацию, я советую использовать SMS, но можно и Google Authenticator.
- Установить Python версии 3.6 и выше. Прямую ссылка на скачивание я не указываю, т.к. к моменту прочтения статьи все может измениться, вам нужно зайти на официальный сайт по ссылке https://www.python.org/downloads/, скачать и установить Python 3.6 и выше (кнопка слева). При установке поставьте все галочки. В идеале, выберите расширенный режим установки (advanced) и поставьте все галки там – нужны будут права администратора.
- Скачать архив с ботом.
- Распаковать в любую директорию на компьютере
- Запустить файл setup.bat – установятся нужные модули (для надежности, запустите и так, и от имени администратора)
- Открыть файл binance_bot.py в текстовом редакторе и прописать API-ключи и настройки (об этом ниже)
- Запустить файл run.bat – запустится бот и начнет зарабатывать деньги.
Остановить бота можно закрыв окно крестиком.
Настройка
Настроек не так много, в API_KEY и API_SECRET нужно прописать ключи, которые вы получили на бирже.
В пары нужно прописать соответственно пары, на которые планируете торговать, максимальную сумму, которую планируете тратить, и желаемый процент прибыли. С этим есть некоторый момент, т.к. вы платите комисиию BNB. Я советую ставить 0.003 (0.3%) и выше, но если у вас есть возможность дешево получать BNB, то можно и меньше.
BUY_LIFE_TIME_SEC – через сколько отменять ордер на покупку (если он не исполнен), в секундах.
STOCK_FEE – комиссия биржи, если вдруг решите торговать без BNB.
USE_BNB_FEES = True – если торгуете с BNB, False – в противном случае.
ВСЁ!
Я гонял этого бота несколько дней, меня не забанили, я немного увеличил количество USDT – так что я со спокойной душой передаю вам бота и его исходный код. Вы можете модифицировать его под свои нужды, или обратиться за доработкой.
Я желаю вам хороших заработков, если в процессе эксплуатации будут выявлены какие-то проблемы, или возникнут вопросы, смело пишите в комментарии или лично мне, контакты есть в профиле.
Внимательно слежу за ваши ботами. Визуально выделил три стадии эволюции:
1. Простой бот
2. С индикатором
3. С индикатором и плавающей ценой продажи.
Пробовал все три вида + небольшие доработки. У всех трёх ботов есть общий недостаток - возможность зависания на верхах. Связано это с тем, что прибыль фиксируется на продажи с учётом двух комиссий за покупку и продажу. Для этого нужен хороший тренд вверх.
Есть идея - сделать бота с индикатором и закладывать комиссию и в покупку и продажу + прибыль. При определении цены покупки/продажи отталкиваться от предыдущей цены сделки + комиссию + прибыль. Соответственно тренд на повышение/уменьшение нужен будет меньше. Интересует ваше мнение на этот счёт. Не собираетесь ли вы реализовать нечто подобное?
P.s. спасибо вам за выложенных ботов.
Самый первый бот для Эксмо торгует именно по такой логике - он снижает цену при покупке, делая покупки реже, но зато не так сильно завышает цену продажи, т.к. она уменьшается на размер комиссии.
Кому-то это нравится, кому-то нет. Кто-то хочет покупать по цене продажи, кто-то готов торговать до упора, а последний лот продавать в минус. Лично мне нравится, но я стараюсь держать код максимально простым, что бы каждый мог разобраться, а иногда даже достичь желаемого, поправив всего пару строчек.
Проверил, торгуя по паре BTCXVG на макс. сумму 0.0015BTC. Создался ордер на покупку по курсу 0.00000764 на 196 XVG на сумму 0.00149744, потом прошла продажа 196 XVG по курсу 0.00000768 на сумму 0.00150528
"python" не является внутренней или внешней
командой, исполняемой программой или пакетным ф
Для продолжения нажмите любую клавишу . . .
Если вкратце, питон должен быть добавлен в переменную окружения PATH, вы можете прописать его туда сами без переустановки. Так же вы можете открыть run.bat в блокноте, и поменять python на полный путь к файлу python.exe - C:\Users... Но проще переустановить и все сделается само
Какую ошибку?
Вы пробовали запускать setup от имени администратора?
Переустановите питон и установите все галки при установке.
Если делать exe то людям будет сложнее настраивать бота под себя, смотреть код и т.п.
Один из способов решения - https://bablofil.ru/weighted-average/
Я не вижу ошибок, обычные отладочные сообщения, кажется, все в порядке
Скажите, как уменьшить частоту запросов бота к бирже? Может срабатывает защита самой биржи?
Пример: после покупки бот создает не лимит-ордер, а стоп-лосс ордер (например 5,10,15,%), но в памяти сохраняет желаемую цену продажи (например 3,5,10%) и когда цена доходит до отметки продажи -+ 0.5-1%, меняет стоплос на лимит ордер. вот как то так. либо просто меняет стоплос на цену продажи. потому что на верхах можно не хило залететь если не сидеть у монитора, даже если цена растет.
Такая проблема что бот всё время ставит цену чуть меньше чем торги и не может ничего купить - только в убыток.
Время вроде проверял.
спасибо
Скажите, а как запустить файлы bat если компьютер на macOS?
а после запустить через python Run python Shell ?
а на виртуальную машину реально его поставить?
Есть какие то кричные изменения в настройках пар, что с параметрами было «все плохо»? Эдакий метод от противного
Так что в любой момент можно открыть текстовый файл и обстоятельно всё просмотреть)
Но я стараюсь выкладывать не слишком перегруженных ботов, что бы любой мог разобраться и прикрутить что ему угодно
Если запускать двух ботов (каждого в своей папке) то можно играть на одну и ту же пару, один бот другому мешать не будет
Как можно сделать, чтобы бот торговал определенное количество раз. Т.е. не торговал по кругу, а, например, только N-количество раз?
Скачайте код бота по новой
Там другая логика у бинанса, грубо говоря при падении цены до определенного уровня родится ордер по указанной цене.
Кроме как ботом я вариантов не знаю)
Запустил только что бота, проверил, такой ошибки нет, попробуйте создать новые API ключи и запустить с ними, может что-то с правами
недавно Бинанс провел изменения в API и Ваш пример бота перестал работать, подскажите пожалуйста что подкорректировать в коде. Может быть даже выпустить статейку было бы идеально. Спасибо
avg_price = sum(prices) / len(prices)
на
perc = 0.01
avg_price = prices[0] * (1- perc)
ну и по хорошему сменить название переменной, вынести perc на самый верх и т.п.
0.01 это 1%
Очень интересная у вас идея.
Хотел посмотреть ваш бот, но по указанной ссылке, к сожалению, информация не доступна.
Скиньте, пожалуйста, новую ссылку?
Очень интересная у вас идея.
Хотел посмотреть ваш бот, но по указанной ссылке, к сожалению, информация не доступна.
Скиньте, пожалуйста, новую ссылку?
Не понял из описания :( Бот работает в режиме усреднения, или просто купил по одной цене и выставляет по цене = цена покупки + провит + комиссия.
Качаем, запускаем в Питоне (предложит при скачивании) --- профит
Да, нужно поставить
STOCK_FEE = 0.00075
Я обновил архив с ботом
Можете, конечно, доработать бота, что бы он помечал в БД такие ордера отмененными, но проще будет либо удалить базу целиком, либо удалить ордер руками из базы, тогда бот про него забудет.
Нужно в STOCK_FEE установить актуальную комиссию, она будет закладываться и в покупку, и в продажу, немного изменятся цены, а профит по прежнему будет указываться отдельно, как и с BNB.
Можно ли сделать так, чтобы после срабатывания stop loss прекращалась подача новых ордеров, а именно останавливалась торговля?
опять последние строчки выглядят не так, как в оригинале. Видимо часть символов воспринимается как команды форматирования и при отправке комментария несколько искажают порядок слов.
Вы скачали новый архив с ботом?
И второй вопрос, при добавлении несколько валютных пар, выставляет ордера только на первую валютную пару. Как исправить?
Вы можете скачать и установить среду разработки pyCharm, например, и редактировать настройки в ней, там ошибки либо будут исправлены, либо подчеркнуты
Проблема именно в том что он первый раз отредактированного бота запускает, может запустить после редактирования еще 2-3 раза, а потом при запуске бот перестает работать. Могу даже настройки не менять, просто закрыть бота, открыть и все он не работает.
Может его стоит редактировать не закрывая?
Я одно время подозревал винду, но то же самое повторилось на линуксе. Потом я перенес код с питона на яву, но это повторилось снова и там и там. Но, скажем с C++ или golang я таких проблем не наблюдал, в силу наверное того, что они ближе к ядру системы..
В данном случае я могу посоветовать запускать бота на сервере - https://bablofil.ru/kak-zapustit-bota-na-servere/
Первые два месяца по моей ссылке будут бесплатно, и бот будет работать намного стабильнее и быстрее.
Удалите файл *.db в папке с ботом, он с начала всё начнет по всем парам
Соответственно если нужно поменять, нужно остановить бота (после продажи всех ордеров) и поменять настройки
Например, ETH_BNB - вы можете увеличивать баланс как ETH, так и BNB, но если кто-то из них падает к BTC, то расчетный баланс BTC уменьшается, т.к. хотя монет становится больше, купить BTC на них вы можете всё меньше.
Аналогично, если у вас есть 100 рублей, но доллар растет, то ваш баланс в пересчете на доллары уменьшается, хотя 100 рублей как лежали так и лежат в кармане.
В общем, если курс BTC растет, а у вас вложено в другие монеты, то _расчетный_ баланс в BTC уменьшается (то, что на странице funds отображается).
Вам стоит проверить и настроить что-то у себя, такое уже бывало
Ставьте и используйте самую последнюю с сайта, 3.7.4 уже, другое поколение
Соответствено грубо говоря 60% времени за ночь график проседал и 40% поднимался
Меньшая часть сделок сыграла в плюс, бОльшая в минус
Бот продавал при каждом падении на 0.1% из за стоплосса, и продавал с прибылью при росте на 0.4, какое событие наступило раньше то и сработало
Тут не знаю, как бы вы руками торговали? Можно отключить стоп-лосс, можно увеличить его, можно увеличить навар и т.п.
Убрать другие пары из настроек, какие пары пропишите, на таких и будет торговать.
Запустил сегодня бота на пару XRP_BNB, бот закупился по цене 0,01464 и выставил ордер на продажу по цене 0,01486. Разница между покупкой и продажей 1,5%, а в настройках бота у меня выставлено 0,5%. Поэтому возник такой вопрос.
Замените
avg_price = sum(prices) / len(prices)
На
avg_price = prices[0]
А больше в логе ничего нет?
А еще уберите на всякий случай пробелы из пути к боту, положите его например в папку C:/bot или D:/bot
Берем price, берем кол-во монет, перемножаем, вычитаем комиссию, получаем итоговую сумму вырученных денег.
Сравниваем с затраченными на покупку, и вот точное кол-во в USDT или какой-то еще валюте.
Подскажите, пожалуйста, реально ли физически реализовать в боте следующий алгоритм? Возможно кто-то делал что-то подобное, буду очень признателен, если есть возможность поделиться.
- бот следит за инд. RSI, при достижении значения, к примеру, <=30, бот ждет пересечения на индикаторах MACD и STOCHRSI, как только оба индикатора "заворачивают" (пересекаются линии), происходит контрольная проверка уровня RSI, и если по прежнему на уровне <=30 - происходит открытие сделки
Есть ли готовый бот с такой стратегией (если не ошибаюсь, называется сеткой)?
Покупаем когда курс 100 и сразу создаем несколько ордеров (для примера 3 штуки) на продажу с шагом 1$, т.е. 101,102,103
И тут же ордера на покупку с таким же шагом, 99,98,97.
Если срабатывает ордер на продажу с ценой 101, то создаем ордер на покупку 101-1$, т.е. 100, и тут же создается ордер на продажу по курсу 104.
Или что-то подобное.