这个程序,已经用多进程,multi-thread(多线程)的方式,都编程运行成功了。所以运行和计算逻辑是没有问题的。
下面,我想把这个程序,改编成asyncio的模式。就出现了问题。
async def trading_calc(api:TqApi, trading_contract:str="SHFE.cu2003", trading_Lot:'int>=0'=1, kline_contract:str="KQ.i@SHFE.cu", kline_interval:'int>0'=300)->TqApi: quote = api.get_quote(trading_contract) # 沪铜主力合约 klines = api.get_kline_serial(kline_contract, kline_interval, data_length=8000) #沪铜指数的5分钟k线 account = api.get_account() ... ... async with api.register_update_notify(klines) as update_chan: # 当 quote 有更新时会发送通知到 update_chan 上 while True: async for _ in update_chan: # 当从 update_chan 上收到行情更新通知时判断是否触发开仓条件 if api.is_changing(klines.iloc[-1], "datetime"): #当出现新k线时 break close_price = np.array(klines.close) # 收盘价 print(close_price.shape, close_price[:10], close_price[-10:-1]) #debug 20200114 print(klines.close.shape, klines.close[:10], klines.close[-10:-1]) #debug 20200114 计算ing... print(quote.datetime, 'account.balance=', account.balance, ...) if 开仓条件1: order = api.insert_order(...) async with api.register_update_notify(order) as update_chan: # 当 quote 有更新时会发送通知到 update_chan 上 while True: async for _ in update_chan: # 当从 update_chan 上收到行情更新通知时判断是否触发开仓条件 if api.is_changing(order, "status"): break if 开仓条件2: ... ... position = api.get_position(trading_contract) print('contract=', trading_contract, "position.pos_long=", position.pos_long, "position.pos_short", position.pos_short)
问题出在,上述程序,“计算ing…”上面2行print。
这2行print,打印出来的klines.close。最前面的数据,有很多nan。明显是前面的api.get_kline_serial(…)语句,申请的klines数据,没有刷新齐全。所以这时的klines.close最前面的数据,有很多缺失,就造成nan。而这些缺失的数据,使我后面的“计算”,无法完成。
请教尊敬的信易公司工作人员,这个问题,如何解决。
ringo 已回答的问题 2020年1月15日
主程序如下:
api = TqApi(TqAccount(“快期模拟”, “…”, “…”), web_gui=True)
api.create_task(trading_calc(api, trading_contract=”SHFE.cu2003″, trading_Lot=1, kline_contract=”KQ.i@SHFE.cu”, kline_interval=300))
with closing(api):
while True:
api.wait_update()
问题已解决。
改为:
if api.is_changing(klines.iloc[-1], “datetime”) and not np.isnan(klines.close[0]):
break
就解决了。
如果是多进程,或多线程,的编程方式,这个程序,在api.get_kline_serial(…)后,是不会有问题的。会取得正常,没有缺失的数据。klines.close前面的项不会出现nan。