dolphindb 中,如何根据一组合约快速取到tick数据?

我有一张表A,是日期和对应的合约名:

TradingDay        InstrumentID
2019.11.27         IF1911

现在想根据这张表,取连续的tick数据,tick表是分布式表,结构简化后如下:

TradingDay      InstrumentID     UpdateTime                             LastPrice       ProductID
2019.11.27       IF1911                2019.11.27T09:48:00.001         0.01               IF

我如果用ej, 那么需要tick全部加载内存然后跟A表关联,

ej(tick, A'TradingDay`InstrumentID

这样ej的左表会很大, 感觉也不是很有效率。这个有什么解决方案吗?




请先 登录 后评论

2 个回答

Jason Tang - 时序数据库技术支持

取连续合约数据,可以对表A中的每一行,分别提交一个query,最后用union合并

def getTickData(dict){
 curDate = dict.TradingDay
 curID = dict.InstrumentID
 curProductID = curID.left(2)
 return select TradingDay, UpdateTime, InstrumentID, LastPrice from loadTable("db", "tick") where TradingDay = curDate, ProductId =curProductID, InstrumentID = curID
}
ploop(getTicketData, A).unionAll(false)
请先 登录 后评论
谭华

解决方案

取连续合约数据,可以对表A中的每一行,分别提交一个query,最后用union合并


数据:

TradingDay = 2020.03.01..2020.04.01
Instrument = take(`IF1911`IF1912`IF1913`IF1914`IF1915, 32)
db = database("dfs://dict",VALUE,2020.03.01..2020.04.01)
dbSchema = table(1:0,`TradingDay`Instrument,`Date`SYMBOL)
pt = db.createPartitionedTable(dbSchema,`pt,`TradingDay)
t = table(TradingDay,Instrument)
pt.append!(t)

TradingDay = 2020.03.01..2020.04.01
Instrument = take(`IF1911`IF1912`IF1913`IF1914`IF1915`IF1918`IF1916`IF1917, 32)
LastPrice = rand(0.5,32)
db1 = database("dfs://tick",VALUE,2020.03.01..2020.04.01)
dbSchema1 = table(1:0,`TradingDay`Instrument`LastPrice,`Date`SYMBOL`DOUBLE)
pt1 = db1.createPartitionedTable(dbSchema1,`pt1,`TradingDay)
t1 = table(TradingDay,Instrument,LastPrice)
pt1.append!(t1)


本文方案代码:

def getTickData(dict){// 注意dict不是字典,是一张内存表
    return select TradingDay, Instrument, LastPrice from loadTable("dfs://tick", "pt1") where TradingDay = dict.TradingDay, Instrument = dict.Instrument
}

对比:

本文提供的方案         耗时14.118 ms

ej 方案                       耗时:26.761 ms

请先 登录 后评论