请教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

More

小小梦 看了下代码 ``` 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