请教python在while中反复调用GetOrder(order_id).Status,利用time.time来跟踪订单变化的问题
请教python在while中反复调用GetOrder(order_id).Status,利用time.time来跟踪订单变化的问题
Author: hunter1015, Created: 2018-03-03 21:22:27, Updated: 2018-03-03 21:23:29
请教各位,我想在while中跟踪订单变化,循环之前保存当时时间time1,while开始后当订单状态在2秒后(time.time()-time1>2)的状态还是pending就return 0,如果是ORDER_STATE_CLOSED,那就return 1,返回完成。
但是在实盘测试中,发现程序会进入无限循环不会停下来,最后一条信息就是“订单已下”
代码附下,请大大帮忙释疑
order_result =exchange.Sell(fee,size)
Log('订单已下')
if order_result==None:
return 0
if order_result!=None:
time1=time.time()
while True:
order_status=exchange.GetOrder(order_result).Status
if order_status==None and time.time()-time1>2:
Log('订单状态获取失败')
return 0
if order_status!=None:
if time.time()-time1>2 and (order_status==ORDER_STATE_CANCELED or order_status==ORDER_STATE_PENDING):
Log("订单挂单或被取消")
return 0
if order_status==ORDER_STATE_CLOSED:
Log("订单完成")
return 1
更多内容
小小梦 看了下代码
```
order_result =exchange.Sell(fee,size) # 下单
Log('订单已下')
if order_result==None: # 没有返回 订单ID
return 0
if order_result!=None: # 下单成功
time1=time.time() # 记录 秒级别 时间戳
while True: # 循环判断
order_status=exchange.GetOrder(order_result).Status # 读取订单状态
if order_status==None and time.time()-time1>2: # 和下单后, 循环读取 判断订单状态前 的时间 对比, 检测是否超过2秒
Log('订单状态获取失败') #
return 0
if order_status!=None: # 获取状态 成功
if time.time()-time1>2 and (order_status==ORDER_STATE_CANCELED or order_status==ORDER_STATE_PENDING): # 订单 2秒后 为 挂起 或者 取消
Log("订单挂单或被取消")
return 0
if order_status==ORDER_STATE_CLOSED: # 订单完成
Log("订单完成")
return 1
```
逻辑应该没有问题。
发现问题 可能是 GetOrder 返回的订单数据 里面有 其它状态,比如 可能会 有未知状态,这个 您具体 是在哪个 交易所 操作的。
建议在order_status=exchange.GetOrder(order_result).Status 句之后 加上 Log(order_status) 看下状态的具体数值。
小小梦 是哪个 交易所 ,交易对是什么, 另外 出问题的 代码 发下。
hunter1015 发帖子的时候编辑打错了,代码中确定变量是一致的。实盘反复测试了好多次,就是卡在了GetOrder里出不来,也不会报错,也不会有LOG返回。
小小梦 您这个 代码是不是 写错了 , 这个 ID 应该是 未定义的, 代码里面 就只有这一处 出现。没有初始化也没赋值。
https://dn-filebox.qbox.me/d89332ffbe84fa2cdcac442649edb35f4f61a3cc.png
hunter1015 梦大,这两天我实盘测试了几次,发现exchange.GetOrder()这条语句触发后,根本就没有返回,或者说是一进入本语句就程序就卡死在里面没出来过,导致我设置的所有打印内容都没有打印出来。
def main():
#Log(exchange.GetAccount())
time1=time.time()
Log('记录时间为',time1)
depth = _C(exchange.GetDepth);
orders_buy1=depth.Bids[0].Price
orders_buy2=depth.Bids[1].Price
orders_buy3=depth.Bids[2].Price
orders_sell1=depth.Asks[0].Price
orders_sell2=depth.Asks[1].Price
orders_sell3=depth.Asks[2].Price
account=exchange.GetAccount()
sell_order_id =exchange.Sell(orders_buy1*0.999, 0.1);#下单
time1=time.time() #记录下单完成时间戳
if sell_order_id==None:
Log('订单号为空')
if sell_order_id!=None: #如果成功获取订单号
order_back_message_last=None #记录上一次 查询订单的返回信息内容(初始化为None)
while True: #进入while循环,用GetOrder跟踪订单信息
order_back_message=exchange.GetOrder(order_result) #GetOrder的返回信息(所有)
Log('查询订单返回内容为',order_back_message) #无脑输出订单返回内容
if order_back_message!=order_back_message_last: #如果本次订单信息和上次不一致,则Log输出并更新order_back_message_last
Log('查询订单返回内容为',order_back_message)
order_back_message_last=order_back_message
order_status=order_back_message.Status#订单返回数据结构中提取Status(从这开始不用看了,因为上面就没走通过)
order_status=exchange.GetOrder(sell_order_id).Status
Log(order_status)
if order_status==None and time.time()-time1>2:
Log('订单状态获取失败')
break
if order_status!=None:
if order_status==ORDER_STATE_CLOSED:
Log('对冲买-成功')
break
#return True
elif time.time()-time1>2 and (order_status==ORDER_STATE_CANCELED or order_status==ORDER_STATE_PENDING):
Log('对冲买-失败')
break
#return False
#Log(exchange.GetAccount())
#Log('xunhuan')
#PD_SHORTLog('当前时间=',time.time(),' 初始时间为=',time1)
小小梦 是这样的 , 有些交易所 订单状态 有各种 非 BotVS 文档里面的 标准状态, BotVS 定义为 未知状态了, 您可以 在 order_status=exchange.GetOrder(order_result).Status 句之后 加上 Log(order_status) 看下状态的具体数值。
就可以 看到,具体 订单 状态是什么值, 从而 判断 这个问题 (什么原因导致的 进入 死循环)。
hunter1015 @小小梦 梦大,我在gateIO,这个问题发现好几天了,也写过简单的代码回测过结果感觉也没什么问题。
https://dn-filebox.qbox.me/97f571e4222ee9c61bd6e3cb203af319b11a8c72.png