創建幣安API KEY可以參考官方教學文件如何在幣安創建 API 金鑰?
今天high_level
的訓練結果還是沒有出來,為了避免浪費時間,今天花了一些時間,創建了Binance
的API_KEY
與API_SECRET
,並寫了一個簡單的python腳本,在Binance
上確認特定幣種的餘額,並且自動買賣的程式。
這邊拿BNBUSDT
的現貨交易來做測試,因為可以把一堆雜幣的小數點餘額全部換成BNB
方便我做測試;測試前我還是把大部分的幣轉到冷錢包,以免我寫程式的時候亂搞,所謂一失足成千古恨,加密貨幣不見了就是不見了,還是小心一點的好。
from binance.client import Client
from binance.enums import *
from config import API_KEY, API_SECRET
# 創建 Binance 客戶端
client = Client(API_KEY, API_SECRET)
def print_balances():
# 取得 BNB 和 USDT 的餘額
bnb_balance = client.get_asset_balance(asset='BNB')
usdt_balance = client.get_asset_balance(asset='USDT')
print(f"BNB Balance: {bnb_balance['free']}")
print(f"USDT Balance: {usdt_balance['free']}")
def get_lot_size_and_step_size(symbol):
# 查詢交易對的最小訂單數量和步進大小
info = client.get_symbol_info(symbol)
lot_size = None
step_size = None
for f in info['filters']:
if f['filterType'] == 'LOT_SIZE':
lot_size = float(f['minQty'])
step_size = float(f['stepSize'])
print(f"Min LOT Size: {lot_size}, Step Size: {step_size}")
return lot_size, step_size
def round_down(value, step):
# 根據 step_size 進行下捨,並將精度限制為小數點位數
precision = len(str(step).split('.')[1]) # 計算 step_size 的小數位數
return round((value // step) * step, precision)
def sell_all_bnb():
# 取得 BNB 的餘額
bnb_balance = client.get_asset_balance(asset='BNB')
bnb_quantity = float(bnb_balance['free'])
# 查詢最小訂單數量和步進大小
min_lot_size, step_size = get_lot_size_and_step_size('BNBUSDT')
print(f"Initial BNB Quantity: {bnb_quantity}, Min Lot Size: {min_lot_size}, Step Size: {step_size}")
if bnb_quantity >= min_lot_size:
# 將 BNB 數量下捨到允許的步進大小,並控制精度
bnb_quantity_rounded = round_down(bnb_quantity, step_size)
print(f"Rounded BNB Quantity: {bnb_quantity_rounded}")
if bnb_quantity_rounded > 0:
try:
# 賣出所有 BNB 換成 USDT
order = client.order_market_sell(
symbol='BNBUSDT',
quantity=bnb_quantity_rounded
)
print("Sell Order Executed:", order)
except Exception as e:
print(f"Error executing sell order: {e}")
else:
print("Rounded BNB quantity is too small to execute an order.")
else:
print(f"BNB balance ({bnb_quantity}) is less than the minimum lot size ({min_lot_size}). Unable to sell.")
if __name__ == "__main__":
# 第一次印出餘額
print("Balances before selling BNB:")
print_balances()
# 賣出所有 BNB
sell_all_bnb()
# 賣出後再次印出餘額
print("\nBalances after selling BNB:")
print_balances()
在自動化加密貨幣交易的過程中,我遇到了一些與小數點精度相關的問題。由於加密貨幣交易的數量通常是非常小的數值,交易所對於數量的最小限制以及允許的精度(小數位數)有特定的要求。
例如,當我們使用 Binance API 自動執行 BNB/USDT 的交易時,必須遵循 Binance 對每個交易對設置的 LOT_SIZE
和 stepSize
限制。LOT_SIZE
定義了每次交易的最小訂單數量,而 stepSize
則確保訂單數量是特定步進大小的倍數。這意味著我們無法任意提交包含過多小數位數的訂單,否則會收到 "Invalid quantity" 或 "Too much precision" 的 API 錯誤。
在測試過程中,遇到了 APIError(code=-1111): Parameter 'quantity' has too much precision
這樣的錯誤。這是因為提交的訂單數量精度超過了 Binance 接受的精度上限。為了解決這個問題,需要根據 Binance 提供的 stepSize
信息來適當地調整交易數量,確保數量的精度符合交易所的要求。
在解決這個問題後,成功執行了自動賣出 BNB 的操作,並將剩餘的 BNB 餘額換成了 USDT。
程式的執行結果如下
Balances before selling BNB:
BNB Balance: 0.02638924
USDT Balance: 0.00000000
Min LOT Size: 0.001, Step Size: 0.001
Initial BNB Quantity: 0.02638924, Min Lot Size: 0.001, Step Size: 0.001
Rounded BNB Quantity: 0.026
Sell Order Executed: {'symbol': 'BNBUSDT', 'orderId': '...',, 'orderListId': -1, 'clientOrderId': '...', 'transactTime': '...',, 'price': '0.00000000', 'origQty': '0.02600000', 'executedQty': '0.02600000', 'cummulativeQuoteQty': '15.00200000', 'status': 'FILLED', 'timeInForce': 'GTC', 'type': 'MARKET', 'side': 'SELL', 'workingTime': '...',, 'fills': [{'price': '577.00000000', 'qty': '0.02600000', 'commission': '0.00001947', 'commissionAsset': 'BNB', 'tradeId': '...',}], 'selfTradePreventionMode': 'EXPIRE_MAKER'}
Balances after selling BNB:
BNB Balance: 0.00036977
USDT Balance: 15.00200000
這個程式目前只是在做功能測試,所以做的很簡單直接掛市價單;然而真正在做自動交易時,可能會需要掛限價單、止損單,並且還需要針對特定未完成的訂單做取消的動作,會相當的複雜;所以之後有時間會開始擴充我的自動交易程式支持的功能。