据我所知,创建新期货订单的唯一方法是使用client.futures_create_order()。问题是这需要你给它你想要购买的合同的确切数量。我用美元来做所有的交易,所以我想知道是否有办法给它一个美元的金额或我所拥有的美元的百分比,而不是订单合同的金额?如果答案是否定的,那么是否有任何方法可以计算出使用指定金额的BUSD或您钱包中BUSD的百分比来购买多少合约?
我目前使用client.futures_create_order()来执行交易。我正在使用币安对冲模式,所以放置我使用的多头,side = 'BUY',positionSide: ' Long '。然后卖出时,我保持仓位为"多头",但将仓位转换为"卖出",反之亦然。使用create order的要求之一是列出您想要购买或出售的订单合约的数量。但是我想每笔交易用我的美元账户余额的5%。我找到了一种方法,可以拉出我想交易的股票的价格,然后计算出我账户余额的5%是多少美元,最后乘以股票价格,得到要购买的订单合约数量。但即便如此,它也有自己的问题,其中之一就是四舍五入。如果我购买DOGE, Binance不会让我购买少于一个合约,所以需要将其四舍五入到最接近的整数。但如果我买的是比特币,显然四舍五入是没有用的。即使我们有办法解决这个问题,还有一个问题。我一次做了不止一笔交易,所以假设我用我的美元余额的5%做多,当时假设是5美元。在买卖期间,我的账户余额会发生变化。所以当它下达卖出指令时,它再次使用5%但现在只有4.5美元,所以交易中仍然有0.5美元。如果使用百分比是不可能的,那么能够使用固定数量的BUSD仍然比使用合同金额有巨大的好处。
对于有这个问题的人,我想出了一个解决方案,它不是完美的,但它适用于我。
FIL3MIN_original_quantity=None
@app.route('/test', methods = ['POST'])
def test():
data = json.loads(request.data)
side = data['order_action']
positionSide = data['positionSide']
command = data['command']
global FIL3MIN_original_quantity
if command == "FIL3MINBUY":
key = "https://api.binance.com/api/v3/ticker/price?symbol=FILBUSD"
hey = requests.get(key)
hey = hey.json()
sym_price =(f"{hey['price']}")
ticker_price = float(sym_price)
acc_balance = client.futures_account_balance()[8]
balance_value = acc_balance['balance']
balance_value = float(balance_value)
BUSD_quantity = balance_value * 0.02
quantitys = BUSD_quantity/ticker_price
quantityss =quantitys*20
quantityss = round(quantityss, 1)
executed_order = client.futures_create_order(symbol='FILBUSD',side=side,positionSide=positionSide,
type=ORDER_TYPE_MARKET, quantity=quantityss)
FIL3MIN_original_quantity = executed_order['origQty']
if executed_order: return {"code": "success", "message": "order executed BUY",
"amount bought": FIL3MIN_original_quantity}
else: return{"code": "error","message": "order failed"}
if command == "FIL3MINSELL":
if FIL3MIN_original_quantity == None:return("No open position to close")
else:executed_order2 = client.futures_create_order(symbol='FILBUSD',side=side,positionSide = positionSide ,
type=ORDER_TYPE_MARKET, quantity=FIL3MIN_original_quantity)
FIL3MIN_original_quantity=None
if executed_order2: return {"code": "success","message": "order executed SELL"}
else:return {"code": "error","message": "order failed"}
我知道这看起来很乱,但它对我有用。为了简化程序,首先看一下它给出的消息,它看起来像这样。下购买订单。
{"passphrase": "abc123","order_action": "BUY","positionSide": "LONG", "command": "FIL3MINBUY"}
下卖单
{"passphrase": "abc123","order_action": "SELL","positionSide": "LONG", "command": "FIL3MINSELL"}
从这行代码中,它从交易视图中接收到,然后计算该股票的当前价格,在本例中是FILBUSD。然后得到我当前的美元账户余额来计算2%是多少。然后,它将2%的美元转换为合约金额,然后将其四舍五入。接下来,它下购买订单,并记住购买的合约数量,并将其存储在FIL3MIN_original_quantity中。然后,一旦它从交易视图接收到卖单,它就提取合同数量并放置卖单。