ZetCode

Python Binance

最后修改于 2024 年 1 月 29 日

在本文中,我们将展示如何使用 python-binance 库在 Python 中操作 Binance 交易所。

python-binance 是 Binance 交易所 REST API v3 的非官方 Python 包装器。Binance 是一个流行的加密货币交易所。

Binance 提供公共 API 和私有 API。对于私有 API,我们需要提供 API 密钥。API 是异步的。

$ pip install python-binance

我们使用 pip 安装该库。

Python Binance 交易对列表

get_exchange_info 函数提供有关交易所的一些基本信息,包括费率限制和交易对列表。

交易对是交易品种。它由基础资产和计价资产组成。给定交易对 BTCBUSD,BTC 代表基础资产,BUSD 代表计价资产。

symbols.py
#!/usr/bin/python

import asyncio
from binance import AsyncClient

async def main():

    client = await AsyncClient.create()
    res = await client.get_exchange_info()

    print(f'# of symbols: {len(res["symbols"])}')

    for sym in res['symbols']:
       print(f"{sym['symbol']}: base {sym['baseAsset']}, quote {sym['quoteAsset']}")

    await client.close_connection()

asyncio.run(main())

该示例打印交易对的数量并列出所有可用的交易对。

from binance import AsyncClient

从模块中,我们导入 AsyncClient

res = await client.get_exchange_info()

我们调用 get_exchange_info 函数。响应被翻译成 Python 字典。

print(f'# of symbols: {len(res["symbols"])}')

symbols 键包含 Binance 上可用交易对的列表。

for sym in res['symbols']:
    print(f"{sym['symbol']}: base {sym['baseAsset']}, quote {sym['quoteAsset']}")

我们遍历列表并将它们打印到控制台。

$ ./symbols.py
# of symbols: 2183
ETHBTC: base ETH, quote BTC
LTCBTC: base LTC, quote BTC
BNBBTC: base BNB, quote BTC
NEOBTC: base NEO, quote BTC
QTUMETH: base QTUM, quote ETH
EOSETH: base EOS, quote ETH
SNTETH: base SNT, quote ETH
BNTETH: base BNT, quote ETH
BCCBTC: base BCC, quote BTC
GASBTC: base GAS, quote BTC
BNBETH: base BNB, quote ETH
BTCUSDT: base BTC, quote USDT
ETHUSDT: base ETH, quote USDT
...

Python Binance 交易行情

交易行情是特定加密货币价格的报告,在整个交易时段内持续更新。要获取交易行情,我们使用 get_ticker 函数。

get_ticker.py
#!/usr/bin/python

import asyncio
import json
from binance import AsyncClient

async def main():

    client = await AsyncClient.create()

    res = await client.get_ticker(symbol='LTCBUSD')
    print(json.dumps(res, indent=2))

    print('--------------------')

    res = await client.get_symbol_ticker(symbol='LTCBUSD')
    print(json.dumps(res, indent=2))

    await client.close_connection()

asyncio.run(main())

该示例检索 LTCBUSD 交易对的交易行情。

res = await client.get_ticker(symbol='LTCBUSD')

我们获取 LTCBUSD 的交易行情。

print(json.dumps(res, indent=2))

我们使用 json.dumps 美化打印输出。

$ ./get_ticker.py
{
  "symbol": "LTCBUSD",
  "priceChange": "-1.06000000",
  "priceChangePercent": "-1.146",
  "weightedAvgPrice": "92.12663737",
  "prevClosePrice": "92.47000000",
  "lastPrice": "91.45000000",
  "lastQty": "0.05500000",
  "bidPrice": "91.45000000",
  "bidQty": "0.27400000",
  "askPrice": "91.47000000",
  "askQty": "4.38700000",
  "openPrice": "92.51000000",
  "highPrice": "93.58000000",
  "lowPrice": "90.46000000",
  "volume": "153099.54200000",
  "quoteVolume": "14104545.98719000",
  "openTime": 1680448413900,
  "closeTime": 1680534813900,
  "firstId": 38620441,
  "lastId": 38681137,
  "count": 60697
}
--------------------
{
  "symbol": "LTCBUSD",
  "price": "91.47000000"
}

Python Binance 充值地址

充值地址是在 Binance 上发送和接收加密货币的唯一地址。该地址不属于用户。

deposit_address.py
#!/usr/bin/python

import asyncio
import os
from binance import AsyncClient

async def main():

    api_key = os.getenv('BINANCE_API_KEY')
    api_secret = os.getenv('BINANCE_SECRET_KEY')

    client = await AsyncClient.create(api_key, api_secret)

    btc_address = await client.get_deposit_address(coin='BTC')
    print(btc_address)

    ltc_address = await client.get_deposit_address(coin='LTC')
    print(ltc_address)

    doge_address = await client.get_deposit_address(coin='DOGE')
    print(doge_address)

    await client.close_connection()

asyncio.run(main())

在示例中,我们打印 BTC、LTC 和 DOGE 币的三个充值地址。

api_key = os.getenv('BINANCE_API_KEY')
api_secret = os.getenv('BINANCE_SECRET_KEY')

要获取充值地址,我们需要使用 API 密钥。我们从环境变量中加载密钥。

btc_address = await client.get_deposit_address(coin='BTC')
print(btc_address)

我们使用 get_deposit_address 获取 BTC 的地址并打印它。

Python Binance 资产余额

get_asset_balance 函数检索给定资产的余额。

asset_balance.py
#!/usr/bin/python

import asyncio
import os
from binance import AsyncClient

async def main():

    api_key = os.getenv('BINANCE_API_KEY')
    api_secret = os.getenv('BINANCE_SECRET_KEY')

    client = await AsyncClient.create(api_key, api_secret)

    ltc_balance = await client.get_asset_balance(asset='LTC')
    print(f"Asset: {ltc_balance['asset']}")
    print(f"Free: {ltc_balance['free']}")
    print(f"Locked: {ltc_balance['locked']}")

    await client.close_connection()

asyncio.run(main())

该示例检索 LTC 币的余额。

Python Binance 提现

使用 get_withdraw_history 函数,我们可以获取从 Binance 交易所提现的加密货币。

withdrawals.py
#!/usr/bin/python

import asyncio
import os
from binance import AsyncClient

async def main():

    api_key = os.getenv('BINANCE_API_KEY')
    api_secret = os.getenv('BINANCE_SECRET_KEY')

    client = await AsyncClient.create(api_key, api_secret)
    withdraws = await client.get_withdraw_history()

    for e in withdraws:
        print(f"{e['amount']} {e['transactionFee']} {e['coin']} {e['completeTime']}")

    await client.close_connection()

asyncio.run(main())

在示例中,我们提取了过去九十天的所有提现记录。

withdraws = await client.get_withdraw_history()

我们提取提现记录。如果不指定开始时间,则默认应用最近 90 天。

for e in withdraws:
    print(f"{e['amount']} {e['transactionFee']} {e['coin']} {e['completeTime']}")

从提现数据中,我们获取金额、交易费、币种名称和完成时间。

Python Binance 我的交易

get_my_trades 函数检索特定交易品种的交易记录。

$ pip install rich

为了将数据组织成一个漂亮的表格,我们使用了 rich 库。

mytrades.py
#!/usr/bin/python

import asyncio
import os
from datetime import datetime
from binance import AsyncClient
from rich import box
from rich.console import Console
from rich.table import Table


async def main():

    api_key = os.getenv('BINANCE_API_KEY')
    api_secret = os.getenv('BINANCE_SECRET_KEY')

    client = await AsyncClient.create(api_key, api_secret)
    trades = await client.get_my_trades(symbol='SHIBBUSD')

    now = f'{datetime.today()}'
    table = Table(title='My SHIBA trades', box=box.ASCII,
                  caption=now, caption_justify='left')

    table.add_column('Complete time', justify='center', style='steel_blue')
    table.add_column('Price', justify='right', style='cadet_blue')
    table.add_column('Quantity', justify='right')
    table.add_column('Quote quantity', justify='right')
    table.add_column('Commision fee', justify='right', style='indian_red')
    table.add_column('Commision asset', justify='center')

    for e in trades:

        trade_time = datetime.utcfromtimestamp(e['time']/1000.0)
        price = float(e["price"])
        quantity = float(e["qty"])
        quote_quantity = float(e["quoteQty"])
        commision = float(e["commission"])
        commission_asset = e["commissionAsset"]

        table.add_row(f'{trade_time:%m/%d/%Y}', f'{price:.8f}', f'{quantity}',
                      f'{quote_quantity:.8f}', f'{commision:.2f}', f'{commission_asset}')

    console = Console()
    console.print(table)

    await client.close_connection()

asyncio.run(main())

该示例检索 SHIBBUSD 交易品种的交易记录。数量是我们购买的基础资产数量;在我们的例子中,它是 SHIBA 代币的数量。计价数量是用以购买给定数量 SHIBA 代币所需的计价资产(BUSD)的数量。

trades = await client.get_my_trades(symbol='SHIBBUSD')

我们使用 get_my_trades 检索 SHIBBUSD 交易品种的交易记录。

table = Table(title='My SHIBA trades', box=box.ASCII,
                caption=now, caption_justify='left')

table.add_column('Complete time', justify='center', style='steel_blue')
table.add_column('Price', justify='right', style='cadet_blue')
table.add_column('Quantity', justify='right')
table.add_column('Quote quantity', justify='right')
table.add_column('Commision fee', justify='right', style='indian_red')
table.add_column('Commision asset', justify='center')

我们创建了一个包含六列的表格。

for e in trades:

    trade_time = datetime.utcfromtimestamp(e['time']/1000.0)
    price = float(e["price"])
    quantity = float(e["qty"])
    quote_quantity = float(e["quoteQty"])
    commision = float(e["commission"])
    commission_asset = e["commissionAsset"]

    table.add_row(f'{trade_time:%m/%d/%Y}', f'{price:.8f}', f'{quantity}',
                  f'{quote_quantity:.8f}', f'{commision:.2f}', f'{commission_asset}')

我们向表格添加行。

console = Console()
console.print(table)

最后,我们将表格打印到控制台。

Python Binance 法币支付

要获取法币支付记录,我们使用 get_fiat_payments_history 函数。

fiat_payments.py
#!/usr/bin/python

import asyncio
import os
from binance import AsyncClient
from binance.helpers import date_to_milliseconds
from datetime import datetime

from rich import box
from rich.console import Console
from rich.table import Table

async def main():

    api_key = os.getenv('BINANCE_API_KEY')
    api_secret = os.getenv('BINANCE_SECRET_KEY')

    begin = '2023/01/01'
    begin_ts = date_to_milliseconds(begin)

    end = 'March 31, 2023'
    end_ts = date_to_milliseconds(end)

    client = await AsyncClient.create(api_key, api_secret)

    fiat_history = await client.get_fiat_payments_history(transactionType=0,
                                                          beginTime=begin_ts, endTime=end_ts)
    now = f'{datetime.today()}'
    table = Table(title='Fiat payments', box=box.ASCII,
                  caption=now, caption_justify='left')

    table.add_column('Create time', justify='right', style='cadet_blue')
    table.add_column('Fiat amount', justify='center', style='steel_blue')
    table.add_column('Fiat')
    table.add_column('Crypto amount', justify='right', style='dark_slate_gray2')
    table.add_column('Crypto')
    table.add_column('Price', style='dark_sea_green4')
    table.add_column('Fee', style='indian_red')

    for e in fiat_history['data']:
        d = datetime.utcfromtimestamp(e['createTime']/1000.0)

        source_amount = float(e["sourceAmount"])
        fiat_currency = e["fiatCurrency"]
        obtain_amount = float(e["obtainAmount"])
        crypto_currency = e["cryptoCurrency"]
        price = float(e["price"])
        total_fee = float(e["totalFee"])

        table.add_row(f'{d:%m/%d/%Y}', f'{source_amount:.8f}', f'{fiat_currency}',
                      f'{obtain_amount:.8f}', f'{crypto_currency}', 
                      f'{price:.8f}', f'{total_fee:.8f}')

    console = Console()
    console.print(table)

    await client.close_connection()

asyncio.run(main())

在该程序中,我们列出了所有使用法币购买加密货币的交易。

begin = '2023/01/01'
begin_ts = date_to_milliseconds(begin)

end = 'March 31, 2023'
end_ts = date_to_milliseconds(end)

我们指定了开始和结束日期。我们使用 date_to_milliseconds 辅助函数将日期字符串转换为毫秒。

fiat_history = await client.get_fiat_payments_history(transactionType=0,
                                                      beginTime=begin_ts, endTime=end_ts)

transactionType 0 表示买入,1 表示卖出。

source_amount = float(e["sourceAmount"])
fiat_currency = e["fiatCurrency"]
obtain_amount = float(e["obtainAmount"])
crypto_currency = e["cryptoCurrency"]
price = float(e["price"])
total_fee = float(e["totalFee"])

我们有六列。源金额是我们用于购买加密货币的法币金额。法币是法币的类型,例如 USD 或 EUR。获得金额是我们购买的加密货币数量。加密货币是我们收到的加密货币。价格是用法币表示的加密货币价格。最后,总费用是我们为交易支付的费用。

来源

Python Binance 文档

在本文中,我们使用 python-binance 模块在 Python 中操作了 Binance 交易所。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Python 教程