如何确保使用 binance python 执行交易

How to make sure a trade is executed with binance python

当算法做出决定时,我需要卖掉我的硬币。但是如果我创建了一个卖单然后价格下跌,显然没有人会以那个价格买进。因此,我需要检查订单是否已成交,如果没有,我需要重做订单。 (也许有更好的解决方案,我愿意接受各种答案)

这是我的尝试:(它有时会执行上面的场景并执行这部分之后的代码,其中包含尚未执行的命令,这会使程序崩溃)。

        #sellOrder
        sellOrder = client.create_order(symbol = hparams['MARKET_STRING'], side = 'SELL', type = 'MARKET', quantity = hparams['TRADE_TOKEN_AMOUNT'])
        print("Selling ...")
        print(sellOrder)
        sellOrderID = sellOrder['orderId']
        time.sleep(30)
        soldCheck = True
        while soldCheck:
            currentOrder = client.get_order(symbol = hparams['MARKET_STRING'], orderId = sellOrderID)
            if currentOrder['status'] == 'FILLED':
                soldCheck = False
            else:
                #cancel orber 
                client.cancel_order(symbol = hparams['MARKET_STRING'], orderId = sellOrderID)
                time.sleep(1)
                sellOrder = client.create_order(symbol = hparams['MARKET_STRING'], side = 'SELL', type = 'MARKET', quantity = hparams['TRADE_TOKEN_AMOUNT'])
                sellOrderID = sellOrder['orderId']
                time.sleep(5)   

在我看来,您在 while 循环中使用了自相矛盾的逻辑。

如果我没理解错的话,您 运行 遇到了执行循环内代码的问题?

当布尔变量 SoldCheck 为 True 时语法 while SoldCheck: 将 运行 循环 - 您已将其静态设置为 False,因此循环不会 运行.

试试这个:

#sellingorder
sellOrder = client.create_order(symbol = "DOGEEUR", side = 'SELL', type = 'MARKET', quantity = float(50.0))
print("Selling ...")
print(sellOrder)
sellOrderID = sellOrder['orderId']

time.sleep(5) #sleeping while it sells
#Check order was sold TODO
soldCheck = True #true = not sold TODO
while soldCheck:
    currentOrder = client.get_order(symbol = "DOGEEUR", orderId = sellOrderID)
    if currentOrder['status'] == "FILLED":
        soldCheck = False #sold
    else:
        #cancel order
        client.cancel_order(symbol = "DOGEEUR", orderId = sellOrderID)
        time.sleep(1)
        sellOrder = client.create_order(symbol = "DOGEEUR", side = 'SELL', type = 'MARKET', quantity = float(50.0))
        sellOrderID = sellOrder['orderId']
        time.sleep(5)

然后,当满足 if 条件(即状态已填充)时,您将 SoldCheck 标志恢复为 False 以停止循环,因为您不再需要取消订单。

如果以上解决了您的问题,能否采纳?如果我想到更好的方法,我会添加到这里,但以上应该可以解决你的问题。

编辑:您正在尝试下达市价订单,根据定义,该订单不受价格波动的影响,方式与限价订单相同。市价订单意味着您接受市场愿意给您的最佳价格 - 该交易应立即成交。

如果错误在给定函数内(如果没有详细说明如何调用此函数很难说)我相信它是以下之一:

  1. 当 currentOrder 是市价订单时,其状态未设置为 'Filled',因此循环永远不会退出。
  2. 取消订单调用不会取消原始订单,因为它已经填写,但您在尝试下订单之前不检查订单是否已成功取消。

为了帮助理解问题,能否提供原始 create_order 调用、get_order 调用和 cancel_order 的输出?

谢谢