The Python client for the Coinbase Pro API (formerly known asthe GDAX)
Note: this library may be subtly broken or buggy. The code is released underthe 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, FITNESSFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS ORCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHERIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR INCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
This README is documentation on the syntax of the python client presented inthis repository. See function docstrings for full syntax details.
This API attempts to present a clean interface to CB Pro, but in order to use itto its full potential, you must familiarize yourself with the official CB Prodocumentation.
You may manually install the project or use pip
:
pip install cbpro
#or
pip install git+git://github.com/danpaquin/coinbasepro-python.git
Only some endpoints in the API are available to everyone. The public endpointscan be reached using PublicClient
import cbpro
public_client = cbpro.PublicClient()
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.
# Returns a generator
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()
Not all API endpoints are available to everyone.Those requiring user authentication can be reached using AuthenticatedClient
.You must setup API access within youraccount settings.The AuthenticatedClient
inherits all methods from the PublicClient
class, so you will only need to initialize one if you are planning tointegrate 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")
Some calls are paginated, meaning multiplecalls must be made to receive the full set of data. The CB Pro Python API providesan abstraction for paginated endpoints in the form of generators which provide aclean interface for iteration but may make multiple HTTP requests behind thescenes. The pagination options before
, after
, and limit
may be supplied askeyword arguments if desired, but aren't necessary for typical use cases.
fills_gen = auth_client.get_fills()
# Get all fills (will possibly make multiple HTTP requests)
all_fills = list(fills_gen)
One use case for pagination parameters worth pointing out is retrieving onlynew data since the previous request. For the case of get_fills()
, thetrade_id
is the parameter used for indexing. By passingbefore=some_trade_id
, only fills more recent than that trade_id
will bereturned. Note that when using before
, a maximum of 100 entries will bereturned - this is a limitation of CB Pro.
from itertools import islice
# Get 5 most recent fills
recent_fills = islice(auth_client.get_fills(), 5)
# Only fetch new fills since last call by utilizing `before` parameter.
new_fills = auth_client.get_fills(before=recent_fills[0]['trade_id'])
auth_client.get_accounts()
auth_client.get_account("7d0f7d8e-dd34-4d9c-a846-06f431c381ba")
# Returns generator:
auth_client.get_account_history("7d0f7d8e-dd34-4d9c-a846-06f431c381ba")
# Returns generator:
auth_client.get_account_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
auth_client.place_limit_order(product_id='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.
auth_client.place_market_order(product_id='BTC-USD',
side='buy',
funds='100.00')
# Stop order. `funds` can be used instead of `size` here.
auth_client.place_stop_order(product_id='BTC-USD',
stop_type='loss',
price='200.00',
size='0.01')
auth_client.cancel_order("d50ec984-77a8-460a-b958-66f114b0de9b")
auth_client.cancel_all(product_id='BTC-USD')
# Returns generator:
auth_client.get_orders()
auth_client.get_order("d50ec984-77a8-460a-b958-66f114b0de9b")
# All return generators
auth_client.get_fills()
# Get fills for a specific order
auth_client.get_fills(order_id="d50ec984-77a8-460a-b958-66f114b0de9b")
# Get fills for a specific product
auth_client.get_fills(product_id="ETH-BTC")
depositParams = {
'amount': '25.00', # Currency determined by account specified
'coinbase_account_id': '60680c98bfe96c2601f27e9c'
}
auth_client.deposit(depositParams)
# Withdraw from CB Pro into Coinbase Wallet
withdrawParams = {
'amount': '1.00', # Currency determined by account specified
'coinbase_account_id': '536a541fa9393bb3c7000023'
}
auth_client.withdraw(withdrawParams)
If you would like to receive real-time market updates, you must subscribe to thewebsocket feed.
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()
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()
The WebsocketClient
now supports data gathering via MongoDB. Given aMongoDB collection, the WebsocketClient
will stream results directly intothe 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 = mongo_client.cryptocurrency_database
BTC_collection = db.BTC_collection
# instantiate a WebsocketClient instance, with a Mongo collection as a parameter
wsClient = cbpro.WebsocketClient(url="wss://ws-feed.pro.coinbase.com", products="BTC-USD",
mongo_collection=BTC_collection, should_print=False)
wsClient.start()
The WebsocketClient
subscribes in a separate thread upon initialization.There are three methods which you could overwrite (before initialization) so itcan react to the data streaming in. The current client is a template used forillustration purposes only.
import cbpro, time
class myWebsocketClient(cbpro.WebsocketClient):
def on_open(self):
self.url = "wss://ws-feed.pro.coinbase.com/"
self.products = ["LTC-USD"]
self.message_count = 0
print("Lets count the messages!")
def on_message(self, msg):
self.message_count += 1
if 'price' in msg and 'type' in msg:
print ("Message type:", msg["type"],
"\t@ {:.3f}".format(float(msg["price"])))
def on_close(self):
print("-- Goodbye! --")
wsClient = myWebsocketClient()
wsClient.start()
print(wsClient.url, wsClient.products)
while (wsClient.message_count < 500):
print ("\nmessage_count =", "{} \n".format(wsClient.message_count))
time.sleep(1)
wsClient.close()
A test suite is under development. Tests for the authenticated client require aset of sandbox API credentials. To provide them, renameapi_config.json.example
in the tests folder to api_config.json
and edit thefile accordingly. To run the tests, start in the project directory and run
python -m pytest
The OrderBook
subscribes to a websocket and keeps a real-time record ofthe orderbook for the product_id input. Please provide your feedback for futureimprovements.
import cbpro, time
order_book = cbpro.OrderBook(product_id='BTC-USD')
order_book.start()
time.sleep(10)
order_book.close()
Unit tests are under development using the pytest framework. Contributions arewelcome!
To run the full test suite, in the projectdirectory run:
python -m pytest
1.1.2 Current PyPI release
1.0
0.3
0.2.2
0.2.1
WebsocketClient
to operate intuitively and restructured exampleworkflow.0.2.0
0.1.2
0.1.1b2
Go Coinbase Pro Summary Go client for CoinBase Pro formerly known as gdax Installation If using Go modules (Go version >= 11.1) simply import as needed. go mod init github.com/yourusername/yourproject
问题内容: 为什么以下代码在Python中表现异常? 我正在使用Python 2.5.2。尝试使用某些不同版本的Python,Python 2.3.3似乎在99到100之间显示了上述行为。 基于以上所述,我可以假设Python是内部实现的,因此“小”整数的存储方式与大整数的存储方式不同,并且is运算符可以分辨出这种差异。为什么要泄漏抽象?当我事先不知道它们是否为数字时,比较两个任意对象以查看它们是
问题内容: 我在文件中有此: 我编写了以下脚本来打印所有数据: 但是,该程序会引发异常: 如何解析并提取其值? 问题答案: 你的数据不是有效的格式。你有什么时候应该拥有: 用于JSON数组,在Python中称为 用于JSON对象,在Python中称为 JSON文件的外观如下: 然后,你可以使用你的代码: 有了数据,你现在还可以找到类似的值: 试试看,看看是否有意义。
问题内容: 如何在Python3中将输入转义到MySQL数据库?我正在使用PyMySQL,并且工作正常,但是当我尝试执行以下操作时: 如果字符串具有或,则它将不起作用。我也尝试过: 问题在于该库(PyMySQL)使用了Python2.x的格式语法,该语法不再起作用。我也发现了这个可能的解决方案 在这里,但我不知道在何处添加此代码。这就是我得到的一切: 编辑:我解决了!在PyMySQL中,正确的方法
问题内容: 我想知道在Python应用程序中导入包的首选方法。我有一个这样的包结构: project.app1.views进口project.app1.models和project.app2.models。我想到有两种方法可以做到这一点。 绝对进口: 或具有明确的相对导入,如在Python 2.5中使用PEP 328引入的那样: 什么是最pythonic的方式做到这一点? 问题答案: 绝对进口。从
问题内容: 在Python中,该函数允许您迭代一系列(索引,值)对。例如: 用Java有什么办法吗? 问题答案: 对于实现接口的集合,您可以调用方法以获取。迭代器(还有其他方法)有两种方法- ,以获得索引;和,以获取值(与其他迭代器一样)。 因此,上述Python的Java等效项可能是: 与Python一样,它输出: