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);//是否處理完前tickbool 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);//獲取指數tickvoid 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總結
- 上一篇: 视频教程-SAP S4 HANA CO
- 下一篇: 全球云观察|预见2021:云计算发展十大