IDataReader.h
source: wtcpp/folder98/folder01/folder3/folder1/file04.md
/*!
* \file IDataReader.h
* \project WonderTrader
*
* \author Wesley
* \date 2020/03/30
*
* \brief
*/
#pragma once
#include <stdint.h>
#include "../Includes/WTSMarcos.h"
#include "../Includes/WTSTypes.h"
NS_WTP_BEGIN
class WTSKlineData;
class WTSKlineSlice;
class WTSTickSlice;
class WTSOrdQueSlice;
class WTSOrdDtlSlice;
class WTSTransSlice;
struct WTSBarStruct;
class WTSVariant;
class IBaseDataMgr;
class IHotMgr;
/*
* @brief 数据读取模块回调接口
* @details 主要用于数据读取模块向调用模块回调
*/
class IDataReaderSink
{
public:
/*
* @brief K线闭合事件回调
*
* @param stdCode 标准品种代码,如SSE.600000,SHFE.au.2005
* @param period K线周期
* @param newBar 闭合的K线结构指针
*/
virtual void on_bar(const char* stdCode, WTSKlinePeriod period, WTSBarStruct* newBar) = 0;
/*
* @brief 所有缓存的K线全部更新的事件回调
*
* @param updateTime K线更新时间,精确到分钟,如202004101500
*/
virtual void on_all_bar_updated(uint32_t updateTime) = 0;
/*
* @brief 获取基础数据管理接口指针
*/
virtual IBaseDataMgr* get_basedata_mgr() = 0;
/*
* @brief 获取主力切换规则管理接口指针
*/
virtual IHotMgr* get_hot_mgr() = 0;
/*
* @brief 获取当前日期,格式图20100410
*/
virtual uint32_t get_date() = 0;
/*
* @brief 获取当前1分钟线的时间
* @details 这里的分钟线时间是处理过的1分钟线时间,如现在是9:00:32秒,真实事件为0900,但是对应的1分钟线时间为0901
*/
virtual uint32_t get_min_time() = 0;
/*
* @brief 获取当前的秒数,精确到毫秒,如37,500
*/
virtual uint32_t get_secs() = 0;
/*
* @brief 输出数据读取模块的日志
*/
virtual void reader_log(WTSLogLevel ll, const char* message) = 0;
};
/*
* 历史数据加载器的回调函数
* @obj 回传用的,原样返回即可
* @key 数据缓存的key
* @bars K线数据
* @count K线条数
* @factor 复权因子,最新的复权因子,如果是后复权,则factor不为1.0,如果是前复权,则factor必须为1.0
*/
typedef void(*FuncReadBars)(void* obj, WTSBarStruct* bars, uint32_t count);
/*
* 加载复权因子回调
* @obj 回传用的,原样返回即可
* @stdCode 合约代码
* @dates
*/
typedef void(*FuncReadFactors)(void* obj, const char* stdCode, uint32_t* dates, double* factors, uint32_t count);
/*
* 历史数据加载器
*/
class IHisDataLoader
{
public:
/*
* 加载最终历史K线数据
* 和loadRawHisBars的区别在于,loadFinalHisBars,系统认为是最终所需数据,不在进行加工,例如复权数据、主力合约数据
* loadRawHisBars是加载未加工的原始数据的接口
*
* @obj 回传用的,原样返回即可
* @key 数据缓存的key
* @stdCode 合约代码
* @period K线周期
* @cb 回调函数
*/
virtual bool loadFinalHisBars(void* obj, const char* stdCode, WTSKlinePeriod period, FuncReadBars cb) = 0;
/*
* 加载原始历史K线数据
*
* @obj 回传用的,原样返回即可
* @key 数据缓存的key
* @stdCode 合约代码
* @period K线周期
* @cb 回调函数
*/
virtual bool loadRawHisBars(void* obj, const char* stdCode, WTSKlinePeriod period, FuncReadBars cb) = 0;
/*
* 加载全部除权因子
*/
virtual bool loadAllAdjFactors(void* obj, FuncReadFactors cb) = 0;
/*
* 加指定合约除权因子
*/
virtual bool loadAdjFactors(void* obj, const char* stdCode, FuncReadFactors cb) = 0;
};
/*
* @brief 数据读取接口
*
* 向核心模块提供行情数据(tick、K线)读取接口
*/
class IDataReader
{
public:
IDataReader() :_sink(NULL) {}
virtual ~IDataReader(){}
public:
/*
* @brief 初始化数据读取模块
*
* @param cfg 模块配置项
* @param sink 模块回调接口
*/
virtual void init(WTSVariant* cfg, IDataReaderSink* sink, IHisDataLoader* loader = NULL) { _sink = sink; _loader = loader; }
/*
* @brief 分钟线闭合事件处理接口
*
* @param uDate 闭合的分钟线日期,如20200410,这里不是交易日
* @param uTime 闭合的分钟线的分钟时间,如1115
* @param endTDate 如果闭合的分钟线是交易日最后一条分钟线,则endTDate为当前交易日,如20200410,其他情况为0
*/
virtual void onMinuteEnd(uint32_t uDate, uint32_t uTime, uint32_t endTDate = 0) = 0;
/*
* @brief 读取tick数据切片
* @details 切片不会复制数据,只把缓存中的数据指针传递出来,所以叫做切片
*
* @param stdCode 标准品种代码,如SSE.600000,SHFE.au.2005
* @param count 要读取的tick条数
* @param etime 结束时间,精确到毫秒,格式如yyyyMMddhhmmssmmm,如果要读取到最后一条,etime为0,默认为0
*/
virtual WTSTickSlice* readTickSlice(const char* stdCode, uint32_t count, uint64_t etime = 0) = 0;
/*
* @brief 读取逐笔委托数据切片
* @details 切片不会复制数据,只把缓存中的数据指针传递出来,所以叫做切片
*
* @param stdCode 标准品种代码,如SSE.600000,SHFE.au.2005
* @param count 要读取的tick条数
* @param etime 结束时间,精确到毫秒,格式如yyyyMMddhhmmssmmm,如果要读取到最后一条,etime为0,默认为0
*/
virtual WTSOrdDtlSlice* readOrdDtlSlice(const char* stdCode, uint32_t count, uint64_t etime = 0) { return NULL; }
/*
* @brief 读取委托队列数据切片
* @details 切片不会复制数据,只把缓存中的数据指针传递出来,所以叫做切片
*
* @param stdCode 标准品种代码,如SSE.600000,SHFE.au.2005
* @param count 要读取的tick条数
* @param etime 结束时间,精确到毫秒,格式如yyyyMMddhhmmssmmm,如果要读取到最后一条,etime为0,默认为0
*/
virtual WTSOrdQueSlice* readOrdQueSlice(const char* stdCode, uint32_t count, uint64_t etime = 0) { return NULL; }
/*
* @brief 读取逐笔成交数据切片
* @details 切片不会复制数据,只把缓存中的数据指针传递出来,所以叫做切片
*
* @param stdCode 标准品种代码,如SSE.600000,SHFE.au.2005
* @param count 要读取的tick条数
* @param etime 结束时间,精确到毫秒,格式如yyyyMMddhhmmssmmm,如果要读取到最后一条,etime为0,默认为0
*/
virtual WTSTransSlice* readTransSlice(const char* stdCode, uint32_t count, uint64_t etime = 0) { return NULL; }
/*
* @brief 读取K线序列,并返回一个存储容器类
* @details 切片不会复制数据,只把缓存中的数据指针传递出来,所以叫做切片
*
* @param stdCode 标准品种代码,如SSE.600000,SHFE.au.2005
* @param period K线周期
* @param count 要读取的K线条数
* @param etime 结束时间,格式yyyyMMddhhmm
*/
virtual WTSKlineSlice* readKlineSlice(const char* stdCode, WTSKlinePeriod period, uint32_t count, uint64_t etime = 0) = 0;
/*
* @brief 获取个股指定日期的复权因子
*
* @param stdCode 标准品种代码,如SSE.600000
* @param date 指定日期,格式yyyyMMdd,默认为0,为0则按当前日期处理
*/
virtual double getAdjFactorByDate(const char* stdCode, uint32_t date = 0) { return 1.0; }
protected:
IDataReaderSink* _sink;
IHisDataLoader* _loader;
};
//创建数据存储对象
typedef IDataReader* (*FuncCreateDataReader)();
//删除数据存储对象
typedef void(*FuncDeleteDataReader)(IDataReader* store);
NS_WTP_END