如何确保使用 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 以停止循环,因为您不再需要取消订单。
如果以上解决了您的问题,能否采纳?如果我想到更好的方法,我会添加到这里,但以上应该可以解决你的问题。
编辑:您正在尝试下达市价订单,根据定义,该订单不受价格波动的影响,方式与限价订单相同。市价订单意味着您接受市场愿意给您的最佳价格 - 该交易应立即成交。
如果错误在给定函数内(如果没有详细说明如何调用此函数很难说)我相信它是以下之一:
- 当 currentOrder 是市价订单时,其状态未设置为 'Filled',因此循环永远不会退出。
- 取消订单调用不会取消原始订单,因为它已经填写,但您在尝试下订单之前不检查订单是否已成功取消。
为了帮助理解问题,能否提供原始 create_order 调用、get_order 调用和 cancel_order 的输出?
谢谢
当算法做出决定时,我需要卖掉我的硬币。但是如果我创建了一个卖单然后价格下跌,显然没有人会以那个价格买进。因此,我需要检查订单是否已成交,如果没有,我需要重做订单。 (也许有更好的解决方案,我愿意接受各种答案)
这是我的尝试:(它有时会执行上面的场景并执行这部分之后的代码,其中包含尚未执行的命令,这会使程序崩溃)。
#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 以停止循环,因为您不再需要取消订单。
如果以上解决了您的问题,能否采纳?如果我想到更好的方法,我会添加到这里,但以上应该可以解决你的问题。
编辑:您正在尝试下达市价订单,根据定义,该订单不受价格波动的影响,方式与限价订单相同。市价订单意味着您接受市场愿意给您的最佳价格 - 该交易应立即成交。
如果错误在给定函数内(如果没有详细说明如何调用此函数很难说)我相信它是以下之一:
- 当 currentOrder 是市价订单时,其状态未设置为 'Filled',因此循环永远不会退出。
- 取消订单调用不会取消原始订单,因为它已经填写,但您在尝试下订单之前不检查订单是否已成功取消。
为了帮助理解问题,能否提供原始 create_order 调用、get_order 调用和 cancel_order 的输出?
谢谢