iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
AI/ ML & Data

自動交易程式探索系列 第 23

Day 23 - 幣安自動化程式:確認餘額、現貨掛賣

  • 分享至 

  • xImage
  •  

創建幣安API KEY可以參考官方教學文件如何在幣安創建 API 金鑰?

今天high_level的訓練結果還是沒有出來,為了避免浪費時間,今天花了一些時間,創建了BinanceAPI_KEYAPI_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_SIZEstepSize 限制。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

這個程式目前只是在做功能測試,所以做的很簡單直接掛市價單;然而真正在做自動交易時,可能會需要掛限價單、止損單,並且還需要針對特定未完成的訂單做取消的動作,會相當的複雜;所以之後有時間會開始擴充我的自動交易程式支持的功能。


上一篇
Day 22 - MacroHFT & EarnHFT
下一篇
Day 24 - 完整的幣安現貨買賣下單程式
系列文
自動交易程式探索30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言