coinbasepro-python
![PyPI version](https://badge.fury.io/py/cbpro2.svg)
The Python client for the Coinbase Pro API (formerly known as
the GDAX)
Note
This is a fork of the original cbpro project.
I created this fork because between September and October of 2018, the maintainers of
that project seemed to be inactive in reviewing and merging pull requests. The goal of
this fork is as follows:
- Keep reasonably up-to-date with upstream
- Improve developer workflow and style
- Surface coverage stats to encourage unit testing
Benefits
- A simple to use python wrapper for both public and authenticated endpoints.
- In about 10 minutes, you could be programmatically trading on one of the
largest Bitcoin exchanges in the world!
- Do not worry about handling the nuances of the API with easy-to-use methods
for every API endpoint.
- Gain an advantage in the market by getting under the hood of CB Pro to learn
what and who is behind every tick.
Under Development
- Test Scripts
- Additional Functionality for the real-time order book
- FIX API Client Looking for assistance
Getting Started
This README is documentation on the syntax of the python client presented in
this repository. See function docstrings for full syntax details.
This API attempts to present a clean interface to CB Pro, but in order to use it
to its full potential, you must familiarize yourself with the official CB Pro
documentation.
pip install cbpro2
pip install git+git://github.com/yiwensong/coinbasepro-python.git
Public Client
Only some endpoints in the API are available to everyone. The public endpoints
can be reached using PublicClient
import cbpro
public_client = cbpro.PublicClient()
PublicClient Methods
public_client.get_products()
public_client.get_product_order_book('BTC-USD')
public_client.get_product_order_book('BTC-USD', level=1)
public_client.get_product_ticker(product_id='ETH-USD')
public_client.get_product_trades(product_id='ETH-USD')
public_client.get_product_historic_rates('ETH-USD')
public_client.get_product_historic_rates('ETH-USD', granularity=3000)
public_client.get_product_24hr_stats('ETH-USD')
public_client.get_currencies()
public_client.get_time()
Authenticated Client
Not all API endpoints are available to everyone.
Those requiring user authentication can be reached using AuthenticatedClient
.
You must setup API access within your
account settings.
The AuthenticatedClient
inherits all methods from the PublicClient
class, so you will only need to initialize one if you are planning to
integrate both into your script.
import cbpro
auth_client = cbpro.AuthenticatedClient(key, b64secret, passphrase)
auth_client = cbpro.AuthenticatedClient(key, b64secret, passphrase,
api_url="https://api-public.sandbox.pro.coinbase.com")
Some calls are paginated, meaning multiple
calls must be made to receive the full set of data. The CB Pro Python API provides
an abstraction for paginated endpoints in the form of generators which provide a
clean interface for iteration but may make multiple HTTP requests behind the
scenes. The pagination options before
, after
, and limit
may be supplied as
keyword arguments if desired, but aren't necessary for typical use cases.
fills_gen = auth_client.get_fills()
all_fills = list(fills_gen)
One use case for pagination parameters worth pointing out is retrieving only
new data since the previous request. For the case of get_fills()
, the
trade_id
is the parameter used for indexing. By passing
before=some_trade_id
, only fills more recent than that trade_id
will be
returned. Note that when using before
, a maximum of 100 entries will be
returned - this is a limitation of CB Pro.
from itertools import islice
recent_fills = islice(auth_client.get_fills(), 5)
new_fills = auth_client.get_fills(before=recent_fills[0]['trade_id'])
AuthenticatedClient Methods
auth_client.get_accounts()
auth_client.get_account("7d0f7d8e-dd34-4d9c-a846-06f431c381ba")
auth_client.get_account_history("7d0f7d8e-dd34-4d9c-a846-06f431c381ba")
auth_client.get_account_holds("7d0f7d8e-dd34-4d9c-a846-06f431c381ba")
auth_client.buy(price='100.00',
size='0.01',
order_type='limit',
product_id='BTC-USD')
auth_client.sell(price='200.00',
size='0.01',
order_type='limit',
product_id='BTC-USD')
auth_client.place_limit_order(product_id='BTC-USD',
side='buy',
price='200.00',
size='0.01')
auth_client.place_market_order(product_id='BTC-USD',
side='buy',
funds='100.00')
auth_client.place_stop_order(product_id='BTC-USD',
side='buy',
price='200.00',
size='0.01')
auth_client.cancel_order("d50ec984-77a8-460a-b958-66f114b0de9b")
auth_client.cancel_all(product_id='BTC-USD')
auth_client.get_orders()
auth_client.get_order("d50ec984-77a8-460a-b958-66f114b0de9b")
auth_client.get_fills()
auth_client.get_fills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")
auth_client.get_fills(product_id="ETH-BTC")
depositParams = {
'amount': '25.00',
'coinbase_account_id': '60680c98bfe96c2601f27e9c'
}
auth_client.deposit(depositParams)
withdrawParams = {
'amount': '1.00',
'coinbase_account_id': '536a541fa9393bb3c7000023'
}
auth_client.withdraw(withdrawParams)
WebsocketClient
If you would like to receive real-time market updates, you must subscribe to the
websocket feed.
Subscribe to a single product
import cbpro
wsClient = cbpro.WebsocketClient(url="wss://ws-feed.pro.coinbase.com", products="BTC-USD")
wsClient.close()
Subscribe to multiple products
import cbpro
wsClient = cbpro.WebsocketClient(url="wss://ws-feed.pro.coinbase.com",
products=["BTC-USD", "ETH-USD"])
wsClient.close()
WebsocketClient + Mongodb
The WebsocketClient
now supports data gathering via MongoDB. Given a
MongoDB collection, the WebsocketClient
will stream results directly into
the database collection.
from pymongo import MongoClient
import cbpro
mongo_client = MongoClient('mongodb://localhost:27017/')
db = mongo_client.cryptocurrency_database
BTC_collection = db.BTC_collection
wsClient = cbpro.WebsocketClient(url="wss://ws-feed.pro.coinbase.com", products="BTC-USD",
mongo_collection=BTC_collection, should_print=False)
wsClient.start()
WebsocketClient Methods
The WebsocketClient
subscribes in a separate thread upon initialization.
There are three methods which you could overwrite (before initialization) so it
can react to the data streaming in. The current client is a template used for
illustration purposes only.
- onOpen - called once, immediately before the socket connection is made, this
is where you want to add initial parameters.
- onMessage - called once for every message that arrives and accepts one
argument that contains the message of dict type.
- on_close - called once after the websocket has been closed.
- close - call this method to close the websocket connection (do not overwrite).
import cbpro, time
class myWebsocketClient(cbpro.WebsocketClient):
def on_open(self):
self.url = "wss://ws-feed.pro.coinbase.com/"
self.products = ["LTC-USD"]
self.message_count = 0
print("Lets count the messages!")
def on_message(self, msg):
self.message_count += 1
if 'price' in msg and 'type' in msg:
print ("Message type:", msg["type"],
"\t@ {:.3f}".format(float(msg["price"])))
def on_close(self):
print("-- Goodbye! --")
wsClient = myWebsocketClient()
wsClient.start()
print(wsClient.url, wsClient.products)
while (wsClient.message_count < 500):
print ("\nmessage_count =", "{} \n".format(wsClient.message_count))
time.sleep(1)
wsClient.close()
Real-time OrderBook
The OrderBook
subscribes to a websocket and keeps a real-time record of
the orderbook for the product_id input. Please provide your feedback for future
improvements.
import cbpro, time
order_book = cbpro.OrderBook(product_id='BTC-USD')
order_book.start()
time.sleep(10)
order_book.close()
Development
Development Environment
A development environment can be created and activated with the commands
make venv && . venv/bin/activate
Automated Testing
Unit test framework uses pytest, coverage, and tox. A test suite is under development,
please contribute to the coverage. Tests for the authenticated client require a
set of sandbox API credentials. To provide them, rename
api_config.json.example
in the tests folder to api_config.json
and edit the
file accordingly. To run the tests, start in the project directory and run
make test
Pre-commit
This project uses pre-commit to enforce coding style. You can run pre-commit with
the following command (after activating the venv)
pre-commit run --files [FILES]
You can also run
pre-commit run --all-files
but that is guaranteed to fail because of legacy code that has yet to be linted.