错误 API Binance 转换限制地点订单

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

我正在尝试使用 binance api 进行转换的限价订单。 Postman 文档告诉我们应该在 POST 中作为参数传递,就像我们使用

user_saldo
那样,效果很好。

返回错误

content: b'{"code":345214,"msg":"Placing a limit order has failed. Please try again later. Error code: 345124"}'

所以方法

conversao2
conversao
不起作用。

另一个产生不同错误的问题是,当我尝试传递

quant_de_cpt
时,它表示该值格式错误。

我做错了什么?

#!/usr/bin/env python
import os
import requests
import time
import hmac
import hashlib

class OperadorBinanceClient:
    def __init__(self, api_key=None, api_secret=None):
        self.api_key = api_key or os.environ.get('binance_api_key')
        self.api_secret = api_secret or os.environ.get('binance_api_secret')
        self.recv_window = 60000  # Valor em milissegundos
        
        self.base_url = 'https://api.binance.com'

        self.user_endpoint = '/sapi/v3/asset/getUserAsset'

        self.conversao_endpoint = '/sapi/v1/convert/limit/placeOrder'

        self.conversao_status_endpoint = '/sapi/v1/convert/orderStatus'


    def _get_timestamp(self):
        return str(int(time.time() * 1000))

    def _generate_signature(self, query_string:str):
        signature = hmac.new(self.api_secret.encode('utf-8'), query_string.encode('utf-8'), hashlib.sha256).hexdigest()
        return signature

    def user_saldo(self, coin='BRL'):
        timestamp = self._get_timestamp()
        query_string = f'recvWindow={self.recv_window}&timestamp={timestamp}'
        signature = self._generate_signature(query_string)
        url = f'{self.base_url}{self.user_endpoint}?{query_string}&signature={signature}'
        headers = {'X-MBX-APIKEY': self.api_key}
        response = requests.post(url, headers=headers)

        all_balances = response.json()
        if coin == '':
            return all_balances
        filtered_balance = [item for item in all_balances if item['asset'] == coin]
        # empty list coin not exist
        return filtered_balance if len(filtered_balance) > 0 else None

    def conversao2(self, de='BRL', para='ETH', quantidade=1, quantidade_de_crypto=0.1, preco_limite=None, lado='BUY', tipo_carteira='SPOT'):
        timestamp = self._get_timestamp()
        quant_de_cpt = f'{quantidade_de_crypto:.15f}'
        
        data = {
            'baseAsset': de,
            'quoteAsset': para,
            'limitPrice': preco_limite or '',
            'baseAmount': quantidade,
            'quoteAmount': quant_de_cpt,
            'side': lado,
            'expiredType': '1_H',
            'recvWindow': 60000,
            'timestamp': timestamp
        }

        signature = self._generate_signature('&'.join([f'{key}={data[key]}' for key in data]))
        data['signature'] = signature

        url = f'{self.base_url}{self.conversao_endpoint}'
        headers = {'X-MBX-APIKEY': self.api_key, 'Content-Type': 'application/json'}

        response = requests.post(url, headers=headers, data=data)
        return response.json()

    def conversao(self, de= 'BRL', para='ETH', quantidade=1, quantidade_de_crypto=0.1,preco_limite=None, lado='BUY', tipo_carteira='SPOT'):
        timestamp = self._get_timestamp()
        quant_de_cpt = f'{quantidade_de_crypto:.15f}'
        
        #&quoteAmount={quant_de_cpt}
        query_string = f'baseAsset={de}&quoteAsset={para}&limitPrice={preco_limite}&baseAmount={quantidade}&side={lado}&expiredType=1_H&recvWindow=60000&timestamp={timestamp}'
        signature = self._generate_signature(query_string)
        url = f'{self.base_url}{self.conversao_endpoint}?{query_string}&signature={signature}'
        headers = {'X-MBX-APIKEY': self.api_key, 'Content-Type': 'application/json'}

        response = requests.post(url, headers=headers)
        return response.json()

    def conversao_status(self, id_conversao):
        timestamp = self._get_timestamp()
        query_string = f'orderId={id_conversao}&recvWindow=60000&timestamp={timestamp}'
        signature = self._generate_signature(query_string)
        url = f'{self.base_url}{self.conversao_status_endpoint}?{query_string}&signature={signature}'
        headers = {'X-MBX-APIKEY': self.api_key}
        response = requests.get(url, headers=headers)
        return response.json()

python python-requests request binance binance-api-client
1个回答
0
投票

关于你的第二个问题,你可以在文档中看到

quoteAmount
应该是一个小数,即一个数字。但是,您提供的是一个字符串,特别是格式化的字符串。如果您简单地将值作为数字传递,它应该可以工作。

考虑到第一个错误,您是否已阅读FAQ以确认您的订单有效?错误代码似乎不寻常,您确定没有收到任何记录的错误代码

© www.soinside.com 2019 - 2024. All rights reserved.