zoukankan      html  css  js  c++  java
  • k线生成模块

    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

  • 相关阅读:
    【POJ 2923】Relocation(状压DP+DP)
    【HDU 2955】Robberies(DP)
    【POJ 2250】Compromise(最长公共子序列LCS)
    【URAL 1917】Titan Ruins: Deadly Accuracy(DP)
    【POJ 1273】Drainage Ditches(网络流)
    HDU2896 病毒侵袭[AC自动机]
    1516. 棋盘上的车[组合数学][状态压缩]
    [HAOI2012] 容易题[母函数]
    [HAOI2012] 高速公路
    [HAOI2012]Road
  • 原文地址:https://www.cnblogs.com/rmdmn/p/11212058.html
Copyright © 2011-2022 走看看