使用Bybit API进行BTC/USDT衍生品交易

问题描述 投票:0回答:1

在运行我的代码时,我不断收到相同的错误,数量无效,但我给了它最低要求的值,并且账户上有足够的余额,如您所见。

已经在谷歌上查了很多问题,但找不到这个具体的错误。

Starting USDT balance: 99.97 No BTC in the account. Buying 0.001 BTC... Placing market buy order for 0.00100000 BTC at 28254.80 USDT/BTC Order response: {'ret_code': 10001, 'ret_msg': 'params error: qty invalid', 'result': {}, 'ext_code': '', 'ext_info': '', 'time_now': '1680641484.301085', 'rate_limit_status': 99, 'rate_limit': 100, 'rate_limit_reset_ms': 1680641484300}

Python代码:

import requests
import time
import hmac
import hashlib
from urllib.parse import urlencode

# API keys
API_KEY = 'API KEY'
API_SECRET = 'API SECRET'

# Base URLs
BYBIT_BASE_URL = 'https://api.bybit.com'

# Constants
SYMBOL = 'BTCUSDT'
ORDER_TYPE = 'Market'
FIXED_ORDER_QTY_BTC = 0.001
QUANTITY_STEP_SIZE = 0.001

def generate_signature(secret, params):
    query_string = urlencode(sorted(params.items()))
    hmac_sha256 = hmac.new(secret.encode('utf-8'), query_string.encode('utf-8'), hashlib.sha256)
    return hmac_sha256.hexdigest()

def get_balance(coin):
    timestamp = int(time.time() * 1000)
    params = {
        'api_key': API_KEY,
        'timestamp': timestamp,
        'coin': coin
    }
    params['sign'] = generate_signature(API_SECRET, params)
    url = f"{BYBIT_BASE_URL}/v2/private/wallet/balance"
    response = requests.get(url, params=params)
    return response.json()

def place_order(side, qty, order_type):
    timestamp = int(time.time() * 1000)
    params = {
        'api_key': API_KEY,
        'timestamp': timestamp,
        'symbol': SYMBOL,
        'side': side,
        'order_type': order_type,
        'qty': qty,
        'time_in_force': 'GoodTillCancel',
        'reduce_only': False
    }
    params['sign'] = generate_signature(API_SECRET, params)
    url = f"{BYBIT_BASE_URL}/v2/private/order/create"
    response = requests.post(url, data=params)
    return response.json()

def get_ticker_price(symbol):
    url = f"{BYBIT_BASE_URL}/v2/public/tickers?symbol={symbol}"
    response = requests.get(url)
    return response.json()

def main():
    # Get current USDT balance
    usdt_balance = float(get_balance('USDT')['result']['USDT']['available_balance'])
    print(f"Starting USDT balance: {usdt_balance:.2f}")

    # Check if BTC balance is zero
    btc_balance = float(get_balance('BTC')['result']['BTC']['available_balance'])
    if btc_balance == 0:
        print(f"No BTC in the account. Buying {FIXED_ORDER_QTY_BTC} BTC...")
        ticker_price = float(get_ticker_price(SYMBOL)['result'][0]['last_price'])
        order_qty = round(FIXED_ORDER_QTY_BTC / QUANTITY_STEP_SIZE) * QUANTITY_STEP_SIZE
        print(f"Placing market buy order for {order_qty:.8f} BTC at {ticker_price:.2f} USDT/BTC")
        response = place_order('Buy', order_qty, ORDER_TYPE)
        print(f"Order response: {response}")

    while True:
        # Get current BTC balance
        btc_balance = float(get_balance('BTC')['result']['BTC']['available_balance'])
        if btc_balance >= order_qty:
            print(f"Bought {order_qty:.8f} BTC")
            break
        else:
            print("Waiting for BTC to be bought...")
            time.sleep(10)

        # Get updated USDT balance
    usdt_balance = float(get_balance('USDT')['result']['USDT']['available_balance'])
    print(f"Updated USDT balance: {usdt_balance:.2f}")


if __name__ == '__main__':
    main()

尝试通过API购买最低数量的BTC。

python json api trading bybit
1个回答
0
投票

在这里你可以只使用官方bybit api测试的代码,只需从端点删除测试并输入你的api信息

import requests
import time
import hashlib
import hmac
import uuid

api_key='XXXXXXXXX'
secret_key='XXXXXXXXX'
httpClient=requests.Session()
recv_window=str(5000)
url="https://api-testnet.bybit.com" # Testnet endpoint

def HTTP_Request(endPoint,method,payload,Info):
    global time_stamp
    time_stamp=str(int(time.time() * 10 ** 3))
    signature=genSignature(payload)
    headers = {
        'X-BAPI-API-KEY': api_key,
        'X-BAPI-SIGN': signature,
        'X-BAPI-SIGN-TYPE': '2',
        'X-BAPI-TIMESTAMP': time_stamp,
        'X-BAPI-RECV-WINDOW': recv_window,
        'Content-Type': 'application/json'
    }
    if(method=="POST"):
        response = httpClient.request(method, url+endPoint, headers=headers, data=payload)
    else:
        response = httpClient.request(method, url+endPoint+"?"+payload, headers=headers)
    print(response.text)
    print(Info + " Elapsed Time : " + str(response.elapsed))

def genSignature(payload):
    param_str= str(time_stamp) + api_key + recv_window + payload
    hash = hmac.new(bytes(secret_key, "utf-8"), param_str.encode("utf-8"),hashlib.sha256)
    signature = hash.hexdigest()
    return signature

#Create Order
endpoint="/contract/v3/private/order/create"
method="POST"
orderLinkId=uuid.uuid4().hex
params='{"symbol": "BTCUSDT","side": "Buy","positionIdx": 1,"orderType": "Limit","qty": "0.001","price": "10000","timeInForce": "GoodTillCancel","orderLinkId": "' + orderLinkId + '"}'
HTTP_Request(endpoint,method,params,"Create")

#Get unfilled Orders
endpoint="/contract/v3/private/order/unfilled-orders"
method="GET"
params='settleCoin=USDT'
HTTP_Request(endpoint,method,params,"UnFilled")

#Get Order List
endpoint="/contract/v3/private/order/list"
method="GET"
params="symbol=BTCUSDT&orderStatus=New&orderLinkId="+orderLinkId
HTTP_Request(endpoint,method,params,"List")

#Cancel Order
endpoint="/contract/v3/private/order/cancel"
method="POST"
params='{"symbol": "BTCUSDT","orderLinkId": "'+orderLinkId+'"}'
HTTP_Request(endpoint,method,params,"Cancel")
© www.soinside.com 2019 - 2024. All rights reserved.