Repository files navigation

gdax-python

The Python client for the GDAX API (formerly known as the Coinbase Exchange API)

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 OR IMPLIED, 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 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 GDAX to learn what and who is really 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 GDAX, but in order to use it to its full potential, you must familiarize yourself with the official GDAX documentation.

pipinstallgdax

Public Client

Only some endpoints in the API are available to everyone. The public endpoints can be reached using PublicClient

importgdaxpublic_client=gdax.PublicClient()

PublicClient Methods

public_client.get_products()
# Get the order book at the default level.public_client.get_product_order_book('BTC-USD')
# Get the order book at a specific level.public_client.get_product_order_book('BTC-USD', level=1)
# Get the product ticker for a specific product.public_client.get_product_ticker(product_id='ETH-USD')
# Get the product trades for a specific product.public_client.get_product_trades(product_id='ETH-USD')
public_client.get_product_historic_rates('ETH-USD')
# To include other parameters, see function docstring: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.

importgdaxauth_client=gdax.AuthenticatedClient(key, b64secret, passphrase)
# Use the sandbox API (requires a different set of API access credentials)auth_client=gdax.AuthenticatedClient(key, b64secret, passphrase,
api_url="https://api-public.sandbox.gdax.com")

Pagination

Some calls are paginated, meaning multiple calls must be made to receive the full set of data. Each page/request is a list of dict objects that are then appended to a master list, making it easy to navigate pages (e.g. request[0] would return the first page of data in the example below). This feature is under consideration for redesign. Please provide feedback if you have issues or suggestions

request=auth_client.get_fills(limit=100)
request[0] # Page 1 always presentrequest[1] # Page 2+ present only if the data exists

It should be noted that limit does not behave exactly as the official documentation specifies. If you request a limit and that limit is met, additional pages will not be returned. This is to ensure speedy response times when less data is preferred.

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")
# Buy 0.01 BTC @ 100 USDauth_client.buy(price='100.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
# Sell 0.01 BTC @ 200 USDauth_client.sell(price='200.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
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()
# Get fills for a specific orderauth_client.get_fills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")
# Get fills for a specific productauth_client.get_fills(product_id="ETH-BTC")
gdaxdepositParams= {
'amount': '25.00', # Currency determined by account specified'coinbase_account_id': '60680c98bfe96c2601f27e9c'
}
auth_client.deposit(depositParams)
# Withdraw from GDAX into Coinbase WalletwithdrawParams= {
'amount': '1.00', # Currency determined by account specified'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

importgdax# Paramters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com", products="BTC-USD")
# Do other stuff...wsClient.close()

Subscribe to multiple products

importgdax# Paramaters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com",
products=["BTC-USD", "ETH-USD"])
# Do other stuff...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.

# import PyMongo and connect to a local, running Mongo instancefrompymongoimportMongoClientimportgdaxmongo_client=MongoClient('mongodb://localhost:27017/')
# specify the database and collectiondb=mongo_client.cryptocurrency_databaseBTC_collection=db.BTC_collection# instantiate a WebsocketClient instance, with a Mongo collection as a parameterwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.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.
  • onClose - called once after the websocket has been closed.
  • close - call this method to close the websocket connection (do not overwrite).
importgdax, timeclassmyWebsocketClient(gdax.WebsocketClient):
defon_open(self):
self.url="wss://ws-feed.gdax.com/"self.products= ["LTC-USD"]
self.message_count=0print("Lets count the messages!")
defon_message(self, msg):
self.message_count+=1if'price'inmsgand'type'inmsg:
print ("Message type:", msg["type"],
"\t@ {:.3f}".format(float(msg["price"])))
defon_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()

Testing

A test suite is under development. To run the tests, start in the project directory and run

python -m pytest

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.

importgdax, timeorder_book=gdax.OrderBook(product_id='BTC-USD')
order_book.start()
time.sleep(10)
order_book.close()

Change Log

1.0Current PyPI release

  • The first release that is not backwards compatible
  • Refactored to follow PEP 8 Standards
  • Improved Documentation

0.3

  • 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.

0.2.2

  • Added additional API functionality such as cancelAll() and ETH withdrawal.

0.2.1

  • Allowed WebsocketClient to operate intuitively and restructured example workflow.

0.2.0

  • Renamed project to GDAX-Python
  • Merged Websocket updates to handle errors and reconnect.

0.1.2

  • Updated JSON handling for increased compatibility among some users.
  • Added support for payment methods, reports, and Coinbase user accounts.
  • Other compatibility updates.

0.1.1b2

  • Original PyPI Release.

About

The unofficial Python client for the GDAX API

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

gdax-python

The Python client for the GDAX API (formerly known as the Coinbase Exchange API)

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 OR IMPLIED, 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 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 GDAX to learn what and who is really 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 GDAX, but in order to use it to its full potential, you must familiarize yourself with the official GDAX documentation.

pipinstallgdax

Public Client

Only some endpoints in the API are available to everyone. The public endpoints can be reached using PublicClient

importgdaxpublic_client=gdax.PublicClient()

PublicClient Methods

public_client.get_products()
# Get the order book at the default level.public_client.get_product_order_book('BTC-USD')
# Get the order book at a specific level.public_client.get_product_order_book('BTC-USD', level=1)
# Get the product ticker for a specific product.public_client.get_product_ticker(product_id='ETH-USD')
# Get the product trades for a specific product.public_client.get_product_trades(product_id='ETH-USD')
public_client.get_product_historic_rates('ETH-USD')
# To include other parameters, see function docstring: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.

importgdaxauth_client=gdax.AuthenticatedClient(key, b64secret, passphrase)
# Use the sandbox API (requires a different set of API access credentials)auth_client=gdax.AuthenticatedClient(key, b64secret, passphrase,
api_url="https://api-public.sandbox.gdax.com")

Pagination

Some calls are paginated, meaning multiple calls must be made to receive the full set of data. Each page/request is a list of dict objects that are then appended to a master list, making it easy to navigate pages (e.g. request[0] would return the first page of data in the example below). This feature is under consideration for redesign. Please provide feedback if you have issues or suggestions

request=auth_client.get_fills(limit=100)
request[0] # Page 1 always presentrequest[1] # Page 2+ present only if the data exists

It should be noted that limit does not behave exactly as the official documentation specifies. If you request a limit and that limit is met, additional pages will not be returned. This is to ensure speedy response times when less data is preferred.

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")
# Buy 0.01 BTC @ 100 USDauth_client.buy(price='100.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
# Sell 0.01 BTC @ 200 USDauth_client.sell(price='200.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
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()
# Get fills for a specific orderauth_client.get_fills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")
# Get fills for a specific productauth_client.get_fills(product_id="ETH-BTC")
gdaxdepositParams= {
'amount': '25.00', # Currency determined by account specified'coinbase_account_id': '60680c98bfe96c2601f27e9c'
}
auth_client.deposit(depositParams)
# Withdraw from GDAX into Coinbase WalletwithdrawParams= {
'amount': '1.00', # Currency determined by account specified'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

importgdax# Paramters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com", products="BTC-USD")
# Do other stuff...wsClient.close()

Subscribe to multiple products

importgdax# Paramaters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com",
products=["BTC-USD", "ETH-USD"])
# Do other stuff...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.

# import PyMongo and connect to a local, running Mongo instancefrompymongoimportMongoClientimportgdaxmongo_client=MongoClient('mongodb://localhost:27017/')
# specify the database and collectiondb=mongo_client.cryptocurrency_databaseBTC_collection=db.BTC_collection# instantiate a WebsocketClient instance, with a Mongo collection as a parameterwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.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.
  • onClose - called once after the websocket has been closed.
  • close - call this method to close the websocket connection (do not overwrite).
importgdax, timeclassmyWebsocketClient(gdax.WebsocketClient):
defon_open(self):
self.url="wss://ws-feed.gdax.com/"self.products= ["LTC-USD"]
self.message_count=0print("Lets count the messages!")
defon_message(self, msg):
self.message_count+=1if'price'inmsgand'type'inmsg:
print ("Message type:", msg["type"],
"\t@ {:.3f}".format(float(msg["price"])))
defon_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()

Testing

A test suite is under development. To run the tests, start in the project directory and run

python -m pytest

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.

importgdax, timeorder_book=gdax.OrderBook(product_id='BTC-USD')
order_book.start()
time.sleep(10)
order_book.close()

Change Log

1.0Current PyPI release

  • The first release that is not backwards compatible
  • Refactored to follow PEP 8 Standards
  • Improved Documentation

0.3

  • 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.

0.2.2

  • Added additional API functionality such as cancelAll() and ETH withdrawal.

0.2.1

  • Allowed WebsocketClient to operate intuitively and restructured example workflow.

0.2.0

  • Renamed project to GDAX-Python
  • Merged Websocket updates to handle errors and reconnect.

0.1.2

  • Updated JSON handling for increased compatibility among some users.
  • Added support for payment methods, reports, and Coinbase user accounts.
  • Other compatibility updates.

0.1.1b2

  • Original PyPI Release.

About

The unofficial Python client for the GDAX API

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gdax-python

The Python client for the GDAX API (formerly known as the Coinbase Exchange API)

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 OR IMPLIED, 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 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 GDAX to learn what and who is really 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 GDAX, but in order to use it to its full potential, you must familiarize yourself with the official GDAX documentation.

pipinstallgdax

Public Client

Only some endpoints in the API are available to everyone. The public endpoints can be reached using PublicClient

importgdaxpublic_client=gdax.PublicClient()

PublicClient Methods

public_client.get_products()
# Get the order book at the default level.public_client.get_product_order_book('BTC-USD')
# Get the order book at a specific level.public_client.get_product_order_book('BTC-USD', level=1)
# Get the product ticker for a specific product.public_client.get_product_ticker(product_id='ETH-USD')
# Get the product trades for a specific product.public_client.get_product_trades(product_id='ETH-USD')
public_client.get_product_historic_rates('ETH-USD')
# To include other parameters, see function docstring: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.

importgdaxauth_client=gdax.AuthenticatedClient(key, b64secret, passphrase)
# Use the sandbox API (requires a different set of API access credentials)auth_client=gdax.AuthenticatedClient(key, b64secret, passphrase,
api_url="https://api-public.sandbox.gdax.com")

Pagination

Some calls are paginated, meaning multiple calls must be made to receive the full set of data. Each page/request is a list of dict objects that are then appended to a master list, making it easy to navigate pages (e.g. request[0] would return the first page of data in the example below). This feature is under consideration for redesign. Please provide feedback if you have issues or suggestions

request=auth_client.get_fills(limit=100)
request[0] # Page 1 always presentrequest[1] # Page 2+ present only if the data exists

It should be noted that limit does not behave exactly as the official documentation specifies. If you request a limit and that limit is met, additional pages will not be returned. This is to ensure speedy response times when less data is preferred.

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")
# Buy 0.01 BTC @ 100 USDauth_client.buy(price='100.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
# Sell 0.01 BTC @ 200 USDauth_client.sell(price='200.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
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()
# Get fills for a specific orderauth_client.get_fills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")
# Get fills for a specific productauth_client.get_fills(product_id="ETH-BTC")
gdaxdepositParams= {
'amount': '25.00', # Currency determined by account specified'coinbase_account_id': '60680c98bfe96c2601f27e9c'
}
auth_client.deposit(depositParams)
# Withdraw from GDAX into Coinbase WalletwithdrawParams= {
'amount': '1.00', # Currency determined by account specified'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

importgdax# Paramters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com", products="BTC-USD")
# Do other stuff...wsClient.close()

Subscribe to multiple products

importgdax# Paramaters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com",
products=["BTC-USD", "ETH-USD"])
# Do other stuff...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.

# import PyMongo and connect to a local, running Mongo instancefrompymongoimportMongoClientimportgdaxmongo_client=MongoClient('mongodb://localhost:27017/')
# specify the database and collectiondb=mongo_client.cryptocurrency_databaseBTC_collection=db.BTC_collection# instantiate a WebsocketClient instance, with a Mongo collection as a parameterwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.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.
  • onClose - called once after the websocket has been closed.
  • close - call this method to close the websocket connection (do not overwrite).
importgdax, timeclassmyWebsocketClient(gdax.WebsocketClient):
defon_open(self):
self.url="wss://ws-feed.gdax.com/"self.products= ["LTC-USD"]
self.message_count=0print("Lets count the messages!")
defon_message(self, msg):
self.message_count+=1if'price'inmsgand'type'inmsg:
print ("Message type:", msg["type"],
"\t@ {:.3f}".format(float(msg["price"])))
defon_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()

Testing

A test suite is under development. To run the tests, start in the project directory and run

python -m pytest

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.

importgdax, timeorder_book=gdax.OrderBook(product_id='BTC-USD')
order_book.start()
time.sleep(10)
order_book.close()

Change Log

1.0Current PyPI release

  • The first release that is not backwards compatible
  • Refactored to follow PEP 8 Standards
  • Improved Documentation

0.3

  • 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.

0.2.2

  • Added additional API functionality such as cancelAll() and ETH withdrawal.

0.2.1

  • Allowed WebsocketClient to operate intuitively and restructured example workflow.

0.2.0

  • Renamed project to GDAX-Python
  • Merged Websocket updates to handle errors and reconnect.

0.1.2

  • Updated JSON handling for increased compatibility among some users.
  • Added support for payment methods, reports, and Coinbase user accounts.
  • Other compatibility updates.

0.1.1b2

  • Original PyPI Release.

About

The unofficial Python client for the GDAX API

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gdax-python

The Python client for the GDAX API (formerly known as the Coinbase Exchange API)

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 OR IMPLIED, 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 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 GDAX to learn what and who is really 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 GDAX, but in order to use it to its full potential, you must familiarize yourself with the official GDAX documentation.

pipinstallgdax

Public Client

Only some endpoints in the API are available to everyone. The public endpoints can be reached using PublicClient

importgdaxpublic_client=gdax.PublicClient()

PublicClient Methods

public_client.get_products()
# Get the order book at the default level.public_client.get_product_order_book('BTC-USD')
# Get the order book at a specific level.public_client.get_product_order_book('BTC-USD', level=1)
# Get the product ticker for a specific product.public_client.get_product_ticker(product_id='ETH-USD')
# Get the product trades for a specific product.public_client.get_product_trades(product_id='ETH-USD')
public_client.get_product_historic_rates('ETH-USD')
# To include other parameters, see function docstring: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.

importgdaxauth_client=gdax.AuthenticatedClient(key, b64secret, passphrase)
# Use the sandbox API (requires a different set of API access credentials)auth_client=gdax.AuthenticatedClient(key, b64secret, passphrase,
api_url="https://api-public.sandbox.gdax.com")

Pagination

Some calls are paginated, meaning multiple calls must be made to receive the full set of data. Each page/request is a list of dict objects that are then appended to a master list, making it easy to navigate pages (e.g. request[0] would return the first page of data in the example below). This feature is under consideration for redesign. Please provide feedback if you have issues or suggestions

request=auth_client.get_fills(limit=100)
request[0] # Page 1 always presentrequest[1] # Page 2+ present only if the data exists

It should be noted that limit does not behave exactly as the official documentation specifies. If you request a limit and that limit is met, additional pages will not be returned. This is to ensure speedy response times when less data is preferred.

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")
# Buy 0.01 BTC @ 100 USDauth_client.buy(price='100.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
# Sell 0.01 BTC @ 200 USDauth_client.sell(price='200.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
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()
# Get fills for a specific orderauth_client.get_fills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")
# Get fills for a specific productauth_client.get_fills(product_id="ETH-BTC")
gdaxdepositParams= {
'amount': '25.00', # Currency determined by account specified'coinbase_account_id': '60680c98bfe96c2601f27e9c'
}
auth_client.deposit(depositParams)
# Withdraw from GDAX into Coinbase WalletwithdrawParams= {
'amount': '1.00', # Currency determined by account specified'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

importgdax# Paramters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com", products="BTC-USD")
# Do other stuff...wsClient.close()

Subscribe to multiple products

importgdax# Paramaters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com",
products=["BTC-USD", "ETH-USD"])
# Do other stuff...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.

# import PyMongo and connect to a local, running Mongo instancefrompymongoimportMongoClientimportgdaxmongo_client=MongoClient('mongodb://localhost:27017/')
# specify the database and collectiondb=mongo_client.cryptocurrency_databaseBTC_collection=db.BTC_collection# instantiate a WebsocketClient instance, with a Mongo collection as a parameterwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.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.
  • onClose - called once after the websocket has been closed.
  • close - call this method to close the websocket connection (do not overwrite).
importgdax, timeclassmyWebsocketClient(gdax.WebsocketClient):
defon_open(self):
self.url="wss://ws-feed.gdax.com/"self.products= ["LTC-USD"]
self.message_count=0print("Lets count the messages!")
defon_message(self, msg):
self.message_count+=1if'price'inmsgand'type'inmsg:
print ("Message type:", msg["type"],
"\t@ {:.3f}".format(float(msg["price"])))
defon_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()

Testing

A test suite is under development. To run the tests, start in the project directory and run

python -m pytest

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.

importgdax, timeorder_book=gdax.OrderBook(product_id='BTC-USD')
order_book.start()
time.sleep(10)
order_book.close()

Change Log

1.0Current PyPI release

  • The first release that is not backwards compatible
  • Refactored to follow PEP 8 Standards
  • Improved Documentation

0.3

  • 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.

0.2.2

  • Added additional API functionality such as cancelAll() and ETH withdrawal.

0.2.1

  • Allowed WebsocketClient to operate intuitively and restructured example workflow.

0.2.0

  • Renamed project to GDAX-Python
  • Merged Websocket updates to handle errors and reconnect.

0.1.2

  • Updated JSON handling for increased compatibility among some users.
  • Added support for payment methods, reports, and Coinbase user accounts.
  • Other compatibility updates.

0.1.1b2

  • Original PyPI Release.

About

The unofficial Python client for the GDAX API

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

gdax-python

The Python client for the GDAX API (formerly known as the Coinbase Exchange API)

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 OR IMPLIED, 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 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 GDAX to learn what and who is really 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 GDAX, but in order to use it to its full potential, you must familiarize yourself with the official GDAX documentation.

pipinstallgdax

Public Client

Only some endpoints in the API are available to everyone. The public endpoints can be reached using PublicClient

importgdaxpublic_client=gdax.PublicClient()

PublicClient Methods

public_client.get_products()
# Get the order book at the default level.public_client.get_product_order_book('BTC-USD')
# Get the order book at a specific level.public_client.get_product_order_book('BTC-USD', level=1)
# Get the product ticker for a specific product.public_client.get_product_ticker(product_id='ETH-USD')
# Get the product trades for a specific product.public_client.get_product_trades(product_id='ETH-USD')
public_client.get_product_historic_rates('ETH-USD')
# To include other parameters, see function docstring: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.

importgdaxauth_client=gdax.AuthenticatedClient(key, b64secret, passphrase)
# Use the sandbox API (requires a different set of API access credentials)auth_client=gdax.AuthenticatedClient(key, b64secret, passphrase,
api_url="https://api-public.sandbox.gdax.com")

Pagination

Some calls are paginated, meaning multiple calls must be made to receive the full set of data. Each page/request is a list of dict objects that are then appended to a master list, making it easy to navigate pages (e.g. request[0] would return the first page of data in the example below). This feature is under consideration for redesign. Please provide feedback if you have issues or suggestions

request=auth_client.get_fills(limit=100)
request[0] # Page 1 always presentrequest[1] # Page 2+ present only if the data exists

It should be noted that limit does not behave exactly as the official documentation specifies. If you request a limit and that limit is met, additional pages will not be returned. This is to ensure speedy response times when less data is preferred.

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")
# Buy 0.01 BTC @ 100 USDauth_client.buy(price='100.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
# Sell 0.01 BTC @ 200 USDauth_client.sell(price='200.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
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()
# Get fills for a specific orderauth_client.get_fills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")
# Get fills for a specific productauth_client.get_fills(product_id="ETH-BTC")
gdaxdepositParams= {
'amount': '25.00', # Currency determined by account specified'coinbase_account_id': '60680c98bfe96c2601f27e9c'
}
auth_client.deposit(depositParams)
# Withdraw from GDAX into Coinbase WalletwithdrawParams= {
'amount': '1.00', # Currency determined by account specified'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

importgdax# Paramters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com", products="BTC-USD")
# Do other stuff...wsClient.close()

Subscribe to multiple products

importgdax# Paramaters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com",
products=["BTC-USD", "ETH-USD"])
# Do other stuff...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.

# import PyMongo and connect to a local, running Mongo instancefrompymongoimportMongoClientimportgdaxmongo_client=MongoClient('mongodb://localhost:27017/')
# specify the database and collectiondb=mongo_client.cryptocurrency_databaseBTC_collection=db.BTC_collection# instantiate a WebsocketClient instance, with a Mongo collection as a parameterwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.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.
  • onClose - called once after the websocket has been closed.
  • close - call this method to close the websocket connection (do not overwrite).
importgdax, timeclassmyWebsocketClient(gdax.WebsocketClient):
defon_open(self):
self.url="wss://ws-feed.gdax.com/"self.products= ["LTC-USD"]
self.message_count=0print("Lets count the messages!")
defon_message(self, msg):
self.message_count+=1if'price'inmsgand'type'inmsg:
print ("Message type:", msg["type"],
"\t@ {:.3f}".format(float(msg["price"])))
defon_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()

Testing

A test suite is under development. To run the tests, start in the project directory and run

python -m pytest

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.

importgdax, timeorder_book=gdax.OrderBook(product_id='BTC-USD')
order_book.start()
time.sleep(10)
order_book.close()

Change Log

1.0Current PyPI release

  • The first release that is not backwards compatible
  • Refactored to follow PEP 8 Standards
  • Improved Documentation

0.3

  • 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.

0.2.2

  • Added additional API functionality such as cancelAll() and ETH withdrawal.

0.2.1

  • Allowed WebsocketClient to operate intuitively and restructured example workflow.

0.2.0

  • Renamed project to GDAX-Python
  • Merged Websocket updates to handle errors and reconnect.

0.1.2

  • Updated JSON handling for increased compatibility among some users.
  • Added support for payment methods, reports, and Coinbase user accounts.
  • Other compatibility updates.

0.1.1b2

  • Original PyPI Release.

About

The unofficial Python client for the GDAX API

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gdax-python

The Python client for the GDAX API (formerly known as the Coinbase Exchange API)

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 OR IMPLIED, 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 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 GDAX to learn what and who is really 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 GDAX, but in order to use it to its full potential, you must familiarize yourself with the official GDAX documentation.

pipinstallgdax

Public Client

Only some endpoints in the API are available to everyone. The public endpoints can be reached using PublicClient

importgdaxpublic_client=gdax.PublicClient()

PublicClient Methods

public_client.get_products()
# Get the order book at the default level.public_client.get_product_order_book('BTC-USD')
# Get the order book at a specific level.public_client.get_product_order_book('BTC-USD', level=1)
# Get the product ticker for a specific product.public_client.get_product_ticker(product_id='ETH-USD')
# Get the product trades for a specific product.public_client.get_product_trades(product_id='ETH-USD')
public_client.get_product_historic_rates('ETH-USD')
# To include other parameters, see function docstring: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.

importgdaxauth_client=gdax.AuthenticatedClient(key, b64secret, passphrase)
# Use the sandbox API (requires a different set of API access credentials)auth_client=gdax.AuthenticatedClient(key, b64secret, passphrase,
api_url="https://api-public.sandbox.gdax.com")

Pagination

Some calls are paginated, meaning multiple calls must be made to receive the full set of data. Each page/request is a list of dict objects that are then appended to a master list, making it easy to navigate pages (e.g. request[0] would return the first page of data in the example below). This feature is under consideration for redesign. Please provide feedback if you have issues or suggestions

request=auth_client.get_fills(limit=100)
request[0] # Page 1 always presentrequest[1] # Page 2+ present only if the data exists

It should be noted that limit does not behave exactly as the official documentation specifies. If you request a limit and that limit is met, additional pages will not be returned. This is to ensure speedy response times when less data is preferred.

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")
# Buy 0.01 BTC @ 100 USDauth_client.buy(price='100.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
# Sell 0.01 BTC @ 200 USDauth_client.sell(price='200.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
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()
# Get fills for a specific orderauth_client.get_fills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")
# Get fills for a specific productauth_client.get_fills(product_id="ETH-BTC")
gdaxdepositParams= {
'amount': '25.00', # Currency determined by account specified'coinbase_account_id': '60680c98bfe96c2601f27e9c'
}
auth_client.deposit(depositParams)
# Withdraw from GDAX into Coinbase WalletwithdrawParams= {
'amount': '1.00', # Currency determined by account specified'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

importgdax# Paramters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com", products="BTC-USD")
# Do other stuff...wsClient.close()

Subscribe to multiple products

importgdax# Paramaters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com",
products=["BTC-USD", "ETH-USD"])
# Do other stuff...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.

# import PyMongo and connect to a local, running Mongo instancefrompymongoimportMongoClientimportgdaxmongo_client=MongoClient('mongodb://localhost:27017/')
# specify the database and collectiondb=mongo_client.cryptocurrency_databaseBTC_collection=db.BTC_collection# instantiate a WebsocketClient instance, with a Mongo collection as a parameterwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.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.
  • onClose - called once after the websocket has been closed.
  • close - call this method to close the websocket connection (do not overwrite).
importgdax, timeclassmyWebsocketClient(gdax.WebsocketClient):
defon_open(self):
self.url="wss://ws-feed.gdax.com/"self.products= ["LTC-USD"]
self.message_count=0print("Lets count the messages!")
defon_message(self, msg):
self.message_count+=1if'price'inmsgand'type'inmsg:
print ("Message type:", msg["type"],
"\t@ {:.3f}".format(float(msg["price"])))
defon_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()

Testing

A test suite is under development. To run the tests, start in the project directory and run

python -m pytest

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.

importgdax, timeorder_book=gdax.OrderBook(product_id='BTC-USD')
order_book.start()
time.sleep(10)
order_book.close()

Change Log

1.0Current PyPI release

  • The first release that is not backwards compatible
  • Refactored to follow PEP 8 Standards
  • Improved Documentation

0.3

  • 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.

0.2.2

  • Added additional API functionality such as cancelAll() and ETH withdrawal.

0.2.1

  • Allowed WebsocketClient to operate intuitively and restructured example workflow.

0.2.0

  • Renamed project to GDAX-Python
  • Merged Websocket updates to handle errors and reconnect.

0.1.2

  • Updated JSON handling for increased compatibility among some users.
  • Added support for payment methods, reports, and Coinbase user accounts.
  • Other compatibility updates.

0.1.1b2

  • Original PyPI Release.

About

The unofficial Python client for the GDAX API

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

gdax-python

The Python client for the GDAX API (formerly known as the Coinbase Exchange API)

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 OR IMPLIED, 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 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 GDAX to learn what and who is really 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 GDAX, but in order to use it to its full potential, you must familiarize yourself with the official GDAX documentation.

pipinstallgdax

Public Client

Only some endpoints in the API are available to everyone. The public endpoints can be reached using PublicClient

importgdaxpublic_client=gdax.PublicClient()

PublicClient Methods

public_client.get_products()
# Get the order book at the default level.public_client.get_product_order_book('BTC-USD')
# Get the order book at a specific level.public_client.get_product_order_book('BTC-USD', level=1)
# Get the product ticker for a specific product.public_client.get_product_ticker(product_id='ETH-USD')
# Get the product trades for a specific product.public_client.get_product_trades(product_id='ETH-USD')
public_client.get_product_historic_rates('ETH-USD')
# To include other parameters, see function docstring: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.

importgdaxauth_client=gdax.AuthenticatedClient(key, b64secret, passphrase)
# Use the sandbox API (requires a different set of API access credentials)auth_client=gdax.AuthenticatedClient(key, b64secret, passphrase,
api_url="https://api-public.sandbox.gdax.com")

Pagination

Some calls are paginated, meaning multiple calls must be made to receive the full set of data. Each page/request is a list of dict objects that are then appended to a master list, making it easy to navigate pages (e.g. request[0] would return the first page of data in the example below). This feature is under consideration for redesign. Please provide feedback if you have issues or suggestions

request=auth_client.get_fills(limit=100)
request[0] # Page 1 always presentrequest[1] # Page 2+ present only if the data exists

It should be noted that limit does not behave exactly as the official documentation specifies. If you request a limit and that limit is met, additional pages will not be returned. This is to ensure speedy response times when less data is preferred.

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")
# Buy 0.01 BTC @ 100 USDauth_client.buy(price='100.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
# Sell 0.01 BTC @ 200 USDauth_client.sell(price='200.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
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()
# Get fills for a specific orderauth_client.get_fills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")
# Get fills for a specific productauth_client.get_fills(product_id="ETH-BTC")
gdaxdepositParams= {
'amount': '25.00', # Currency determined by account specified'coinbase_account_id': '60680c98bfe96c2601f27e9c'
}
auth_client.deposit(depositParams)
# Withdraw from GDAX into Coinbase WalletwithdrawParams= {
'amount': '1.00', # Currency determined by account specified'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

importgdax# Paramters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com", products="BTC-USD")
# Do other stuff...wsClient.close()

Subscribe to multiple products

importgdax# Paramaters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com",
products=["BTC-USD", "ETH-USD"])
# Do other stuff...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.

# import PyMongo and connect to a local, running Mongo instancefrompymongoimportMongoClientimportgdaxmongo_client=MongoClient('mongodb://localhost:27017/')
# specify the database and collectiondb=mongo_client.cryptocurrency_databaseBTC_collection=db.BTC_collection# instantiate a WebsocketClient instance, with a Mongo collection as a parameterwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.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.
  • onClose - called once after the websocket has been closed.
  • close - call this method to close the websocket connection (do not overwrite).
importgdax, timeclassmyWebsocketClient(gdax.WebsocketClient):
defon_open(self):
self.url="wss://ws-feed.gdax.com/"self.products= ["LTC-USD"]
self.message_count=0print("Lets count the messages!")
defon_message(self, msg):
self.message_count+=1if'price'inmsgand'type'inmsg:
print ("Message type:", msg["type"],
"\t@ {:.3f}".format(float(msg["price"])))
defon_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()

Testing

A test suite is under development. To run the tests, start in the project directory and run

python -m pytest

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.

importgdax, timeorder_book=gdax.OrderBook(product_id='BTC-USD')
order_book.start()
time.sleep(10)
order_book.close()

Change Log

1.0Current PyPI release

  • The first release that is not backwards compatible
  • Refactored to follow PEP 8 Standards
  • Improved Documentation

0.3

  • 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.

0.2.2

  • Added additional API functionality such as cancelAll() and ETH withdrawal.

0.2.1

  • Allowed WebsocketClient to operate intuitively and restructured example workflow.

0.2.0

  • Renamed project to GDAX-Python
  • Merged Websocket updates to handle errors and reconnect.

0.1.2

  • Updated JSON handling for increased compatibility among some users.
  • Added support for payment methods, reports, and Coinbase user accounts.
  • Other compatibility updates.

0.1.1b2

  • Original PyPI Release.

About

The unofficial Python client for the GDAX API

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

gdax-python

The Python client for the GDAX API (formerly known as the Coinbase Exchange API)

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 OR IMPLIED, 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 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 GDAX to learn what and who is really 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 GDAX, but in order to use it to its full potential, you must familiarize yourself with the official GDAX documentation.

pipinstallgdax

Public Client

Only some endpoints in the API are available to everyone. The public endpoints can be reached using PublicClient

importgdaxpublic_client=gdax.PublicClient()

PublicClient Methods

public_client.get_products()
# Get the order book at the default level.public_client.get_product_order_book('BTC-USD')
# Get the order book at a specific level.public_client.get_product_order_book('BTC-USD', level=1)
# Get the product ticker for a specific product.public_client.get_product_ticker(product_id='ETH-USD')
# Get the product trades for a specific product.public_client.get_product_trades(product_id='ETH-USD')
public_client.get_product_historic_rates('ETH-USD')
# To include other parameters, see function docstring: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.

importgdaxauth_client=gdax.AuthenticatedClient(key, b64secret, passphrase)
# Use the sandbox API (requires a different set of API access credentials)auth_client=gdax.AuthenticatedClient(key, b64secret, passphrase,
api_url="https://api-public.sandbox.gdax.com")

Pagination

Some calls are paginated, meaning multiple calls must be made to receive the full set of data. Each page/request is a list of dict objects that are then appended to a master list, making it easy to navigate pages (e.g. request[0] would return the first page of data in the example below). This feature is under consideration for redesign. Please provide feedback if you have issues or suggestions

request=auth_client.get_fills(limit=100)
request[0] # Page 1 always presentrequest[1] # Page 2+ present only if the data exists

It should be noted that limit does not behave exactly as the official documentation specifies. If you request a limit and that limit is met, additional pages will not be returned. This is to ensure speedy response times when less data is preferred.

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")
# Buy 0.01 BTC @ 100 USDauth_client.buy(price='100.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
# Sell 0.01 BTC @ 200 USDauth_client.sell(price='200.00', #USDsize='0.01', #BTCproduct_id='BTC-USD')
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()
# Get fills for a specific orderauth_client.get_fills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")
# Get fills for a specific productauth_client.get_fills(product_id="ETH-BTC")
gdaxdepositParams= {
'amount': '25.00', # Currency determined by account specified'coinbase_account_id': '60680c98bfe96c2601f27e9c'
}
auth_client.deposit(depositParams)
# Withdraw from GDAX into Coinbase WalletwithdrawParams= {
'amount': '1.00', # Currency determined by account specified'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

importgdax# Paramters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com", products="BTC-USD")
# Do other stuff...wsClient.close()

Subscribe to multiple products

importgdax# Paramaters are optionalwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.com",
products=["BTC-USD", "ETH-USD"])
# Do other stuff...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.

# import PyMongo and connect to a local, running Mongo instancefrompymongoimportMongoClientimportgdaxmongo_client=MongoClient('mongodb://localhost:27017/')
# specify the database and collectiondb=mongo_client.cryptocurrency_databaseBTC_collection=db.BTC_collection# instantiate a WebsocketClient instance, with a Mongo collection as a parameterwsClient=gdax.WebsocketClient(url="wss://ws-feed.gdax.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.
  • onClose - called once after the websocket has been closed.
  • close - call this method to close the websocket connection (do not overwrite).
importgdax, timeclassmyWebsocketClient(gdax.WebsocketClient):
defon_open(self):
self.url="wss://ws-feed.gdax.com/"self.products= ["LTC-USD"]
self.message_count=0print("Lets count the messages!")
defon_message(self, msg):
self.message_count+=1if'price'inmsgand'type'inmsg:
print ("Message type:", msg["type"],
"\t@ {:.3f}".format(float(msg["price"])))
defon_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()

Testing

A test suite is under development. To run the tests, start in the project directory and run

python -m pytest

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.

importgdax, timeorder_book=gdax.OrderBook(product_id='BTC-USD')
order_book.start()
time.sleep(10)
order_book.close()

Change Log

1.0Current PyPI release

  • The first release that is not backwards compatible
  • Refactored to follow PEP 8 Standards
  • Improved Documentation

0.3

  • 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.

0.2.2

  • Added additional API functionality such as cancelAll() and ETH withdrawal.

0.2.1

  • Allowed WebsocketClient to operate intuitively and restructured example workflow.

0.2.0

  • Renamed project to GDAX-Python
  • Merged Websocket updates to handle errors and reconnect.

0.1.2

  • Updated JSON handling for increased compatibility among some users.
  • Added support for payment methods, reports, and Coinbase user accounts.
  • Other compatibility updates.

0.1.1b2

  • Original PyPI Release.

About

The unofficial Python client for the GDAX API

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages