1、支持任意周期K线。

2、支持K线偏移。

3、支持指数、主力。

4、支持文华商品指数。

默认支持的是:5秒、1分钟、3分钟、5分钟、日线。

时间:2010年到现在。

数据如下:

5秒线,大宗商品指数(文华商品7186)

5秒线,工业品

1分钟,螺纹钢指数

5分钟前偏移60秒,大宗商品指数,时间去除了‘:’。

代码比较复杂,贴上导出的库:

/*
libkline特性
1、支持任意周期K线。K线周期以秒为单位,大于总交易时间的都认为是日线。整个交易日期间不会因为
暂时停盘截断K线,例如:rb的交易时间是晚上21:00:00-23:00:00,白天9:00:00-10:15:00...
如果周期是7分钟(即420秒),对应的K线是21:07:00、21:14:00、...22:59:00、9:06:00、..
22:59:00-23:00:00的数据算到9:06:00那根K线上。
2、支持K线偏移。偏移量以秒为单位,支持正负值。同样以rb合约,7分钟周期为例。假如希望K线滞后
1分钟(即60秒),则偏移量为正数60,对应的K线是21:08:00、21:15:00、...23:00:00、
9:07:00、...。假如希望K线提前1分钟(即60秒),则偏移量为负数-60,对应K线是21:06:00、
21:13:00、...22:58:00、9:05:00、...。K线提前可能导致K线增多一根(最后)的情况。
3、K线自动补全。同样以rb合约,1分钟周期为例。如果第一个tick是21:01:01(该tick
应该是21:02:00这根K线),则按最新价补上21:01:00这根K线。如果相邻两个tick时间分别是
21:03:18和21:06:02,则会以21:03:18的数据补上21:05:00、21:06:00两根K线。
4、集合竞价凑入下个区间。例如:20:59:00的数据认为是21:00:00,8:59:00的数据认为是
9:00:00,只有夜盘和白盘开始前5分钟的数据才认为是集合竞价数据。
*/ #ifndef LIB_KLINE_H
#define LIB_KLINE_H #ifdef LIBKLINE_EXPORTS
#define LIBKLINE_API __declspec(dllexport)
#else
#define LIBKLINE_API
#endif #include "ThostFtdcUserApiStruct.h"
#include "user_define_struct.h"
#include <functional>
#include <string>
#include <vector>
#include <list> #define COMMODITY_EXCHANGE "DZSPZS" //类别:大宗商品指数 typedef std::function<void(const SoffsetKline&,std::list<Skline>*)> lpGetKline;
typedef std::function<void(const char*,CThostFtdcDepthMarketDataField*)> lpGetIndex;
typedef std::function<void(const CThostFtdcDepthMarketDataField*)> lpGetShot;
typedef std::function<void(const SoffsetKline&, std::list<Skline>*)> lpTrig;
typedef std::function<void(const char*, std::list<CThostFtdcDepthMarketDataField>*)> lpGetIndexTick;
typedef std::function<void(const char*, double, CThostFtdcDepthMarketDataField*)> lpCommodityInfo;
typedef std::function<void(const char*)> lpErrMsg; class LIBKLINE_API libkline
{
public:
libkline();
~libkline(); //重置内部数据
void Reset(lpErrMsg lp = nullptr);
//错误信息回调
void SetErrMsg(lpErrMsg lp = nullptr); ///共有属性及回调
//设置交易日
void SetTradingDay(const char* pTradingDay, const char* pPreTradingDay); //设置K线周期
void SetCycle(std::vector<int> vecCycle); //启用K线偏移
//bHold:是否独占周期 true则该品种SetCycle置入的周期不起作用
void SetOffsetCycle(const SoffsetKline& ok, bool bHold); //K线更新触发
void SetUpdateTrig(const SoffsetKline& ok, lpTrig p); //K线生成触发
void SetNewTrig(const SoffsetKline& ok, lpTrig p); //设置K线,覆盖式
void SetKline(const SoffsetKline& ok, std::list<Skline>& listKline); //处理历史数据
//大宗商品指数需要依赖基本指数,一旦启用则缓存排序后再处理
void SetDealHistoryData(bool b); //是否处理完前tick
bool IsDealPreTick(); //是否在运行
bool IsRunning(); ///多商品指数
//需要订阅组成品种的所有可交易合约
void SetCommodity(const char* name, const char* abbreviation, int nMultiply, std::vector<SinstrumentProperty>& vec); //设置初始价格
void SetOriginalPrice(const char* abbreviation, const char* pCode, CThostFtdcDepthMarketDataField& last_data, double dPrice); //获取商品指数的乘数 0:代表未找到该品种
int GetCommodityMultiply(const char* abbreviation); //获取新增的指数的初始价格
void GetCommodityInfo(lpCommodityInfo lp); ///单商品
//添加合约属性
void AddVariety(const SinstrumentProperty* p); //设置指数表
bool SetIndexTable(const char* pProductID, CThostFtdcDepthMarketDataField& field); //设置主力
bool SetMainCode(const char* pProductID, const char* pMainCode); //压入实时tick数据
void PushTick(CThostFtdcDepthMarketDataField* pData); //运行
void Run(); //强行停止,缓存的数据都不处理了,立刻退出
void ForceStop(); //安全停止,将缓存的数据都处理完毕,在退出
void SafeStop(); //释放资源
void Release(); //获取K线
//bAll:是否请求所有,如果true,则pInstrumentID和nCycle失效
void GetKline(lpGetKline lp, SoffsetKline* p, bool bAll = false); //获取指数表
//pProductID:rb 空则返回所有
void GetIndex(lpGetIndex lp, const char* pProductID = nullptr); //获取快照
//pExchangeID:SHFE 空则返回所有
void GetShot(lpGetShot lp, const char* pExchangeID = nullptr); //获取指数tick
void GetIndexTick(lpGetIndexTick lp, const char* pInstrumentID = nullptr); //收缩偏移K线
void ShrinkOffsetKline(const SoffsetKline& ok, std::list<Skline>& targetKline,
int nThisCycle, std::list<Skline>& thisKline); //校验偏移k线的最后日期时间
void VerifyOffsetKline(const SoffsetKline& ok, Skline& lastKline); protected:
void* pObj;
}; #endif//LIB_KLINE_H

x64下载链接(debug|release及各版本vs通用):https://files.cnblogs.com/files/rmdmn/libkline.rar

最新文章

  1. 3515 如何调试AT指令、查看拨号模块的打印
  2. Leetcode: Shuffle an Array
  3. Confluence5.1 最新版的安装&amp;破解&amp;汉化
  4. addChildViewController 用法
  5. android调试系列--使用ida pro调试原生程序
  6. hive编程指南--employees表数据定义
  7. UVA Don&amp;#39;t Get Rooked
  8. ACM心路
  9. iOS UIScrollView偏移量属性
  10. [BZOJ1003] [ZJOI2006] 物流运输trans (最短路 &amp; dp)
  11. javascript ES6 新特性之 扩展运算符 三个点 ...
  12. easyUI使用datagrid-detailview.js实现多级级列表嵌套
  13. 移植QT库的问题:QT_INSTALL/include/QtCore/qatomic_arm.h:131: Error: no such instruction: `swpb %al,
  14. Tensflow的targmax函数
  15. js对当前时间的相关操作
  16. Spring的LoadTimeWeaver(代码织入)(转)
  17. Mac逆向--思维导图
  18. ANDROID开机动画分析
  19. redis系列之数据库与缓存数据一致性解决方案
  20. C#中常见的系统内置委托用法详解(抄录)

热门文章

  1. (转)jvm具体gc算法介绍标记整理--标记清除算法
  2. Redis的各个数据的类型基本命令
  3. 一维数组、二维数组——Java
  4. JS中BOM操作知识点
  5. R ggplot学习笔记1
  6. hextorgb
  7. puthon 字典的 .update() 方法
  8. java连接Sqlserver数据库问题总结
  9. ip连接mysql时报不能连接
  10. musql 单表查询