Внедряем оплату BTC куда угодно (Python)
Полгода назад взялся за один проект с возможностью оплаты биткойном. Так как проект делали на языке python, то и оплату хотелось реализовать на нем же. Сразу же взялся анализировать готовые решения, доступные библиотеки и Rest API Blockchain.com. С апи блокчейна я моментально обломался, так как их токен для использования апи довольно не просто получить.
Затем решил юзать различные библиотеки (block-io, bitcoinlib, blockchain и др.) После пару ночей попыток реализовать нормальную оплату, остановился на bitcoinlib, так как она более менее стабильно работала, и я спокойно переводил с одного кошелька на другой. Беда наступила когда появились первые 100 пользователей и вся оплата внезапно рухнула. Возможно я криво написал или что-то не так понял с работой библиотеки, но любые попытки восстановить работу оплаты были безуспешны, только если обнулять бдшку, но и так неизвестно сколько бы она продержалась.

В итоге решили оставить без BTC оплаты. Я опечалился и не связывался с оплатой биткойном полгода.
К чему я пришел
На днях я все-таки решил добить этот вопрос для себя, надеюсь кому-то еще пригодятся мои наработки.
Все начинается с seed фразы. Мнемоническая фраза (англ. Mnemonic phrase или Seed фраза) — это список слов, которые хранят всю информацию, необходимую для восстановления биткоин-кошелька. Существуют несколько стандартов генерации фраз BIP 32, BIP 39, BIP 44, и еще BIP 49. Самый распространенный — это BIP 44 (12 слов).
Пример seed фразы:
vivid area able second bicycle advance demand alpha flip stable drift route
Чтобы сгенерировать фразу будем использовать библиотеку bipwallet. Чтобы ее установить воспользуемся командой pip install bipwallet.
from bipwallet import wallet # generate 12 word mnemonic seed seed = wallet.generate_mnemonic() print(seed)
Если мы хотим получить напрямую доступ к биткойн кошельку, то, зная фразу, можем сразу восставновить кошелек в blockhain.com:
Следующим шагом мы будем преобразовывать нашу seed фразу до получения нужного адреса кошелька биткойна.
Чтобы во всем не запутаться и знать какие данные мы должны получить, я использовал сайт https://iancoleman.io/bip39/
Генерация дочернего адреса кошелька для каждого пользователя:
Чтобы получить наш нулевой адрес Биткойн кошелька на основе seed фразы (12VeK1eRgPHRUikNLXq3Nuz99gS2S46QMD), нам нужно пройти всю цепочку преобразований. Методом проб и ошибок мне все-таки удалось получить адрес кошелька следующим кодом:
from bipwallet.utils import * def gen_address(index): # Наша seed фраза seed = 'vivid area able second bicycle advance demand alpha flip stable drift route' # Мастер ключ из seed фразы master_key = HDPrivateKey.master_key_from_mnemonic(seed) # Public key из мастер ключа по пути 'm/44/0/0/0' root_keys = HDKey.from_path(master_key, "m/44'/0'/0'/0")[-1].public_key.to_b58check() # Extended public key xpublic_key = str(root_keys, encoding="utf-8") # Адрес дочернего кошелька в зависимости от значения index address = Wallet.deserialize(xpublic_key, network='BTC').get_child(index, is_prime=False).to_address() rootkeys_wif = HDKey.from_path(master_key, f"m/44'/0'/0'/0/")[-1] # Extended private key xprivatekey = str(rootkeys_wif.to_b58check(), encoding="utf-8") # Wallet import format wif = Wallet.deserialize(xprivatekey, network='BTC').export_to_wif() return address, str(wif, 'utf-8') print(gen_address(0))
Данная функция возвращает адрес кошелька и wif в зависимости номера. Максимальное число с которым удалось получить адрес это 999999999.
wif (Wallet import format) — это просто кодирование байтов ключа в кодировку Base58 + контрольная сумма. Он нам понадобится в дальнейшем при генерации транзакции.
Это все значит, что имея только одну seed фразу мы можем создать 1 млрд дочерних адресов. Каждому пользователю при регистрации мы будем выдавать новый адрес, через который он сможет оплачивать по BTC. Появляется ограничение на 1 млрд пользователей, но нам никто не запрещает использовать несколько seed фраз или генерировать каждому юзеру новую фразу, но тогда каждая оплата будет кидаться не в общий ваш кошелек, а по разным.
Проверка баланса и транзакции:
Теперь когда у каждого пользователя свой личный адрес биткойн кошелька, нужно проверить баланс этого адреса. Для этого мы будем обращаться к сайту Blockchain.com дабы получить нужную информацию.
import requests # Адрес кошелька пользователя wallet = '12VeK1eRgPHRUikNLXq3Nuz99gS2S46QMD' # wallet = gen_address(0) url = f'https://blockchain.info/rawaddr/' x = requests.get(url) wallet = x.json() print('Итоговый баланс:'+str(wallet['final_balance'])) print('Транзакции:'+str(wallet['txs'])) if wallet['total_received']==0: print('баланс пустой')
Вот таким простым кодом мы можем получить всю информацию по балансу и транзакциях пользователя. Дальше все зависит от логики самого приложения.
Транзакции
На данном этапе мы дали каждому пользователю свой адрес кошелька и знаем все транзакции с данным адресом, но этого недостаточно. Нам нужно чтобы мы могли отправить его же деньги обратно. Для этого воспользуемся библотекой bit. Чтобы ее установить воспользуемся командой pip install bit.
from bit import PrivateKey # Приватный ключ из wif my_key = PrivateKey(wif='L46ixenNSu8Bqk899ZrH8Y96t8DHqJ1ZyxzQBGFTbh38rLHLaPoY') # Количество долларов перевода, можно поменять на btc money=0.1 # Кошелек куда будут переведены деньги wallet='17ya3bCpPioyPH8kAyFkEDBUqdjF6wwPxo' # Коммисия перевода, если поставить слишком маленькую, то транзакцию не примут # И чем больше коммисия, тем быстрее пройдет перевод fee=2000 # Генерация транзакции tx_hash = my_key.create_transaction([(wallet, money, 'usd')],fee=fee,absolute_fee=True) print(tx_hash)
В итоге мы получили вот такую транзакцию:
Выглядит красиво, но что с этим делать?
Можно зайти на сайт https://www.blockchain.com/btc/pushtx
и вручную отправить эту транзакцию.
Также можем декодировать эту транзакцию и проверить все ли верно мы указали https://www.blockchain.com/btc/decode-tx
Но нам нужно это автоматизировать, поэтому напишем несколько строк:
import requests url = 'https://blockchain.info/pushtx' tx='0100000001fe64490fce5e85d5eb00865663a3d44f4108549fdb2840b086cfc781390d4a2d010000006a47304402202dc1496d28bb10d50d94d70870e2a79ea472c5960de8f7418bb30f9b96643efc02204691547c98edad3181a056bf6404601efe289200ba8e3073a2f5b7c0c7f4fec10121026516c551584b484ce3ca7bb71bbf24cce133bf40bdf4e2ce5a3936bc7e66a2abffffffff02e3020000000000001976a9144c83a20250ccb62ce2b3b1ea80c6082b634fdf9f88ac08f40200000000001976a9144c83a20250ccb62ce2b3b1ea80c6082b634fdf9f88ac00000000' x = requests.post(url, data = ) result = x.text print(result)
Выполним пост запрос, если получаем ответ: Transaction Submitted. Это значит, что через несколько секунд транзакция появится в сети и деньги спишутся с пользователя.
Применение
Ну чтож, написав всего несколько десятков строк, мы можем генерировать для каждого пользователя свой адрес кошелка, проверять его баланс, переводить биткойны с одного кошелька на любой другой.
Для демонстрации работы BTC оплаты, я напишу простенького телеграм бота, который будет выполнять роль клиента Blockchain.com, то есть вы сможете хранить в нем свои биткойны и от туда же переводить другим людям. Ссылка на исходники бота будут в конце.
Задеплоил на heroku, так что надеюсь не будет падать)
Функционал бота
Регистрация пользователя
В качестве БД я использовал sqlite3 и создал одну таблицу пользователей:
import sqlite3 conn = sqlite3.connect("my.db") # или :memory: чтобы сохранить в RAM cursor = conn.cursor() cursor.execute("CREATE TABLE users (chatid INTEGER , name TEXT, balance INTEGER, btc_wallet TEXT, wif TEXT, btc_sent TEXT, state INTEGER)") conn.commit()
При нажатии start мы регистрируем пользователя, генерируем для него адрес биткойн кошелька, wif и добавляем данные в БД:
sql = "SELECT COUNT(*) FROM users " cursor.execute(sql) user = cursor.fetchone() address, wif= gen_address(user[0]+1) sql_insert = "INSERT INTO users VALUES (<>, '<>', 0,'<>','<>','no',0)".format(message.chat.id, message.chat.first_name,address,wif) cursor.execute(sql_insert) conn.commit()
Проверка баланса
if message.text == '? Ваш баланс': url = f'https://blockchain.info/rawaddr/' x = requests.get(url) wallet = x.json() await bot.send_message(message.chat.id, f'''? *Итоговый баланс:* BTC *Всего получено:* BTC *Всего отправлено:* BTC https://www.blockchain.com/ru/btc/address/''', parse_mode= "Markdown")
Получить BTC
Для создания qr-кода я использовал библиотеку qrcode и на вход передал ранее сгенерированный адрес биткойн кошелька из БД.
if message.text == '? Получить BTC': img = qrcode.make(data[3]) img.save('qr.jpg') await bot.send_message(message.chat.id, f'''? Ваш адрес биткойн кошелька: **''', parse_mode= "Markdown") await bot.send_photo(message.chat.id,photo=open('qr.jpg', 'rb'))
Отправить BTC
try: sum = float(message.text) url = f'https://blockchain.info/rawaddr/' x = requests.get(url) wallet = x.json() if sum + 10000 <= wallet['final_balance'] / 100000000: try: my_key = PrivateKey(wif=data[4]) # Коммисия перевода, если поставить слишком маленькую, то транзакцию не примут # И чем больше коммисия, тем быстрее пройдет перевод fee = 10000 # Генерация транзакции tx_hash = my_key.create_transaction([(data[5], sum, 'btc')], fee=fee, absolute_fee=True) print(tx_hash) url = 'https://blockchain.info/pushtx' x = requests.post(url, data=) result = x.text sql = "UPDATE users SET state = <> WHERE chatid = <>".format(0, message.chat.id) cursor.execute(sql) conn.commit() await bot.send_message(message.chat.id, result) except Exception: await bot.send_message(message.chat.id, "⚠ Ошибка при выолнении транзакции") else: await bot.send_message(message.chat.id, '⚠️ На вашем балансе недостаточно средств.') except ValueError: await bot.send_message(message.chat.id, '⚠️Неправильно введена сумма отправления, попробуйте еще раз')
Проверим через сайт, что транзакция отправилась:
Исходники и как запустить
Скачать исходники бота можно тут github.com/Lil-hack/blockchain-client
Склонировав репозиторий, устанавливаем необходимые пакеты:
pip install -r requirements.txt
Некоторые библиотеки у меня не заработали на windows, так что лучше сразу запускать на linux.
В файле main.py заменяем ваш токен телеграм бота:
# Ваш токен от BotFather TOKEN = 'YOUR TOKEN'
В файле btc_core.py заменяем на вашу seed фразу:
# Ваша seed фраза seed = 'YOUR SEED'
И запускаем бота командой: python main.py
Работает на python 3.7.0 и выше. Бот написан за один вечер, так что просьба строго не судить ^^
Итого
Как оказалось, все довольно не сложно, и в несколько десятков строк можно добавить оплату BTC в любой python проект. Я не профи в криптографии, так что скорее всего многие моменты упустил, но надеюсь кому-то эта статья будет полезна.
Разработка криптотрейдингового бота с помощью Python
Всем привет, меня зовут Александр, я работаю интеграционным инженером в компании Luxoft. В этой статье хотел бы рассказать о своем опыте автоматизации торговли криптовалютами.
Данная статья будет содержать примеры кода на Python, а также некоторые выводы, которые я сделал, торгуя на бирже. Материал будет полезен людям, которые интересуются темой криптовалют и хотят автоматизировать некоторые рутинные процессы. А также тем, кто начинает изучать Python и хочет познакомиться с языком на полезном и практическом примере, а не на оторванных от реальности синтетических задачах.
В данный момент бот находится в стадии прототипа и альфа-тестирования. Он только собирает статистику с биржи, анализирует ее и дает рекомендации — в какой момент времени какой токен стоит покупать, какой — продавать. Сам процесс торговли пока еще находится в руках человека, но в будущем он также будет автоматизирован и бот станет полностью автономным.
Часть 1. Общие сведения про биржу и торговлю криптовалютами
Eсли вам интересен только код — смело листайте сразу до части.
Всё началось несколько месяцев назад, в январе 2021, когда практически из каждого утюга доносилось «Биткоин стремительно растёт! Те, кто вовремя вложились — стали миллионерами!». Также масла в огонь подливали новости о том, что геймерам не хватает видеокарт, потому что майнеры всё раскупили, даже несмотря на рост цен в
В итоге, после настолько навязчивой информационной атаки, я просто не мог оставаться в стороне и начал разбираться в вопросе.
Не вдаваясь в детали выбора криптобиржи скажу лишь, что он был скорее интуитивным, чем рационально обоснованным и в итоге пал на binance.com (не реклама).
У меня нет никаких аргументов за или против этой биржи, так как ничем другим не пользовался и сравнивать, соответственно, не с чем. Вы вполне можете выбрать любую другую биржу из популярных — принципы торговли будут одинаковы, отличаться будет лишь интерфейс, API и процедура верификации личности.
На последнем моменте стоит отдельно акцентировать внимание — на Бинанс у вас будут весьма ограниченные возможности, если вы не подтвердите свою личность. Процедура несложная, занимает буквально 15 минут и требует от вас всего лишь:
- документа, подтверждающего личность (например, паспорт, водительское удостоверение, etc);
- веб-камеры (или фронтальной камеры на смартфоне с установленным приложением от Бинанс);
- ввода некоторых данных о вас.
Крайне рекомендую сделать это, так как иначе на ваш аккаунт будет наложено, среди прочих, одно очень существенное ограничение — вы не сможете выводить деньги с биржи. То есть, завести деньги на биржу сможете без проблем, а потом, успешно поторговав — не сможете вернуть деньги обратно на свою банковскую карту.
После успешной регистрации и верификации аккаунта у вас будет несколько способов завести деньги на биржу. Рассмотрев альтернативы, был выбран такой способ — с помощью банковской карты покупаются токены USDT, которые относятся к так называемым стейблкоинам (от англ. stable coin — стабильная монета). Стабильной она называется потому, что ее цена колеблется в очень незначительных пределах (от 0.98$ до 1.02$ за 1 USDT) и большую часть времени составляет ровно 1 доллар США. Таким образом, купив за реальные деньги — виртуальные USDT, вы пока еще ничем не рискуете, так как цена практически гарантированно не изменится. Единственное, что вы теряете в данный момент — это 2% комиссии биржи за ввод средств или 20$ с каждой тысячи.
Также стоит учесть, что от всех торговых внутрибиржевых сделок Бинанс берет небольшую комиссию — 0.1% или 1$ с каждой 1000. Эта комиссия настолько незначительна, что её можно игнорировать.
И, наконец, последняя важная комиссия — 2.5% от суммы средств, которые вы выводите с биржи на свою банковскую карту. Процент хоть и небольшой, но ощутимый (25$ с каждой 1000), поэтому имеет смысл торговать на бирже так долго, как это возможно, и выводить лишь в самом крайнем случае.
Просуммировав все вышеописанное, можно сделать вывод № 1: ваши инвестиции должны вырасти в цене как минимум на 4.6%, чтобы вы вышли в ноль. Если взять условную 1000$ на вашей банковской карте, то после всех ваших манипуляций на бирже (ввод, торговля), ваша прибыль должна составить как минимум 46$, чтобы к вам на карточку вернулась та же самая тысяча.
Для людей, привыкших к обычным банковским вкладам, 4.6% могут показаться весьма существенным и сложнодостижимым результатом. Но в мире криптовалют всё намного более волатильно, поэтому часто сделки осуществляются со значительно большей прибылью и буквально каждый день. Для примера, можете взглянуть на этот «зеленый» период рынка:

«Зеленым» он называется потому, что когда цена криптовалют растет — их графики рисуют зеленым цветом, а когда падает — красным. Если наступил период массового роста, иногда говорят, что «рынок позеленел», а если наступил период спада — «покраснел», например, как здесь:

Иногда бывают и совсем необычные ситуации — весь рынок «красный», а какой-нибудь Dogecoin растет на +122% за сутки)

Раз мы посчитали, сколько нужно заработать и увидели, что это возможно, давайте перейдем к той части, где обсудим, как именно это сделать.
Есть несколько стратегий, но одна из самых простых и понятных для начинающего криптоторговца — купить подешевле, продать подороже.
На графике это можно изобразить следующим образом:

Где каждый левый кружок в паре — момент покупки («подешевле»), а каждый правый кружок — момент продажи («подороже»). Соответственно, разница между этими двумя сделками — и будет вашей прибылью (за исключением символического процента биржи в 0.1%)
Вы можете задать вопрос: «А почему во второй сделке не подождать дальнейшего роста и не продать с большей прибылью?» И этот вопрос совершенно оправдан, вот только ясность приходит уже по прошествии определенного времени, когда график колебания цен у вас перед глазами и поздно отправляться в прошлое, чтобы принять наилучшее решение.
Опытные инвесторы говорят, что два основных рычага, влияющих на принятие решений — это страх и жадность. Жадность — как стремление получить больше прибыли (на росте цены) и страх — как тревога за то, что цена в любой момент может пойти вниз и текущий момент времени — тот самый локальный пик, наилучший момент для продажи.
Я выбрал следующую стратегию поведения (которая чуть ниже будет показана в коде): сперва отслеживаю резкие падения цены, покупаю такую криптовалюту на 100$ и сразу же, в эту же минуту ставлю ордер на автопродажу на сумму 110$. Такой подход позволяет совершать сделки достаточно часто, при этом суммарно их выходит много в течении месяца и итоговая прибыль получается существенной (в процентном отношении к стартовым инвестициям).
Пара моментов, на которые стоит обратить внимание.
Во-первых, Бинанс позволяет ставить так называемые стоп-лимит уровни. Их можно использовать для выполнения автоматических сделок, например — для покупки криптомонет, когда их цена опускается ниже определенного уровня или для продажи, когда их цена растет выше определенного уровня.
Во-вторых, хорошей стратегией является диверсификация или распределение ваших инвестиций на несколько криптовалют. На момент начала торгов на биржу было заведено 600$, которые я распределил равномерно на 6 частей, закупившись 6 разными криптовалютами. Когда после многочисленных сделок общая стоимость инвестиций выросла до 700$ — я стал покупать уже 7 разных криптовалют, когда выросла до 800$ — 8, и так далее. На момент написания статьи, стартовые 600$ превратились в 812$ примерно за месяц торгов с использованием описанной стратегии.
И наконец, если с моментом для продажи все просто (ставим ордер на автопродажу за 110$ и ждем — иногда пару часов, иногда несколько дней), то как именно можно определить, что такое «резкое падение цены»?
Вероятно, у каждого свое представление о том, какие падение считать достаточно резким, но я для себя (математически) определил его как «5% падение цены в течении последнего часа». Именно это определение было заложено в логику бота.
Для примера приведу еще несколько графиков, где вы сами без труда сможете определить удачный момент для покупки, а также убедиться, что после стремительного падения цены — всегда следует рост, с которого можно получить прибыль:

Часть 2. Пишем бота
После прочтения первой части у вас мог возникнуть вопрос: «Если Бинанс такая замечательная биржа, что позволяет автоматически и покупать, и продавать — зачем вообще нужен бот?». Это уместное замечание и ответ на него такой — бот крайне полезен для сбора статистики, анализа и рекомендаций по удачным моментам для покупки и продажи.
В те несколько недель, пока всё делалось вручную, успел заметить, что очень много времени и внимания уходит на отслеживание падений цен. А ведь возможность заниматься мониторингом была лишь изредка, ненадолго отвлекаясь от работы в течении дня и вечером. В остальное время, когда я работал, ел, спал — все удачные моменты для покупки проходили мимо и это выливалось в упущенные возможности и недополученную прибыль.
Всё это смотивировало написать код, который ежеминутно проверял курсы валют для выбранных токенов, собирал статистику колебаний цен за последний час и как только для какой-то валюты обнаруживал резкую просадку цены — тут же писал в Телеграм сообщение следующего вида:

Как видно из этого скриншота, бот не только писал, какой токен следует купить, но и на сколько % упала цена за последний час. Для тех же криптовалют, для которых падение цены было меньше 5% — фраза была «nothing to do right now. »
В данный момент бот используется только как сборщик статистики, анализатор и советчик. Он не совершает сделки автоматически, этот функционал будет добавлен в будущем, когда придет уверенность, что бот дает корректные рекомендации и не наторгует в минус, пока я буду спать)
Давайте же наконец перейдем к коду и посмотрим, как все устроено внутри.
Проект состоит всего из 3 файлов:
- cryptobot . py (собственно, сам бот)
- calculations . py (вспомогательные функции для анализа и расчетов)
- my_cryptocoins.json (файл с данными о криптовалютах и их актуальных ценах)
Содержимое my_cryptocoins.json выглядит следующим образом:
< "ALICE": < "amount": 3.5, "buy_price": 30, "desired_price_fall": 5, "desired_sell_price": 33, "last_prices": [ 12.71004841, 12.71728863, 12.71983559, . 12.73806222, 12.74204871 ] >, "ARDR": < "amount": 314.895, "buy_price": 0.351, "desired_price_fall": 5, "desired_sell_price": 0.3861, "last_prices": [ 0.69192631, 0.69205345, 0.68947941, . 0.68280223, 0.67819879 ] >, "BCH": < "amount": 0.22, "buy_price": 650, "desired_price_fall": 5, "desired_sell_price": 715, "last_prices": [ 628.07961283, 628.60812333, 629.01582194, . 629.29318231, 629.12820048, 660.64513681 ] >,
(и так далее, полный файл содержит в себе десятки токенов и данных об их ценах)
Где, «amount» — количество монет данной валюты, купленных ранее.
«buy_price» — цена, по которой они были куплены
«desired_price_fall» — процент, на который мы ожидаем, что цена упадет, чтобы покупка имела смысл
«desired_sell_price» — цена, по которой планируется продать купленные монеты (и на которую стоит ордер на автопродажу)
«last_prices» — список из последних 60 цен, обновляемый каждую минуту
И наконец «ALICE», «ARDR» и «BCH» — короткие названия токенов, которые будут использованы для обращения к API Бинанс.
В текущей реализации, все данные кроме списка цен приходится заносить самому вручную. В будущем это будет осуществляться автоматически на основании сделок, проведенных ботом.
Конечно, использовать json файл — не лучшее решение в данной ситуации, но оно было выбрано, чтобы как можно быстрее проверить торговые гипотезы. В планах — поднять рядом с ботом полноценное веб-приложение с API и БД, куда будут записываться все интересующие данные, которые позволят проводить более глубокий анализ.
Файл calculations . py содержит в себе следующие функции и данные:
API_URL = 'https://api3.binance.com/api/v3/avgPrice'
API ендпоинт, при обращении на который мы узнаем цену интересующей нас криптовалюты.
Также могут использоваться альтернативы:
api . binance . com
api1 . binance . com
api2 . binance . com
Все они предоставляют одну и ту же информацию, так что можете выбрать любой из них.
Функция, которая обращается к бирже и узнает цену интересующей нас криптовалюты:
def get_price(coin: str) -> float: """ :param coin: token name, e.g. BTC for Bitcoin, LTC for Litecoin :return: coin's current price in stable USDT. 1USDT ~ 1$ USA """ data = USDT'> # e.g. BTCUSDT response = requests.get(API_URL, data) return float(response.json()['price'])
Как видите, ничего сложного здесь нет — обычный GET запрос с передачей дополнительных данных о том, какая торговая пара нас интересует. Чтобы функция корректно работала, не забудьте в начале файла импортировать библиотеку requests — import requests.
Следующая функция отвечает за расчет вашей потенциальной прибыли. Здесь тоже нет никакой высшей математики, все рассчитывается по простой формуле: (текущая цена минус цена покупки) умножить на количество ваших монет для данной криптовалюты. Чтобы в сообщениях бота не мешать самому себе избыточной информацией, было добавлено округление до 2 знаков после запятой. Вряд ли кому-то интересны доли центов.
def count_profit(coin: dict, current_price: float) -> float: """ :param coin: e.g.: :param current_price: coin's current price in stable USDT. 1USDT ~ 1$ USA :return: profit in USDT """ # Example: (220 - 200) * 0.5 == 10 return round((current_price - coin['buy_price']) * coin['amount'], 2)
Следующая функция содержит в себе логику, которая была описана ранее, а именно — определение того, насколько упала цена за последний час. Алгоритм работает так: из json файла достаются все цены для конкретной валюты, среди них определяется максимальная цена и сравнивается с текущей ценой (которую, напоминаю, мы узнали обращением к API Бинанса)
def count_price_fall(coin: dict, current_price: float) -> float: """ :param coin: same as in count_profit() :param current_price: same as in count_profit() :return: max diff between last 5 prices and current price, in USDT """ # Example: max([201.4, 205, 203, 211, 222.2]) - 190 == 32.2 try: return max(coin['last_prices']) - current_price except: # may happens if coin['last_prices'] is empty return 0
И, наконец, финальная функция, которая и дает совет «Time to buy», если за последний час снижение цены оказалось равным или больше тому, что было указано в json файле в поле «desired_price_fall»:
def should_i_buy(price_fall: float, desired_fall: float, current_price: float) -> bool: """ :param price_fall: output of count_price_fall() :param desired_fall: desired price fall in PERCENTS! not in USDT. e.g. 10% :param current_price: coin's current price in stable USDT :return: True if you should buy, False otherwise """ # Example: 21 / 200 * 100 == 10.5% and 10.5 >= 10, so -> True if price_fall / current_price * 100 >= desired_fall: return True return False
Как видите, на данном этапе реализации бота, внутренних расчетов и анализа у него не так уж много. Но идей по улучшению и добавлению нового функционала — предостаточно.
Последний файл — cryptobot . py содержит в себе код телеграм бота, который как раз и шлет сообщения о том, что пора покупать, продавать, или пока можно расслабиться и ничего не делать.

Прежде всего, вам необходимо будет написать отцу всех ботов — @BotFather и создать у него своего бота. Не будем дополнительно останавливаться на этой части, так как в интернете море подобных инструкций и вы без проблем сможете зарегистрировать своего бота самостоятельно за пару минут.
Главное, что вам нужно будет получить — это токен, который вы будете использовать в коде.
А также, очевидно — никнейм вашего бота, с которым вы будете общаться в чате Телеграма.
После этого вы сможете вставить свой токен в код бота и он будет выглядеть так:
(импорт всех необходимых функций, модулей и библиотек)
import time import json from telegram.ext import Updater, CommandHandler from calculations import get_price, count_profit, count_price_fall, should_i_buy
TOKEN = '1111111111:sdfklsdjgkljfdglkDSFDGFDGFDkdjskfljdkf'
(главная и единственная функция вашего бота, она же будет командой, которую вы будете отправлять ему в чате Телеграма, чтобы запустить эту адскую машину:)
def make_money(update, context): # (получаете id чата, где бот будет общаться с вами) chat_id = update.effective_chat.id # (бесконечный цикл) while True: # (открываете файл my_cryptocoins.json и читаете из него данные) with open('my_cryptocoins.json', 'r') as my_coins_data: my_coins = json.loads(my_coins_data.read()) # (эта переменная будет содержать в себе тот сообщение, которое бот вам отправит в Телеграме) final_message = [] # (цикл, проходящий по всем токенам, перечисленным в my_cryptocoins.json) for coin_name in my_coins.keys(): coin = my_coins[coin_name] coin_price = get_price(coin_name) possible_profit = count_profit(coin, coin_price) price_fall = count_price_fall(coin, coin_price) last_prices = coin['last_prices'] # (часть кода, отвечающая за работу с ценами, обновляемыми каждую минуту) if len(last_prices)
# (логика, которая формирует сообщение о том, что пора покупать/продавать/ничего не делать) if coin_price >= coin['desired_sell_price'] and coin['amount'] > 0: message += f' --> TIME TO SELL\n' message += f'possible profit = $' else: if should_i_buy(price_fall, coin['desired_price_fall'], coin_price): message += f' --> TIME TO BUY\n' message += f'price fall = %' else: message += f' --> nothing to do right now. ' # (обратите внимание на time.sleep(2) - если обращаться к API биржи слишком часто - она вас "забанит" на какое-то время. Так что лучше не спамить запросами) final_message.append(message) time.sleep(2) # (после всех операций - записываем обновленные данные в my_cryptocoins.json) with open('my_cryptocoins.json', 'w') as my_coins_data: my_coins_data.write(json.dumps(my_coins, sort_keys=True, indent=2)) # (и наконец, команда, которая отправляет финальное сообщение в чат Телеграма) context.bot.send_message(chat_id=chat_id, text='\n'.join(final_message)) # (бот засыпает на 1 минуту до следующей итерации бесконечного цикла) time.sleep(60) # run every minute # (здесь от вас уже практически ничего не зависит, эта часть кода нужна, чтобы корректно запускать нужную нам функцию при отправке боту соответствующей команды) def main(): updater = Updater(token=TOKEN, use_context=True) dp = updater.dispatcher dp.add_handler(CommandHandler('make_money', make_money)) updater.start_polling() updater.idle() if __name__ == '__main__': main()
После того, как все 3 файла будут готовы, вам нужно будет установить необходимые для работы бота библиотеки командами:
pip install requests
pip install python-telegram-bot
Затем запустить бота командой python cryptobot . py и наконец написать вашему боту в телеграме команду /make_money
С этого момента бот будет каждую минуту слать вам сообщения с рекомендациями.
Часть 3. Выводы и планы на будущее
В течении последнего месяца бот показал себя довольно неплохо — благодаря его рекомендациям стартовые 600$ инвестиций превратились в 812$, что значительно превышает альтернативные способы заработка (например — обычный банковский вклад или покупку ценных бумаг). Пока экспериментирую на относительно небольших суммах, так как для меня это новая сфера и есть предчувствие, что некоторые подводные камни еще впереди. Как только почувствую больше уверенности в себе и боте — увеличу сумму инвестиций в несколько раз.
Но важно понимать, что криптовалюты — это высокорисковые, хоть и высокоприбыльные инвестиции. Так что рано или поздно стремительный рост рынка закончится и главное — успеть вовремя выйти во что-то более надежное, например в доллар США. Опытные криптоаналитики считают, что следующего серьезного спада следует ждать в конце 2022 года, так что у нас есть около 1.5 лет для заработка.
В текущей реализации бот еще не является полностью автономным и только советует, когда какие действия предпринимать. В следующих версиях я планирую добавить боту возможность самостоятельно осуществлять сделки (API Бинанс это позволяет) и, начав с небольших сумм, посмотреть на его эффективность.
Также в планах поэкспериментировать над максимизацией прибыли, возможно проведя синтетические эксперименты на исторических данных. А именно — проверить, какой будет результат, если покупать, когда цена падает не на 5% в течении часа, а на или наоборот 10+. Аналогично и с продажей — посмотреть, что будет, если ставить на автопродажу не с прибылью 10%, а с меньшей или большей.
И, как я уже писал ранее — также в планах есть разработка веб приложения с API и БД, где будут сохраняться все собираемые ботом данные для более глубокого анализа.
На этом всё, если у вас есть замечания/предложения по коду или интересные истории, связанные с торговлей криптовалютами — оставляйте комментарии.
P.S. Полную версию бота можно скачать здесь. Главное, не забудьте в нужное место вставить токен вашего телеграм бота.
Подобається Сподобалось 23
До обраного В обраному 15
Схожі статті
- Як швидко створити serverless Telegram-бота: покроковий гайд
- Біткоін з космосу: забезпечуємо безперервне з’єднання з мережею
- Як ми додали українську мову в офіційну документацію Python
- Базова теорія Python. Керування потоком виконання
- Чому я обираю FastAPI: основні можливості та переваги фреймворку

Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
52 коментарі

Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Круто, ми також розробили телеграм бота @WinWinFreeSignalsBot щоб отримувати сигнали з Bybit CopyTrade — детальніше про бота — www.win-win-trade . com/sygnaly-kryptovalyut/top-10-besplatnye-sygnaly-kryptovalyut-telegram-2023-krypto-trejdyng-sygnaly-telegram-besplatno/
Є одна маленька біржа, де угоди між користувачами не є анонімними. Там можна поспостерігати за «війною роботів», буває цікаво )) BTC TRADE UA
Спотовый бот для алгоритмической мультивалютной торговли на бирже Binance, поддерживающий ручную и полностью автоматическую торговлю.
Описание стратегии:
Бот работает по стратегии усреднения. Суть стратегии заключается в снижении средней цены входа в актив путём увеличения веса позиции в случае, если рыночная стоимость актива снижается по отношению к текущей стоимости ордера. Иными словами, при входе в сделку бот, исходя из пользовательских торговых настроек, размещает ордер на продажу с заданным процентом профита, но если стоимость актива падает по отношению к первой покупке, не достигнув ордера на продажу, и опускается ниже заданного значения в %, бот отменяет ордер на продажу, докупает определённое количество монет, которое всегда больше количества монет в предыдущем отменённом ордере, и размещает новую заявку на продажу по цене (новая средняя цена покупки + % желаемой прибыли). Таким образом, при падении рыночной стоимости актива бот постоянно анализирует текущие ордера и рыночные данные, сопоставляя условия настроек торговой стратегии и биржевую активность, и докупает монеты, увеличивая их общий объём и снижая новую цену продажи.
Управлять A-Bot’ом также можно из Telegram-бота, которого вы создали у BotFather’а и добавили в свой канал для уведомлений.
Торговые параметры:
timeout_socket Минимальный тайм-аут между сообщениями стрима, необходимый для медленных машин
name_list [str] — Название текущего пресета настроек (в случае команды -sve сохранится в список настроек с этим именем) (например main)
min_bnb [min >= 0.01] — Минимальный свободный баланс BNB, ниже которого бот будет докупать минимально допустимое количество BNB по рыночной цене для оплаты биржевой комиссии (например 0.03)
min_balance [min >= 0] — Не покупать/усреднять позиции, если свободный баланс составляет меньше заданного % от общего баланса
min_order [min >= 1] — Множитель размера первого ордера на покупку. Стоимость первого ордера будет рассчитываться, как минимальный допустимый размер ордера на бирже * min_order (например 1.2). На USD это 10$, на BTC это 0.0001. Лимиты можно найти здесь
min_price [min >= 0.00000001 USD] — Минимальная рыночная стоимость монеты, эквивалент в USD которой равен рыночному курсу монеты в USD, ниже которого бот не будет открывать новые сделки по этой паре, лишь усреднять, если стоит ордер на продажу (например 0.05)
min_daily_percent [-100 < min < daily_percent < 99999] — Выше какого значения должнен подняться показатель % суточного изменения цены на бирже, чтобы бот осуществил первую покупку по паре (например −20)
daily_percent [-100 < min < 99999] — Ниже какого значения должнен упасть показатель % суточного изменения цены на бирже, чтобы бот осуществил первую покупку по паре (например −3)
auto_daily_percent [y/n] — Вместо daily_percent использовать общую суточную дельту разрешённого списка монет для ограничения максимального процента коридора покупок. Если Y, то бот не будет покупать монеты, выросшие более, чем на Д % из информационной строки в консоли
order_timer [min >= 0] — Интервал паузы между закрытием сделки и новой покупкой по этой же паре в секундах
min_value [min >= 0] — Эквивалент минимального суточного торгового объёма в USD у торговой пары для открытия позиции по ней
sell_up [min > 0] — Желаемый % прибыли от продажи без учёта суточной дельты и трейлинг-стопа (например 1.65)
sell_cut [y/n] — Уменьшать желаемую прибыль на монете по мере роста количества её усреднений. Если Y, то sell_up, применяемый для текущей монеты, будет уменьшаться с каждым новым усреднением
buy_down [min < 0] — На сколько % должна упасть рыночная цена актива по отношению к цене его последней покупки, чтобы бот усреднил позицию (например −5)
max_trade_pairs — Допустимое количество позиций на продажу, которое бот может держать одновременно открытыми (например 20). Если количество открытых ботом ордеров станет равно или больше max_trade_pairs, бот перестанет совершать новые покупки (кроме усреднений)
-1 [-1] — Не ограничивать количество одновременно торгуемых ботом пар
0 [0] — Работать только с уже открытыми ордерами и не совершать новые покупки
1 и более Указать максимальное количество позиций вручную
auto_trade_pairs [y/n] — Разрешить боту автоматически регулировать количество разрешённых пар? Если Y, бот будет автоматически корректировать максимальное количество одновременно торгуемых пар, если предыдущий параметр настроек задан пользователем вручную от 1 до 999
progressive_max_pairs [y/n] — Использовать прогрессивное уменьшение максимального количества пар. Если Y, то количество пар при включенной настройке auto_trade_pairs будет автоматически уменьшаться не только в зависимости от соотношения свободного и общего баланса, но и от количества открытых ордеров и суммарного количества их усреднений
delta_percent [y/n] — Использовать общую рыночную дельту суточной цены? Если Y, суммировать торговые параметры с общей суточной дельтой (направлением рынка) по отобранным парам из белого списка. Данный параметр сделает стратегию более гибкой, позволив удваивать прибыль максимум в 2 раза, но также может уменьшить прибыль вдвое на падающем рынке
delta_deep [y/n] — Использовать глубину падения дельты для определения падения рынка и паузы покупок/усреднений? Если Y, то бот будет блокировать новые покупки и усреднения на падающем рынке до тех пор, пока не произойдёт локальный отскок всего рынка. Определение локального отскока зависит от величины падения самой дельты и выражено в пропорции 1 к 10 (при дельте −5 бот начнёт открывать позиции, когда дельта вырастет до −4.5 и выше)
num_aver [y/n] — Использовать сетку усреднений? Если Y, то при усреднении бот будет увеличивать процент падения цены, необходимый для нового усреднения актива, на buy_down + количество усреднений * step_aver
step_aver [%] — Шаг увеличения сетки. На сколько процентов увеличивать последующую разницу рыночной цены и цены последней покупки для усреднения (например 1.35)
max_aver [min >= 0] — Максимальное количество усреднений на одной монете (например 4)
quantity_aver [min > 0] — Множитель размера усреднения от текущего веса позиции (например 2). Иными словами, при усреднении бот будет покупать текущее количество монет * quantity_aver, тем самым новая позиция будет равна текущее количество монет * quantity_aver + текущее количество монет
progressive_average [y/n] — Использовать прогрессивное усреднение? Если Y, бот будет самостоятельно находить объём для усреднения и делать его таким, чтобы после усреднения средняя цена входа в позицию оказалась не выше %-та average_percent от текущей рыночной цены (то есть цены нового усреднения). Иными словами, после прогрессивного усреднения ордер на продажу будет выше от текущей рыночной цены на average_percent + sell_up % (без учёта остальных динамических настроек по типу delta_percent, влияющих на sell_up)
average_percent [100 > min >= sell_up] — Максимальный желаемый % разницы между рыночной ценой и средней ценой входа в позицию после усреднения (например 7)
trailing_stop [y/n] — Использовать трейлинг-стоп? Если Y, отодвигать цену продажи в зависимости от движения цены актива. С включенным трейлингом позиция не закрывается сразу, а продаётся частями trailing_part на приближенных к максимальным значениям ценам, чтобы увеличить потенциальную прибыль, либо закрывается полностью при падении цены и её приближении к средней цене покупки. Данный параметр сделает стратегию более гибкой, но может уменьшить прибыль
trailing_percent [min > 0] — При каком падении от локального хай-уровня цены активировать трейлинг-стоп для частичной/полной продажи (например 0.25)
trailing_part [0 < min trailing_price [min >= 0.00000001 USD] — Активировать трейлинг-стоп только на активах стоимостью в эквиваленте к USD выше заданного процента. Это позволяет избегать минусовых сделок из-за слишком большого процента спреда монет с низкой стоимостью (например 0.2)
new_listing [y/n] — Открывать позиции по только что добавленным на биржу активам? Если Y, бот будет покупать монеты сразу после их листинга и игнорировать торговые параметры по типу min_value, min_price, daily_percent и прочих, кроме min_balance и double_asset
max_buy_listing [999 >= min>= 0] — Сколько раз бот может вновь открывать позиции по только что добавленному на биржу активу, игнорируя торговые параметры? После преодоления этого значения бот не откроет позицию по данному активу, пока условия на торговой паре не будут соответствовать торговым настройкам (например 5)
user_order [y/n] — Работа с пользовательскими ордерами после ручной покупки. Если Y, то в случае покупки пользователем монеты из разрешённого списка бот автоматически поставит на продажу купленное количество монет и будет работать с этой парой так же, как и в остальных случаях, ориентируясь на торговые настройки. Также уже открытые ордера можно будет усреднять вручную: для этого во время работы бота купить нужное количество монет, после чего бот отменит ордер на продажу, рассчитает новые данные и выставит ордер по новой цене
fiat_currencies [RUB UAH . ] — Если включены уведомления в Telegram, то ежедневная статистика торгов будет рассчитываться в этих валютах вместе с quote_asset
quote_asset [USDT BTC . ] — Котируемые валюты для торговли (то есть те валюты, в паре к КОТОРЫМ торгуются монеты из разрешённого списка (ADA/USDT, ADA/BTC), а не которые торгуются к ним). Приоритет котируемых активов для первоочередной покупки соответствует их расположению (слева направо)
double_asset [y/n] — Если Y, бот сможет покупать одну и ту же монету на нескольких котируемых активах одновременно (ADA/USDT и ADA/BTC)
pump_detector [y/n] — Использовать детектор пампов для открытия позиций? Если Y, бот будет анализировать все монеты из разрешённого списка монет в реальном времени и, в случае обнаружения всплеска объёмов, доминации покупателей и роста цены актива, незамедлительно покупать монету (работает только на боте, запущенном с -pd ключом)
pump_order [min >= 1] — Множитель размера покупки по сигналу детектора пампов (например 2.5)
pump_up [min > 0] — Желаемый % прибыли от продажи позиции, открытой или усреднённой по сигналу детектора пампов, без учёта суточной дельты и трейлинг-стопа (например 0.35)
max_pump_pairs [min >= 0] — Допустимое количество позиций на продажу, открытых по сигналу детектора пампов, которое бот может держать одновременно открытыми (например 10)
trailing_pump [y/n] — Использовать трейлинг-стоп на ордерах, открытых по сигналу детектора пампов? Если Y, то бот будет активировать трейлинг на таких ордерах по параметрам trailing_stop’a
Реальная стата работы бота t.me/stat_a_bott
Создание собственной криптовалюты: что нужно знать
За последнее десятилетие криптовалюты превратились в незаурядный финансовый феномен, изменивший представление о деньгах и финансовых отношениях. Они стали символом технологического прорыва и открытости финансовых рынков.
Оглавление
Михаил Серюга
Журналист финтех, криптовалюты
Обновлено 23 ноября 2023
В первом материале о криптовалютах из нашего цикла «Моя крипта – мое богатство» мы рассказывали о том, как вы можете разработать собственную криптовалюту.
Сегодня же поговорим о том, как вы должны действовать непосредственно на этапе создания криптовалюты. Давайте раскрывать ключевые моменты этого этапа вместе!
Напомним, что на этапе разработки криптовалюты вам следует определить, что будете создавать: монету или токен? Далее будут описаны оба алгоритма и выделены преимущества и недостатки каждого.
Создание криптомонеты
Создание монеты в прямом смысле означает написание блокчейна. Это сложный процесс, требующий значительных затрат времени, средств и требующий от разработчика колоссальных знаний в области программирования.
Для того чтобы эти знания расширить, рекомендуем к чтению специализированную литературу. Она углубит ваш кругозор и сделает процесс создания монеты более комфортным. Итак, Finance.ua рекомендует:
- Блокчейн. Архитектура, криптовалюты, инструменты разработки, смартконтракты. Автор Имран Башир.
- Освоение блокчейна. Авторы Лорн Ланц и Дэниел Коури.
- Блокчейны и децентрализованные системы. Авторы Павел Кравченко, Богдан Скрябин, Александр Курбатов, Оксана Дубинина.
- Блокчейн от А до Я. Все о технологии десятилетия. Автор Лоран Лелу.
- Технология блокчейн – то, что движет финансовой революцией сегодня. Авторы Алекс Тапскотт и Дон Тапскотт.
Отдельно есть книги по программированию непосредственно блокчейна, которые пригодятся программистам:
- Building Blockchain Projects. Автор Нараян Прусти.
- Mastering Bitcoin: Unlocking Digital Cryptocurrencies. Автор Андреас Антонопулос.
- Decentralized Applications: Harnessing Bitcoin's Blockchain Technology. Автор Сирадж Раваль
- Hands-On Blockchain for Python Developers: Gain blockchain programming skills to build decentralized applications using Python.. Автор Арджуна Скай Кок.
Перед тем, как приступить непосредственно к созданию криптовалюты, вам придется выбрать язык программирования, на котором будет написан код будущей монеты. Подавляющее большинство сетей первого уровня написано на:
До того, как писать код блокчейна стоит проконсультироваться с программистами, работающими на разных языках, чтобы понять, какой из них подходит лучше всего именно для вашего проекта.
Однако, даже если вы программист-виртуоз, без команды, скорее всего, не обойтись, поскольку запуск успешной монеты требует выполнения большого объема работы.
Хорошим помощником в написании кода криптовалюты может стать искусственный интеллект (ChatGPT), который неплохо пишет код на большинстве из вышеперечисленных языков программирования. Он избавит вас от рутины. Придется только все проверять и вносить необходимые изменения и исправления.

Код простого блокчейна. Источник: ChatGPT
Если вы хотите научиться программировать блокчейн, мы рекомендуем ознакомиться с этим руководством. Оно содержит примеры кода JavaScript и Solidity, которые помогут понять основы разработки блокчейна.
Также вы можете воспользоваться репозиторием на GitHub, содержащем примеры кода для создания децентрализованных приложений с использованием Bitcoin, Ethereum и Hyperledger.
Эти примеры можно использовать в своем коде, но предварительно проверьте, что лицензия контракта свободна и позволяет использовать его в своих целях.

Шаблоны кода блокчейна. Источник: GitHub
Если вы хотите создать блокчейн на Python, то этот туториал может быть полезен вам. Мы надеемся, что это поможет вам понять, как программировать блокчейн.
На практике может оказаться, что вы совсем не программист. И создание сложного программного механизма – не ваша сильная сторона. Но в то же время вы хороший менеджер и умеете хорошо организовать работу. Есть куча интересных идей и реализация блокчейна входит в этот кейс. Тогда у вас два пути:
- Собираете команду программистов и организуете их работу.
- Заказываете блокчейн под ключ. В статье, посвященной разработке криптовалюты, мы указали две платформы, которые предоставляют такие услуги.
Как проверить баланс криптокошелька python

Комментарии
Популярные По порядку
Не удалось загрузить комментарии.
ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ
ООП на Python: концепции, принципы и примеры реализации
Программирование на Python допускает различные методологии, но в его основе лежит объектный подход, поэтому работать в стиле ООП на Python очень просто.
3 самых важных сферы применения Python: возможности языка
Существует множество областей применения Python, но в некоторых он особенно хорош. Разбираемся, что же можно делать на этом ЯП.
Программирование на Python: от новичка до профессионала
Пошаговая инструкция для всех, кто хочет изучить программирование на Python (или программирование вообще), но не знает, куда сделать первый шаг.