A KDB+ DataStore Plugin for RightEdge 2010

Discussion in 'RightEdge' started by zwz, Feb 28, 2009.

  1. zwz

    zwz

    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及相关文档。
     
    Last edited by a moderator: Feb 20, 2010
  2. zwz

    zwz

    举例说明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..
     
  3. zwz

    zwz

    一般只要象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。。。
     
  4. zwz

    zwz

    QDataStore可以使用windin的复权因子对A股数据进行前复权,只要在q进程中执行如下的命令即可生成factor内存表(q命令相当简洁:p):
    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...
     
  5. zwz

    zwz

    一般这样启动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服务端的磁盘文件。
     
  6. zwz

    zwz

    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
     
  7. zwz

    zwz

    一些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()获得...
     
  8. 精彩绝伦、叹为观止!
     
  9. 俄的神啊~
     
  10. 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)
     
  11. 才发现RightEdge 1 下update historical数据的plugin,RightEdge 2好像不认。
    不知道是不是要调整。今天搞不定了。
    IB周末不开服务器。也暂时测试不了。
     
  12. zwz

    zwz

    谢谢当小白鼠:D。 确实是因为格式上的那个“^”,已改正,请重新下载。
    q的symbol型如果含有"^"等特殊字符,就不能写为`^HSI,可以从字符串转换而得:`$"^HSI"
     
  13. zwz

    zwz

    有可能。可能因为RightEdge 2还处在beta测试阶段,也许正式版就可以了。为RightEdge 1 写的BarDataStorage插件在RightEdge 2 下也是不认的,需要作些调整。
     
  14. 测试转化本地股票数据成功。速度不错。

    一个新的问题:
    新建立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后,下次再进入,就又出现。
     
  15. zwz

    zwz

    可能是环境问题,我再检查检查代码。
    如果你将“取数时复权”设为TRUE,则请一定要存在内存表factor。另外请查看一下FDB下是否有daily目录。
     
  16. zwz

    zwz

    目录q个人版最新版为2.5,谢谢wind提醒。看样子kx会持续提供试用版。
     
  17. zwz

    zwz

    q里面出现一行“系统找不到指定的路径”是因为判断是否存在daily目录时执行了如下的命令,daily不存在就会出现这行提示,不影响使用。
    @[system;"dir D:\\qdata\\fdb\\daily\\.d";""]
     
  18. 对了。我是vista系统。复权功能没启用。有daily子目录。
     
  19. zwz

    zwz

    与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表是否有数据。
     
  20. 惭愧。估计就是这个原因。q没打开数据库。
    现在是手机上网。等回家就试。
    辛苦了。多谢。