Рубрики
Без рубрики

Строительство Crypto Trading Bot в Python 101: Автоматические месторождения на Coinbase Pro

В этом руководстве по вашему мнению проходит как настроить автоматические месторождения на Coinbase Pro. Теги с Python, Crypto, Heroku.

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

  1. Профиль в правом верхнем углу -> API -> Новый ключ API
  2. Разрешения – позже, я покажу вам, как размещать сделки, поэтому на данный момент вы можете выбрать все три (просмотр, передача, торговля)
  3. Пароль – оставить как по умолчанию
  4. IP Whitelist – оставьте как по умолчанию
  5. Два факторных кода аутентификации – зависит от того, как вы настраиваете свою учетную запись

Когда вы закончите, вы должны иметь следующее для ваших продуктов, так и для счета 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”