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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM