Узнайте, как создать собственного бота DCA для Binance и запускать его по личному расписанию.
Если вы какое-то время были частью криптовалютного пространства, вы наверняка слышали об усреднении стоимости в долларах или DCA. Если вы не слышали о DCA, это инвестиционная стратегия, которая предполагает покупку фиксированного количества актива через равные промежутки времени, независимо от его цены. Идея DCA заключается в том, чтобы уменьшить влияние волатильности рынка на доходность ваших инвестиций в долгосрочной перспективе.
Учитывая популярность этой стратегии, большинство крупных бирж представили функции, которые позволяют пользователям планировать свои повторяющиеся покупки в течение заранее определенного интервала времени, поэтому пользователи могут установить ее и забыть о ней в надежде получить вознаграждение за их постоянство в будущем. Однако при ближайшем рассмотрении вы обнаружите, что биржи склонны использовать популярность этой стратегии для обмана своих пользователей. Например, когда я первоначально настроил DCA в Binance.US, я заметил, что ордера будут постоянно выполняться по очень невыгодной цене. Я говорю о различиях около 1% или выше. У Gemini есть аналогичный продукт, который также берет огромную комиссию, вынуждает пользователей покупать по ужасной цене и взимает большую комиссию за транзакцию за банковские депозиты, необходимые для пополнения счета для облегчения DCA. Это связано с тем, что биржи понимают, что они могут присвоить себе разницу между рыночной ценой и ценой DCA, тем самым создавая для себя фантастический источник стабильного дохода.
Увидев эти хищнические методы, я задумался о создании сценария, который мы можем настроить на нашей локальной машине и который будет выполнять наши повторяющиеся покупки по справедливой рыночной цене по заранее определенному графику. Кроме того, выбрав путь «сделай сам», мы даже можем изменить классическую стратегию DCA на нечто более продвинутое. А пока давайте создадим простого бота DCA, и мы можем рассмотреть его усовершенствование в следующих статьях.
На самом базовом уровне мы можем создать скрипт Python внутри бесконечного цикла, который будет выполнять наши покупки, а затем останавливаться до тех пор, пока не наступит следующий период времени. Этот подход, очевидно, подвержен многим потенциальным сбоям, и его будет сложно поддерживать. Однако, если вы используете систему на основе Unix, вам повезло, потому что есть отличный инструмент под названием Cron, который может помочь вам управлять автоматизацией сценариев. Пользователи Windows могут добиться аналогичного результата с помощью планировщика заданий, о котором я расскажу в другой статье.
Реализация заказа
Прежде чем перейти к автоматизации Cron, давайте сначала напишем наш базовый скрипт DCA для Binance.US:
import urllib.parse import hashlib import hmac import base64 import requests import time # get binance us signature def get_binanceus_signature(data, secret): postdata = urllib.parse.urlencode(data) message = postdata.encode() byte_key = bytes(secret, 'UTF-8') mac = hmac.new(byte_key, message, hashlib.sha256).hexdigest() return mac # Attaches auth headers and returns results of a POST request def binanceus_request(uri_path, data, api_key, api_sec): headers = {} headers['X-MBX-APIKEY'] = api_key signature = get_binanceus_signature(data, api_sec) payload={ **data, "signature": signature, } req = requests.post(("https://api.binance.us" + uri_path), headers=headers, data=payload) return req.json() def perform_trade_binance(symbol, side, quantity): api_key='BINANCE_US_API_KEY' secret_key='BINANCE_US_SECRET_KEY' uri_path = "/api/v3/order" data = { "symbol": symbol, "side": side, "type": 'MARKET', "quantity": quantity, "timestamp": int(round(time.time() * 1000)) } result = binanceus_request(uri_path, data, api_key, secret_key) return result def main(): symbol='BTCUSD' side='BUY' # get latest ask price for symbol from Binance.US last_ask_price = float(requests.get("https://api.binance.us/api/v3/ticker/bookTicker?symbol=" + symbol.upper()).json()['askPrice']) quantity = 10/last_ask_price print(perform_trade_binance(symbol, side, round(quantity, 5))) if __name__ == "__main__": main()
Разберем код. Первые три метода будут отвечать за отправку нашего запроса в конечную точку API заказов Binance.US. Для этого мы создадим тело запроса, используя параметры, которые мы определили в нашей функции main(), а также наши ключи API, которые будут включены в заголовок и подпись запроса и позволят нам проверить наш запрос Binance.
Вы можете заметить, что мы отправляем еще один запрос GET в Binance, когда определяем переменную last_ask_price. Мы делаем это, чтобы получить самую последнюю цену предложения, которая будет использоваться для расчета того, сколько нашего актива мы можем купить за 10 долларов. Вы можете установить любое количество $ в объявлении переменной quantity в функции main(). Вы также можете вообще избежать этого шага, если вы заинтересованы в том, чтобы DCA определял точную сумму выбранного вами актива, а не количество в долларах. Например, если вы хотите покупать 0,001 BTC каждый день независимо от оценки в долларах, вы можете просто установить количество равным 0,001 и полностью удалить переменную last_ask_price.
Еще одно замечание: наши ордера всегда будут исполняться как РЫНОЧНЫЕ ордера. Другими словами, мы будем брать ликвидность с рынка по ставке, предлагаемой самой низкой ценой продажи в книге заказов. Если вы хотите сделать его лимитным ордером, вы можете изменить словарь data внутри функции perform_trade_binance(). Для получения дополнительной информации о том, как это сделать, вы можете обратиться к Документации Binance API.
Наконец, если у вас есть какие-либо вопросы о создании ваших ключей API, ознакомьтесь с этой статьей и, конечно же, не забудьте добавить свои собственные ключи API в метод perform_trade_binance().
Автоматизация сценариев
Теперь, когда у нас есть готовый сценарий DCA, пришло время создать запланированное задание для его запуска. Для этого мы будем использовать CRON, который представляет собой планировщик заданий на основе времени в Linux и Unix-подобных операционных системах. Он позволяет пользователям планировать автоматический запуск задач или команд через определенные промежутки времени или в определенное время. Термин CRON происходит от греческого слова «время», «хронос».
CRON работает, считывая файл конфигурации, называемый crontab, который содержит список команд для выполнения и время их выполнения. Каждая строка в файле crontab представляет собой одну команду или задачу вместе с информацией о времени выполнения.
Прежде чем мы начнем настройку нашей автоматизации, нам сначала нужно убедиться, что у Cron есть необходимые разрешения для запуска наших скриптов. На Mac перейдите в «Настройки системы» -> «Конфиденциальность и безопасность» -> «Полный доступ к диску». Если вы видите Cron и Terminal в этом списке, включите их оба. Если вы их не видите, выполните следующие действия:
- Открыть Finder
- Нажмите Command + Shift + G и перейдите к
/usr/sbin/cron
- Найдите файл Cron и перетащите его в окно полного доступа к диску в настройках системы.
- Повторите те же действия для приложения «Терминал», которое находится в папке приложений.
- Включите Cron и Terminal.
Убрав разрешения, давайте посмотрим на формат, который Cron использует для настройки расписания:
* * * * * command * - minute (0-59) * - hour (0-23) * - day of the month (1-31) * - month (1-12) * - day of the week (0-6, 0 is Sunday) command - command to execute
Это не самый интуитивно понятный формат (вроде регулярного выражения), и некоторые замечательные люди создали инструмент, который может помочь вам легко форматировать ваши выражения на Crontab.guru.
Общие варианты:
Каждую минуту: * * * * *
Каждый час: 0 * * * *
Каждый день: 0 0 * * *
Раз в неделю: 0 0 * * 0
Теперь добавим наш скрипт в планировщик. Откройте приложение терминала и выполните следующую команду:
crontab -e
Это откроет пустой файл в Vim. Нажмите клавишу i, чтобы отредактировать и ввести объявление о вакансии в следующем формате:
* * * * * <your_python_file_path> <your_script_path>
Здесь первые 5 символов, разделенных пробелами, являются параметром планировщика. Если вы хотите, чтобы ваше задание выполнялось каждый день в 9:30, укажите 30 9 * * *
Затем вам нужно найти, где установлен ваш python. Чтобы найти точный каталог, выполните следующую команду в своем терминале:
which python3
Наконец, получите полный путь к файлу скрипта, который мы написали в разделе Реализация заказа этой статьи. После того, как вы сохранили скрипт в файл (предположим, вы назвали его binance_dca.py), перейдите в этот каталог в терминале и введите следующую команду:
pwd
Это выведет полный путь к каталогу, в котором сохранен ваш файл. Просто добавьте /binance_dca.py или как вы его назвали в конец пути, и все готово. Возвращаясь к Vim, поместите полную строку crontab в первую строку файла, заменив пути к файлам для python и вашего скрипта. В итоге вы получите что-то похожее на это:
30 9 * * * /Library/Frameworks/Python.framework/Versions/3.10/bin/python3 /Users/romansharykin/Dev/trading/binance_dca.py
После добавления строки нажмите ESC, чтобы выйти из режима редактирования, затем введите :wq, чтобы сохранить изменения и выйти из Vim. В вашем терминале вы должны увидеть сообщение
crontab: установка нового crontab
Теперь ваша автоматизация готова и должна работать в запланированное время.
Чтобы удалить задание crontab, вы можете либо ввести crontab -e и удалить добавленную строку, либо ввести crontab -r, чтобы удалить все существующие crontab, связанные с вашим пользователем. Наконец, чтобы увидеть, какие crontab в настоящее время добавлены в вашу систему, вы можете ввести crontab -l в терминале, чтобы просмотреть их все.
И это все мои друзья. Теперь у вас есть собственный DCA-скрипт с настраиваемой автоматизацией с использованием Cron, которую вы можете модифицировать по своему вкусу. Наконец-то вы можете DCA и расслабиться, не будучи ограбленными Binance. Если вам понравилась эта статья, пожалуйста, хлопните в ладоши и подпишитесь на меня, чтобы получать больше информации об автоматизации, торговле и программировании. Надеюсь скоро опять тебя увидеть!