The unofficial Python client for the Coinbase Pro API
coinbasepro-python
The Python client for the Coinbase Pro API (formerly known as the GDAX)
Provided under MIT License by Daniel Paquin.
*Note: this library may be subtly broken or buggy. The code is released under the MIT License – please take the following message to heart:*THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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
- Do not worry about handling the nuances of the API with easy-to-use methods
- Gain an advantage in the market by getting under the hood of CB Pro to learn
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.**- https://docs.pro.coinbase.com/
- You may manually install the project or use
:
pip install cbpro
#or
pip install git+git://github.com/danpaquin/coinbasepro-python.git
Public Client
Only some endpoints in the API are available to everyone. The public endpoints can be reached using
import cbpro
public_client = cbpro.PublicClient()
PublicClient Methods
publicclient.getproducts()
# Get the order book at the default level.
publicclient.getproductorderbook('BTC-USD')
Get the order book at a specific level.
publicclient.getproductorderbook('BTC-USD', level=1)
# Get the product ticker for a specific product.
publicclient.getproductticker(productid='ETH-USD')
- getproduct_trades (paginated)
# Get the product trades for a specific product.
Returns a generator
publicclient.getproducttrades(productid='ETH-USD')
publicclient.getproducthistoricrates('ETH-USD')
To include other parameters, see function docstring:
publicclient.getproducthistoricrates('ETH-USD', granularity=3000)
publicclient.getproduct24hrstats('ETH-USD')
publicclient.getcurrencies()
publicclient.gettime()
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)
Use the sandbox API (requires a different set of API access credentials)
auth_client = cbpro.AuthenticatedClient(key, b64secret, passphrase,
api_url="https://api-public.sandbox.pro.coinbase.com")
Pagination
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 optionsbefore, after, and limit may be supplied as
keyword arguments if desired, but aren't necessary for typical use cases.
fillsgen = authclient.get_fills()
Get all fills (will possibly make multiple HTTP requests)
allfills = list(fillsgen)
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=sometradeid, 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
Get 5 most recent fills
recentfills = islice(authclient.get_fills(), 5)
Only fetch new fills since last call by utilizing before parameter.
newfills = authclient.getfills(before=recentfills[0]['trade_id'])
AuthenticatedClient Methods
authclient.getaccounts()
authclient.getaccount("7d0f7d8e-dd34-4d9c-a846-06f431c381ba")
- getaccount_history (paginated)
# Returns generator:
authclient.getaccount_history("7d0f7d8e-dd34-4d9c-a846-06f431c381ba")
- getaccount_holds (paginated)
# Returns generator:
authclient.getaccount_holds("7d0f7d8e-dd34-4d9c-a846-06f431c381ba")
# Buy 0.01 BTC @ 100 USD
auth_client.buy(price='100.00', #USD
size='0.01', #BTC
order_type='limit',
product_id='BTC-USD')
# Sell 0.01 BTC @ 200 USD
auth_client.sell(price='200.00', #USD
size='0.01', #BTC
order_type='limit',
product_id='BTC-USD')
# Limit order-specific method
authclient.placelimitorder(productid='BTC-USD',
side='buy',
price='200.00',
size='0.01')
# Place a market order by specifying amount of USD to use.
Alternatively, size could be used to specify quantity in BTC amount.
authclient.placemarketorder(productid='BTC-USD',
side='buy',
funds='100.00')
# Stop order. funds can be used instead of size here.
authclient.placestoporder(productid='BTC-USD',
stop_type='loss',
price='200.00',
size='0.01')
authclient.cancelorder("d50ec984-77a8-460a-b958-66f114b0de9b")
authclient.cancelall(product_id='BTC-USD')
- getorders (paginated)
# Returns generator:
authclient.getorders()
authclient.getorder("d50ec984-77a8-460a-b958-66f114b0de9b")
- getfills (paginated)
# All return generators
authclient.getfills()
Get fills for a specific order
authclient.getfills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")
Get fills for a specific product
authclient.getfills(product_id="ETH-BTC")
depositParams = {
'amount': '25.00', # Currency determined by account specified
'coinbaseaccountid': '60680c98bfe96c2601f27e9c'
}
auth_client.deposit(depositParams)
# Withdraw from CB Pro into Coinbase Wallet
withdrawParams = {
'amount': '1.00', # Currency determined by account specified
'coinbaseaccountid': '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
Parameters are optional
wsClient = cbpro.WebsocketClient(url="wss://ws-feed.pro.coinbase.com",
products="BTC-USD",
channels=["ticker"])
Do other stuff...
wsClient.close()
Subscribe to multiple products
import cbpro
Parameters are optional
wsClient = cbpro.WebsocketClient(url="wss://ws-feed.pro.coinbase.com",
products=["BTC-USD", "ETH-USD"],
channels=["ticker"])
Do other stuff...
wsClient.close()
WebsocketClient + Mongodb
The now supports data gathering via MongoDB. Given a
MongoDB collection, the will stream results directly into
the database collection.
# import PyMongo and connect to a local, running Mongo instance
from pymongo import MongoClient
import cbpro
mongo_client = MongoClient('mongodb://localhost:27017/')
specify the database and collection
db = mongoclient.cryptocurrencydatabase
BTCcollection = db.BTCcollection
instantiate a WebsocketClient instance, with a Mongo collection as a parameter
wsClient = cbpro.WebsocketClient(url="wss://ws-feed.pro.coinbase.com", products="BTC-USD",
mongocollection=BTCcollection, should_print=False)
wsClient.start()
WebsocketClient Methods
The 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
- onMessage - called once for every message that arrives and accepts one
- 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 ("\nmessagecount =", "{} \n".format(wsClient.messagecount)) time.sleep(1) wsClient.close()
Testing
A test suite is under development. Tests for the authenticated client require a set of sandbox API credentials. To provide them, renameapiconfig.json.example in the tests folder to apiconfig.json and edit the file accordingly. To run the tests, start in the project directory and run python -m pytest
Real-time OrderBook
The is a convenient data structure to keep a real-time record of
the orderbook for the product_id input. It processes incoming messages from an
already existing WebsocketClient. Please provide your feedback for future
improvements.
import cbpro, time, Queue
class myWebsocketClient(cbpro.WebsocketClient):
def on_open(self):
self.products = ['BTC-USD', 'ETH-USD']
self.orderbookbtc = OrderBookConsole(product_id='BTC-USD')
self.orderbooketh = OrderBookConsole(product_id='ETH-USD')
def on_message(self, msg):
self.orderbookbtc.process_message(msg)
self.orderbooketh.process_message(msg)
wsClient = myWebsocketClient() wsClient.start() time.sleep(10) while True: print(wsClient.orderbookbtc.get_ask()) print(wsClient.orderbooketh.get_bid()) time.sleep(1)
Testing
Unit tests are under development using the pytest framework. Contributions are welcome!To run the full test suite, in the project directory run:
python -m pytest
Change Log
1.1.2 Current PyPI release- Refactor project for Coinbase Pro
- Major overhaul on how pagination is handled
- The first release that is not backwards compatible
- Refactored to follow PEP 8 Standards
- Improved Documentation
- Added crypto and LTC deposit & withdraw (undocumented).
- Added support for Margin trading (undocumented).
- Enhanced functionality of the WebsocketClient.
- Soft launch of the OrderBook (undocumented).
- Minor bug squashing & syntax improvements.
- Added additional API functionality such as cancelAll() and ETH withdrawal.
- Allowed
to operate intuitively and restructured example
0.2.0
- Renamed project to GDAX-Python
- Merged Websocket updates to handle errors and reconnect.
- Updated JSON handling for increased compatibility among some users.
- Added support for payment methods, reports, and Coinbase user accounts.
- Other compatibility updates.
- Original PyPI Release.