聚合生成的输出outputTable分别为 keyedTable 和 keyedStreamTable 时,结果不一样

聚合引擎,分别用 keyedTable 和 keyedStreamTable 生成的表接收结果时,效果不一样。使用前者能接收,但不能作为更大周期的数据源;后者没有起到聚合作用,仅是截取了每分钟 ticks数据的第一条记录。

GUI执行的代码如下:

//////////  bar 结构
barColNames=`ActionTime`InstrumentID`Open`High`Low`Close`Volume`Amount`OpenPosition`AvgPrice`TradingDay
barColTypes=[TIMESTAMP,SYMBOL,DOUBLE,DOUBLE,DOUBLE,DOUBLE,INT,DOUBLE,DOUBLE,DOUBLE,DATE]



/////// 下面的2行代码分别选用其一,发现结果不一致

///////////  先生成1分钟K线 (barsMin01)  此时为空表
share keyedTable(`ActionTime`InstrumentID,100:0, barColNames, barColTypes) as barsMin01         ////////  <=== 选用此代码,能起聚合作用,但无法作为其他周期的 数据源
share keyedStreamTable(`ActionTime`InstrumentID,100:0, barColNames, barColTypes) as barsMin01   ////////  <=== 选用此代码,不能起聚合作用,发现仅是将每分钟的第一条 tick 截取过来了
 
 
 
 
//////////  定义 各列数据来源(算法)
metrics=<[first(LastPrice), max(LastPrice), min(LastPrice), last(LastPrice), sum(Volume), sum(Amount), sum(OpenPosition), sum(Amount)/sum(Volume)/300, last(TradingDay) ]>


////////////  聚合引擎
////////////  	生成 1分钟 K线 聚合引擎
nMin01=1*60000
tsAggrKlineMin01 = createTimeSeriesAggregator(name="aggr_kline_min01", windowSize=nMin01, step=nMin01, metrics=metrics, dummyTable=ticks, outputTable=barsMin01, timeColumn=`ActionTime, keyColumn=`InstrumentID,updateTime=500, useWindowStartTime=true)

///////////  订阅 应会有 1分K线产生
subscribeTable(tableName="ticks", actionName="act_tsaggr_min01", offset=0, handler=append!{getStreamEngine("aggr_kline_min01")}, batchSize=1000, throttle=1, hash=0, msgAsTable=true)
请问是哪里出问题了吗?
请先 登录 后评论

1 个回答

wale

keyedTable:向表中添加新记录时,系统会自动检查新记录的主键值,如果新纪录的主键值与已有记录的主键值重复时,会更新表中对应的记录。

keyedStreamTable: 向表中添加新记录时,系统会自动检查新记录的主键值,如果新记录的主键值与已有记录的主键值重复时,对应的记录不会被更新。

即它们一个是更新,一个是过滤。

你说的keyedStreamTable“没有起到聚合作用,仅是截取了每分钟 ticks数据的第一条记录”,只是因为你在createTimeSeriesAggregator中设置了updateTime=500,若指定了updateTime,当前窗口内即可能会发生多次计算。

你这里用keyedStreamTable 是想再订阅这张结果表吧,那就不能用updateTime。 如果要强制触发的话可以用forceTrigger(但目前1.30.13版本的forceTrigger已发现有个bug,需要等新版本发布后再用)。


请先 登录 后评论
  • 2 关注
  • 0 收藏,1174 浏览
  • MrJin 提出于 2021-09-29 13:39