4.06K 浏览
0

这个程序,已经用多进程,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.get_kline_serial(…)后,是不会有问题的。会取得正常,没有缺失的数据。klines.close前面的项不会出现nan。

主程序如下:

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

就解决了。