2010.2.20更新:重新编译kdbDataStore.dll,支持RE2010(Build 15),点击下载(17KB,只含更新的kdbDataStore.DLL文件). 2010.2.6更新: KdbDataStore 功能:用KDB+替代RE的LocalDataStore保存Bar、Tick数据。 支持:RightEdge Edition 2 (不支持Edtion 1);q2.4+。 更新: 1)DLL改名为KdbDataStore.dll。 2)增加一些配置选项,如表名、字段名都可以自定义,每次连接时可检查Q链接是否有效,若Q关闭则自动打开等。 3)增加功能: 可直接从大智慧日线、分钟线文件(*.dat)、专业财务数据文件等读取数据并导入kdb+、用大智慧的除权数据计算复权因子……;可将kdb+数据生成DAD文件安装到大智慧;可将RE策略信号导入大智慧等。 下载:下载(自解压文件,2.7MB)。 密码1 安装:双击,建议目标文件夹为d:\,将安装在d:\fe,第一次使用请先运行setqhome.bat。一些简单说明文档在\fe\help目录。。。 压缩包里已经含有从kx网站下载的q2.6及相关文档。
举例说明QDataStore用法: 1)新建一文件夹,如 d:\qdata\fdb\,作为数据库目录; 2)启动q,输入"\p 5001"指定端口 (或q -p 5001); 3)下载QDataStore.rar并解压。把QDataStore.dll复制到RE的Plugins下; 4)启动RE,选择Tools=>Options,选择General标签Data Store列表中的QDataStore,点击Setup...; 5)设置如下: kdb+地址:localhost kdb+端口:5001 (与上面\p 5001一致) kdb+用户密码: (空白) 数据库路径:d:/qdata/fdb/ 取数时复权:False 设置完成后点击OK,OK; 6)在Watchlist窗口中右击SymbolLists,New Folder,输入Folder名称,假设为"A"; 7)输入symbols: 右击A,选Add Symbols...,在Symbols框输入 000001.SZ 600000.SS , OK; 8)从yahoo下载daily数据: 右击A,选Configure Folder..., Bar Frequency:选Daily Historical Data Service: Yahoo (如果没有找到yahoo请先Tools=>Configure Services) Realtime Data Service:RandomData (如果没有找到RandomData请先Tools=>Configure Services) Save Tick Data:Yes Save Aggregated Bars:Yes ok... 选中A,Data=>Watchlist=>Update Checked Historical,补充Daily数据。双击symbol就可以查看K张图了。。。。 9)实时数据测试: Configure Folder=> Bar Frequency改为1 minute, Start data feed , tick和1 min数据保存到kdb..
一般只要象2楼那样设置一下QDataStore的参数就可以使用了。 如果想更顺利使用这个插件并利用保存在kdb+中的数据(这是使用这个插件的目的),就需要了解更多内容。下面再罗索地讲一讲,供参考。。 qdatastore的数据库结构: 假设数据库主目录为d:/qdata/fdb qdatastore会根据数据周期自动创建一个或多个以下目录: 1)Bar数据: d:/qdata/fdb/daily (日数据) d:/qdata/fdb/weekly (周数据) d:/qdata/fdb/monthly (月数据) d:/qdata/fdb/yearly (年数据) d:/qdata/fdb/bar1 (1分钟数据) d:/qdata/fdb/bar5 (5分钟数据) d:/qdata/fdb/barN (N分钟数据) 2)tick数据 d:/qdata/fdb/tick (tick数据) 可以把上面的daily,weekly,...,bar1,bar5,..,tick等看作是表的名称。 QDataStore以q的splay表形式保存bar数据和tick数据。 daily,weekly,monthly,yearly 这些bar数据表的结构: 即sym(证券代码,symbol型)、date(日期,date型)、open/high/low/close(开高低收,float型)、volume(成交量,long型)、openint(成交额或持仓量,long型) q命令:([] sym:`symbol$();date:`date$();open:`float$();high:`float$();low:`float$();close:`float$();volume:`long$();openint:`long$()) bar1,bar2,bar5,...,barN表的结构与上面的基本相同,不过date字段为datetime型。 q: ([] sym:`symbol$();date:`datetime$();open:`float$();high:`float$();low:`float$();close:`float$();volume:`long$();openint:`long$()) tick表的结构: sym(代码,symbol型)、date(时间,datetime型)、price(价格,float型)、size(量,long型)、ticktype(RE定义的tick数据类型对应的整数值:Bid = 1,Ask = 2,Trade = 3,HighPrice = 4,LowPrice = 5,OpenPrice = 6,PreviousClose = 7,DailyVolume = 8,CurrentTime = 9,NotSet = 0) q: ([] sym:`symbol$();date:`datetime$();price:`float$();size:`long$();ticktype:`short$()); QDataStore定义的结构不一定是最优的,今后将视情况进行改进;这种结构特别是tick表也与q的做法不一样,主要是为了适应RE。。。
QDataStore可以使用windin的复权因子对A股数据进行前复权,只要在q进程中执行如下的命令即可生成factor内存表(q命令相当简洁): Code: /复权因子 factor:flip `sym`date`af! ("SDF";",")0: `:D:/Windin/WWT2008/etc/HQAFHIS.DAT; delt:flip `op`sym`date`af! ("ISDF";",")0: `:D:/Windin/WWT2008/etc/HQAFDELT.DAT; delete from `factor where sym in exec sym from delt where op>0; factor:`sym`date xasc factor,select sym,date,af from delt where op=0; 上面的D:/Windin/WWT2008视WINDIN安装位置进行修改即可。有了factor内存表就可以将QDataStore plugin setting中的“取数时复权”设置为true...
一般这样启动q: q d:/qdata/fdb -p 5001 -U c:\q\w32\qusers 其中, 1、d:/qdata/fdb 是数据库目录,启动时q会将该目录下的splayed table进行映射,并自动执行该目录下的*.q。为了启动q后就可以使用factor表,可以将楼上的q命令保存为d:/qdata/fdb/a.q(文本文件)。 2、-p 5001 :设置端口。 3、-U qusers :设置用户名和密码,最好设置一下,否则他人可以通过在浏览器输入http://你的IP地址:5001/ 查看到q进程中的数据表。。。 设置用户名和密码,只要把用户名和密码保存在一个文本文件中。如用记事本建立一个文本文件,文件名为qusers,输入用户名和密码yourusrname:yourpassword(每个用户名、密码对为一行,中间用分号隔开)并保存为c:\q\w32\qusers。 -U(大写字母)表示QDataStore可以存取q服务端的磁盘文件。
q.exe是一个Windows Console,如果想让它以Windows服务的方式在后台运行(让q更象一个数据库服务器:),可以下载免费的DynaSvr等工具。 DynaSvr.ini象下面这样写: [NT_SERVICE_CONTROLLER] DYNAWEB_RUNNING_DIR=d:\q\w32 DYNAWEB_CMD=d:\q\w32\q.exe d:/qdata/fdb -p 5001 -U qusers DYNAWEB_LOG=TRUE DYNAWEB_LOG_FILE=d:\q\w32\qservicelog.txt
一些q code例子: 复权计算函数: Code: dailyadj:{[x]x:distinct x;ft:([]sym:x;date:(count x)#1950.01.01;af:(count x)#1f),select sym,date,af from factor where sym in x;d:`sym`date xasc select from daily where sym in x;df:aj[`sym`date;d;ft];df:update f:af % max af by sym from df;df:update open:open*f,high:high*f,low:low*f,close:close*f from df;:df}; 读windin的证券代码: Code: /证券代码 syms:flip `sym`name`stype! ("SSS";",")0: `:D:/Windin/WWT2008/etc/SECBASICHIS.DAT; delt:flip `op`sym`name`stype! ("ISSS";",")0: `:D:/Windin/WWT2008/etc/SECBASICDELT.DAT; delete from `syms where sym in exec sym from delt where op>0; syms:syms,select sym,name,stype from delt where op=0; 读windin交易日期: Code: importdates:{tradedate: read0 `:D:/Windin/WWT2008/etc/CNTRADEDATES.DAT;tradedate:"D"$tradedate;tradedates:([]date:tradedate);`:d:/qdata/bar/tradedates set tradedates;:tradedates}; tradedates:importdates[]; 导入daily文本文件: Code: mycols: ("SDFFFFJJ"; ",") 0:`:d:/qdata/daily.csv; daily: flip `sym`date`open`high`low`close`volume`openint!mycols; `:d:/qdata/fdb/daily/ set .Q.en[`:d:/qdata/fdb] daily; 导入QuoteTracker 数据(以http方式读数据,QT不需要注册): Code: getqthistory:{[portname] txt:`:http://127.0.0.1:16239 "GET /req?EnumPortSymbols(",(portname),") http/1.1\r\nhttp://127.0.0.1:16239\r\n\r\n"; stocks:`$ "," vs ((6+txt ss"\r\nOK")_txt)[0]; tbl:([]sym:();date:();open:();high:();low:();close:();volume:();openint:());i:0; do[count stocks:distinct stocks,(); txt:`:http://127.0.0.1:16239 "GET /req?getHistory(",(ssr[ssr[string stocks[i];"#";"%23"];" ";"%20"]),",0,0,1D,YES) http/1.1\r\nhttp://127.0.0.1:16239\r\n\r\n"; mysym:(`$ssr[ssr[ssr[ssr[string stocks[i];"#F";"_C"];"A0-FX";" .FX"];"-";"."];" ";""]); tbl,:update sym:mysym,openint:0 from select from (flip `date`open`high`low`close`volume!("DFFFFJ";",")0:(6+txt ss"\r\nOK")_txt) where not null date; i+:1]; (lower cols tbl)xcol`date`sym xasc tbl}; getqthistory["RTCK8"] getqthistory["RTCK8"]中的RTCK8是PortID,可以访问 http://127.0.0.1:16239/req?EnumPorts()获得...
yahoo股票数据测试成功。包括A股、美股、港股。速度很好。 yahoo指数有点小问题。可能因为yahoo指数的格式上有个“^”. "^HSI"、"^GSPC"之类。 错误信息为: An exception of type System.Exception was thrown. HSI 在 Kdbplus.Connection.Listen() 在 Kdbplus.Connection.Query(String query) 在 Drzwz.QDataStore.barDataAccessor.Load(DateTime start, DateTime end, Int64 maxItems, Boolean loadFromEnd) 在 RightEdge.Common.DataStorageUtil.GetLastBarDate(IDataStore storage, SymbolFreq symbol) 在 RightEdge.xd509be1670bd46b3.x531d93f037fc81d1(Dictionary`2 x273c212ea6c4689b)
测试转化本地股票数据成功。速度不错。 一个新的问题: 新建立D:\qdata\fdb 子目录后,运行q (在c:\q\w32) q -p 5001。运行RE,更新几个股票历史数据,一切正常。 但是q里面不知道什么时候出现一行“系统找不到指定的路径”。但是,不影响使用。 退出q。退出RE。 再进q。再进RE,再调用原来的数据或者更新数据时出错。 调用原来数据时的错误信息: An exception of type System.Exception was thrown. daily 在 Kdbplus.Connection.Listen() 在 Kdbplus.Connection.Query(String query) 在 Drzwz.QDataStore.barDataAccessor.Load(DateTime start, DateTime end, Int64 maxItems, Boolean loadFromEnd) 在 RightEdge.Common.DataStorageUtil.LoadBars(IDataStore storage, SymbolFreq symbol, DateTime start, DateTime end, Int64 maxItems, Boolean loadFromEnd) 在 RightEdge.xf266856f631ec016.ShowQuickChart(SymbolFreq symbol, ChartSettings settings, BarConstructionType constructionType) 在 RightEdge.xf266856f631ec016.ShowQuickChart(SymbolSetup setup) 在 RightEdge.x916e705eb4ff7a49.xa337d2a7b510eb4c(Object xe0292b9ed559da7d, TreeNodeMouseClickEventArgs xfbf34718e704c6bc) 更新数据时的出错信息:Error: daily. 具体信息如下: An exception of type System.Exception was thrown. daily 在 Kdbplus.Connection.Listen() 在 Kdbplus.Connection.Query(String query) 在 Drzwz.QDataStore.barDataAccessor.Load(DateTime start, DateTime end, Int64 maxItems, Boolean loadFromEnd) 在 RightEdge.Common.DataStorageUtil.GetLastBarDate(IDataStore storage, SymbolFreq symbol) 在 RightEdge.xd509be1670bd46b3.x531d93f037fc81d1(Dictionary`2 x273c212ea6c4689b) 如果删除fdb子目录,然后再建立fdb子目录,这些问题就都消失。 但退出q和re后,下次再进入,就又出现。
q里面出现一行“系统找不到指定的路径”是因为判断是否存在daily目录时执行了如下的命令,daily不存在就会出现这行提示,不影响使用。 @[system;"dir D:\\qdata\\fdb\\daily\\.d";""]
与vista应该没关系,我也是在vista测试的。vista对C盘的限制较多,数据最好放在D盘。 我注意到你启动q是用了下面的命令: q -p 5001 而错误信息是"daily",所以可能是因为找不到daily表,可能是你启动q后没有加载数据库。 这样试试: 1)用q -p 5001启动q后,输入 \l d:/qdata/fdb 加载数据库。 2)直接用q d:/qdata/fdb -p 5001 启动(效果与1同)。 启动q后,输入\a,确认一下是否可以看到`daily表,或者进一步输入select from daily 看看daily表是否有数据。