Coinbase Pro довольно прост в использовании Crypto Exchange. Хотя это не позволяет торговать всей крипто-вселенной, она позволяет пользователям депонировать и торговать с валютами Fiat. Одна функция, которая отсутствует, но довольно легко реализовать, является автоматическими отложениями.
Этот учебник будет проходить вас через использование Python, чтобы начать депозиты на периодической основе. Я знаю, что вы думаете, «Создание автоматических месторождений не представляет собой торговый бот». Будущие учебные пособия построят на этом, чтобы завершить все функции бота. Будьте на связи!
Хотите пропустить до конца? Вот репо С этим учебником.
Используемые технологии
- Python – язык программирования
- Logger – Пакет Python для регистрации событий
- AWS S3 – хранение для регистрации событий
- Heroku – развертывание
- Coinbase Pro – Crypto Exchange
Содержание
- Coinbase Pro настроен
- Героку настроен
- Подключение к Coinbase Pro
- Делать депозиты
- Регистрация приложений (необязательно)
- Переменные среды в Героку
- Дополнительные ноты
Coinbase Pro настроен
Чтобы начать работу, убедитесь, что у вас есть производственный аккаунт с Coinbase Pro и счет на Coinbase Pro Sandbox (Это используется для тестирования). Для обеих учетных записей создайте учетные данные API
- Профиль в правом верхнем углу -> API -> Новый ключ API
- Разрешения – позже, я покажу вам, как размещать сделки, поэтому на данный момент вы можете выбрать все три (просмотр, передача, торговля)
- Пароль – оставить как по умолчанию
- IP Whitelist – оставьте как по умолчанию
- Два факторных кода аутентификации – зависит от того, как вы настраиваете свою учетную запись
Когда вы закончите, вы должны иметь следующее для ваших продуктов, так и для счета Sandbox:
- Фраза фраза
- Секретарь
- Ключ
Колбовое приложение
Сначала создайте папку для этого проекта, а затем инициировать и активируйте виртуальную среду
mkdir crypto_trading_bot cd crypto_trading_bot virtualenv env source env/bin/activate
Давайте пойдем вперед и установите колбу и создайте файл требований. Примечание. Убедитесь, что ваша виртуальная среда активирована. Если нет, все пакеты, установленные на вашем компьютере, будут добавлены в файл требований.
pip install Flask pip freeze > requirements.txt
Далее создайте файл со следующим файлом: app.py
from flask import Flask, jsonify app = Flask(__name__) @app.route("/", methods = ['GET'] ) def func(): return jsonify({"message": "Hello World"}) if __name__ == '__main__': app.run(debug=True)
Этот код создает базовое приложение для колба с одной конечной точкой. Давайте проверим это. В вашем терминале написать Python App.py
Отказ Это запускает приложение Flask на вашем локальном компьютере. В вашем терминале вы должны увидеть линию, которая говорит что-то вроде «Бег на http://###.#.#.#: ###/». Если вы перейдете к этому URL в браузере, вы должны увидеть «Сообщение: Hello World»
Хорошо, теперь, когда приложение настроено, давайте разверним его Heroku.
Героку настроен
Обычно учебники прогуляются по всему процессу, прежде чем показывать вам, как его развернуть. Я собираюсь пройти через шаг развертывания сейчас, потому что Heroku позволяет автоматически развертывать, когда код нажимается на ветку. Кроме того, с этого момента нам нужно будет использовать безопасную информацию, такую как секреты и пароль. Использование конфигурации окружающей среды Heroku является легче, чем добавлять все клавиши к Bash_Profile My Computer, и делает, поэтому вы не смешиваете ключи в разных проектах.
Если вы еще этого не сделали, создайте учетную запись на Heroku . Затем установите Heroku Cli на ваш компьютер и пройти процесс настроек. Послепроизводители, создайте приложение и отправляйтесь на страницу развертывания, чтобы подключить его к репозиторию, в котором вы нажимаете свой код.
- Метод развертывания – GitHub (не стесняйтесь использовать Git Heroku Git, если хотите)
- Автоматическое развертывание – выберите ветвь, которую вы хотите автоматически развернуть, а затем нажмите «Включить автоматическое развертывание»
Прежде чем мы сможем проверить наше приложение, мы должны служить этому. Мы сделаем это, используя Gunicorn. Запустите следующее в своем терминале (убедитесь, что ваш VirtualenV все еще работает).
pip install gunicorn pip freeze > requirements.txt
Затем добавьте следующий файл. Имя файла: Procfile (предупреждение, нет никакого расширения для этого файла)
web: gunicorn app:app
Теперь совершайте свои изменения, подождите около минуты, а затем отправитесь на ваш сайт! Вы можете найти свой домен на странице «Настройки» в разделе «Домен и сертификаты».
Теперь, когда это настроен, давайте подключим приложение к Coinbase Pro.
Подключение к Coinbase Pro
Давайте создадим файл среды, чтобы мы могли развернуть приложение локально для тестирования.
Имя файла: .env.
CB_KEY=ENTER_YOUR_SANDBOX_KEY_HERE CB_PASSPHRASE=ENTER_YOUR_SANDBOX_PASSPHRASE_HERE CB_SECRET=ENTER_YOUR_SANDBOX_SECRET_HERE CB_URL=http://api-public.sandbox.pro.coinbase.com
Если вы загружаете свой код в публичный репо, убедитесь, что добавьте .env к вашему файлу .gitignore.
Далее давайте установим пакет Coinbase Pro Python.
pip install cbpro pip freeze > requirements.txt
Потому что я уже знаю, что я добавлю несколько функций (модулей), которые нужно будет подключиться к моей учетной записи Moinbase Pro (изготовление депозитов, размещение сделок, просмотр остатков и т. Д.), Я собираюсь создать функцию декоратора, которая будет Пройдите My Boinbase Authentific Client к любым необходимым функциям. Не волнуйтесь, я действительно узнал о функциях декоратора. Так что, если эта часть не имеет смысла для вас, не волнуйся. Декораторы не имеют смысла большинству из нас.
Имя файла: cbpro_client.py.
import cbpro from config import CB_CREDENTIALS def get_client(credentials): """Returns the cbpro AuthenticatedClient using the credentials from the parameters dict""" cbpro_client = cbpro.AuthenticatedClient(credentials['KEY'], credentials['SECRET'], credentials['PASSPHRASE'], api_url=credentials['URL']) return cbpro_client def cbpro_client(func): def function_wrapper(*args, **kwargs): cbpro_client = get_client(CB_CREDENTIALS) resp = func(cbpro_client = cbpro_client, *args, **kwargs) return resp return function_wrapper
В той же папке создайте файл конфигурации, который будет прочитать ваши учетные данные из файла .env (при использовании Heroku локально) или вашего Bash_Profile (при использовании Python App.py).
Имя файла: config.py.
# Coinbase Credentials CB_CREDENTIALS = { 'PASSPHRASE': os.environ['CB_PASSPHRASE'], 'SECRET': os.environ['CB_SECRET'], 'KEY': os.environ['CB_KEY'], 'URL': os.environ['CB_URL'] }
Следующим, мы делаем депозит!
Делать депозиты
Хорошо, это момент, когда мы все ждали.
Имя файла: Deposit_funds.py.
from cbpro_client import cbpro_client @cbpro_client def get_deposit_account(cbpro_client): """ Gets ID of account's ACH bank account (assumes there's only one) Params: - None Return: - account: dict { { "allow_buy": bool, "allow_deposit": bool, "allow_sell": bool, "allow_withdraw": bool, "cdv_status": str, "created_at": time, "currency": str, "id": str, "limits": dict "name": str, "primary_buy": bool, "primary_sell": bool, "resource": str, "resource_path": str, "type": str, "updated_at": time, "verification_method": str, "verified": bool } } """ bank_accounts = cbpro_client.get_payment_methods() for account in bank_accounts: # This assumes that there is only one ACH bank account connected if account['type'] == 'ach_bank_account': return account @cbpro_client def deposit_funds(cbpro_client, deposit_amount = 10): # Default deposit amount is $10 """ Makes deposit into USD Wallet Params: - deposit_amonut: int (default 10) Return: - deposit response { 'id' : str, 'amount' : str, 'currency' : 'USD', 'payout_at' : str (datetime) } """ deposit_account_id = get_deposit_account()['id'] resp = cbpro_client.deposit(deposit_amount, 'USD', deposit_account_id) return resp
Давайте распадаем. Первая функция извлекает банковский счет I D для учетной записи, используемой для внесения депозита. Эта функция предполагает, что есть только один аккаунт ACH. Итак, если у вас есть несколько учетных записей ACH, подключенные к вашей учетной записи CoinBase, не стесняйтесь настроить, как выбрана учетная запись. Вторая функция использует возвращенный банковский счет, чтобы сделать депозит.
* Случайно: я все еще пытаюсь выяснить мой стиль DocString. Если у кого-то есть советы или предложения, не стесняйтесь делиться!
Теперь давайте добавим эту функцию в наше приложение, чтобы мы могли проверить это! В вашем файле App.py добавьте следующее на вершину
from deposit_funds import deposit_funds
И прямо выше “если имя == ‘ Главная ‘: «Добавьте новую конечную точку
@app.route("/deposit", methods = ['GET']) def deposit_function(): resp = deposit_funds() return jsonify(resp)
Обычно именно здесь я бы сказал: «Чтобы проверить его, запустите следующее в своем терминале, а затем отправляйтесь в конечную точку депозита ( http://0.0.0.0:####/deposit) “
heroku local
Тем не менее, это дало бы ошибку, поскольку CoinBase не позволяет внесению средств через API в режиме Sandbox. Так к сожалению, это не будет работать. Однако, когда вы переключаетесь на свои настоящие учетные данные Coinbase, будет хорошо идти! Если вы не верите мне (все в порядке, мы только что встречались), затем вместо этого импортируйте функцию get_deposit_account и используйте эту функцию для конечной точки вклада. После установки вашего приложения локально вы должны увидеть объект JSON вашего депозита в браузере. Не забудьте переключиться в функцию Deposit_Funds.
Теперь я не знаю о вас, но я думаю, что было бы довольно приятно видеть вывод каждого шага в коде, чтобы убедиться, что все работает и правильно работает. Далее мы добавим некоторую регистрацию.
логирование
* Не стесняйтесь пропустить этот шаг, если регистрация не твой аромат
Регистрация – это потрясающий инструмент, который поможет вам увидеть, что происходит в вашем коде (больше не печатающих операторов!). Потому что я хочу быть дополнительным причудливым, мы будем опубликовать файлы журнала для ведер AWS S3, чтобы мы могли просматривать их легко.
Вот a Учебное пособие На создание IAM пользователь на AWS. Также Вот Как вы создаете ведро на AWS S3. Создайте ведро и запишите имя (например, crypto_bot_logs)
Давайте создадим наш регистратор. Во-первых, установите BOTO3, пакет для доступа к ресурсам AWS через Python
pip install boto3 pip freeze > requirements.txt
Во-вторых, добавьте свои учетные данные IAM к вашему файлу файла .env: .env
AWS_ACCESS_KEY_ID=ENTER_YOUR_KEY_HERE AWS_SECRET_ACCESS_KEY=ENTER_YOUR_SECRET_HERE
В-третьих, возьмите свои учетные данные в файл конфигурации, добавив следующее в конечное имя файла: config.py
# AWS Credentials AWS_ACCESS_KEY_ID = os.environ['AWS_ACCESS_KEY_ID'] AWS_SECRET_ACCESS_KEY = os.environ['AWS_SECRET_ACCESS_KEY']
В-четвертых (вправе даже слово?), Создайте свой файл файла регистратора: logger.py
import boto3 from datetime import datetime import logging from config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY s3_client = boto3.client('s3', aws_access_key_id = AWS_ACCESS_KEY_ID, aws_secret_access_key = AWS_SECRET_ACCESS_KEY, region_name = 'us-east-1') def create_logger(logger_name): logger = logging.getLogger(logger_name) logger.setLevel(logging.DEBUG) # create file handler which logs even debug messages fh = logging.FileHandler('{}_{}.log'.format(logger_name, datetime.now().isoformat().split('.')[0])) fh.setLevel(logging.DEBUG) # create formatter and add it to the handlers formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) # add the handlers to the logger logger.addHandler(fh) return logger def upload_log(logger): file_name = logger.handlers[0].baseFilename directory = datetime.now().date().isoformat() key = "{}/{}".format(directory, file_name.split('/')[-1]) bucket_name = ENTER_YOUR_BUCKET_FILENAME_HERE s3_client.upload_file(Filename = file_name, Bucket = bucket_name, Key = key) def logger(func): def function_wrapper(*args, **kwargs): function_name = func.__name__ logger = create_logger(function_name) logger.info("Now running - {}".format(function_name)) resp = func(logger = logger, *args, **kwargs) upload_log(logger) return resp return function_wrapper
Вот что делает каждую функцию:
- create_logger – создает регистратор с файломHandler
- upload_log – Загрузка Недавно созданный файл журнала в назначенный файл
- Logger – это функция декоратора, которая создает регистратор, передает его на функцию, а затем загружает файл журнала при окончании функции
Теперь мы можем добавить несколько операторов лесозаготовки к нашим функциям. Вот что я добавил, но не стесняйтесь настроить на основе того, что вы хотите увидеть. Вот удивительный учебник по лесозагонкам Отказ
Вот как сейчас выглядит функция My Deposit_Funds. Не забудьте импортировать регистратор на вершине
Имя файла: Deposit_funds.py.
@cbpro_client @logger def deposit_funds(cbpro_client, logger, deposit_amount = 10): # Default deposit amount is $10 """ Makes deposit into USD Wallet Params: - deposit_amonut: int (default 10) Return: - deposit response { 'id' : str, 'amount' : str, 'currency' : 'USD', 'payout_at' : str (datetime) } """ logger.info("Getting account ID") deposit_account_id = get_deposit_account()['id'] logger.info("Account ID: {}".format(deposit_account_id)) resp = cbpro_client.deposit(deposit_amount, 'USD', deposit_account_id) if 'message' in resp.keys(): logger.warning("In sandbox mode, unable to make deposit") else: logger.info("Deposit Response: {}".format(resp)) return resp
Если вы запустите свое приложение сейчас (Heroku Local) и отправляйтесь в конечную точку «/депозитов», вы увидите ту же ошибку, которую вы видели в предыдущем разделе. Однако, если вы отправитесь к вашему ведрю S3, откройте папку с сегодняшней датой и откройте файл с именем «Deposit_Funds_ [Todays_date] .log», вы должны увидеть что-то вроде этого.
Ура! Теперь мы можем видеть, где в функции появляется ошибка. Когда вы развертываете приложение к Heroku и используете свои производственные данные, журнал-сообщение покажет вам ответ для внесения депозита.
Это (почти) это! Совершить ваши изменения и подтолкнуть к вашему репо Так что это может пройти путь к Heroku.
Переменные среды в Героку
Помните, как мы создали файл .env, чтобы мы могли читать переменные среды при использовании Local Heroku? Ну, теперь, когда это время игры, пришло время добавлять наши настоящие полномочия на наше приложение Heroku. На странице настроек вашего приложения в Heroku нажмите «Показать конфигурацию vars» и добавьте следующие пары значения клавиш.
- Ключ: значение CB_KEY: your_production_cb_key
- Ключ: ценность CB_PASSPHASSHRASE: your_production_passephrase
- Ключ: значение CB_Secret: Your_production_secret.
- Ключ: значение CB_URL: https://api.pro.coinbase.com.
- Ключ: AWS_ACCESS_KEY_ID Значение: your_aws_access_key
- Ключ: aws_secret_access_key Значение: your_aws_secret_key
- Ключ: значение TZ: ваш часовой пояс (например, America/New_york) (необязательно)
Теперь, когда ваше приложение работает, он будет использовать эти учетные данные.
Расписание
Если вы сделали это далеко, поздравляю! Теперь у вас есть приложение, которое делает депозит в размере 10 долларов, когда вы идете на http://your_domain_url.com/deposit Отказ Но что, если вы хотите, чтобы приложение сделало это автоматически? Далее я покажу вам, как внести несколько небольших изменений, так что функция Deposit_Funds работает по расписанию.
Хорошо, еще один пакет для установки. В вашем терминале выполните следующее:
pip install flask_script pip freeze > requirements.txt
Затем создайте следующий файл. Имя файла: manage.py.
from flask_script import Manager from app import app from deposit_funds import deposit_funds manager = Manager(app) @manager.command def make_deposit(): deposit_funds()
Этот файл создает команду, которую мы можем позвонить из Heroku.
Затем на вкладке «Ресурсы» на приборной панели Heroku ищите планировщику Heroku и добавьте его в свое приложение. Примечание: Heroku может попросить вас добавить информацию об оплате на вашу учетную запись. Нажмите на «Heroku Scheduler», а затем «Создать работу». Я хочу, чтобы моя функция проводится каждый четверг. Вот как выглядит моя работа
Запустите команду: если [«$ (дата]; затем python manage.py make_deposit; fi
Нажмите «Сохранить работу», чтобы заблокировать его. Вы закончили! Теперь у вас есть приложение, которое сделает автоматические депозиты в вашу учетную запись Coinbase Pro и журнал действий в ведро S3!
Дополнительные ноты
Другая альтернатива – создать функцию AWS Lambda и которая называется через AWS CloudWatch. Если вы заинтересованы в том, чтобы увидеть, как это сделать таким образом, дайте мне знать!
Оригинал: “https://dev.to/itstayfay/building-a-crypto-trading-bot-in-python-101-automatic-deposits-on-coinbase-pro-dnd”