hikyuu2/hikyuu_cpp/hikyuu/StockManager.h

366 lines
11 KiB
C++
Raw Normal View History

2015-01-07 01:26:14 +08:00
/*
* StockManager.h
*
* Created on: 2011-11-9
* Author: fasiondog
*/
#ifndef STOCKMANAGER_H_
#define STOCKMANAGER_H_
#include <mutex>
2021-03-25 00:55:39 +08:00
#include <thread>
#include "hikyuu/utilities/Parameter.h"
#include "hikyuu/utilities/thread/thread.h"
#include "hikyuu/data_driver/DataDriverFactory.h"
2016-04-03 00:08:31 +08:00
#include "Block.h"
2015-01-07 01:26:14 +08:00
#include "MarketInfo.h"
#include "StockTypeInfo.h"
#include "StrategyContext.h"
2015-01-07 01:26:14 +08:00
namespace hku {
typedef vector<string> MarketList;
/**
*
* @ingroup StockManage
*/
class HKU_API StockManager {
public:
/** 获取StockManager单例实例 */
static StockManager& instance();
virtual ~StockManager();
2024-02-26 17:34:02 +08:00
StockManager(const StockManager&) = delete;
StockManager& operator=(const StockManager&) = delete;
2015-01-07 01:26:14 +08:00
/**
*
* @param baseInfoParam
* @param blockParam
* @param kdataParam K线驱动参数
* @param preloadParam
* @param hikyuuParam
* @param context
2015-01-07 01:26:14 +08:00
*/
void init(const Parameter& baseInfoParam, const Parameter& blockParam,
2024-08-29 15:18:18 +08:00
const Parameter& kdataParam, const Parameter& preloadParam,
const Parameter& hikyuuParam,
2021-02-17 19:43:59 +08:00
const StrategyContext& context = StrategyContext({"all"}));
2017-10-13 01:50:11 +08:00
2021-01-29 00:18:01 +08:00
/** 重新加载 */
void reload();
2020-03-01 01:24:55 +08:00
/** 主动退出并释放资源 */
static void quit();
/** 获取基础信息驱动参数 */
2020-12-19 23:57:24 +08:00
const Parameter& getBaseInfoDriverParameter() const;
/** 获取板块驱动参数 */
2020-12-19 23:57:24 +08:00
const Parameter& getBlockDriverParameter() const;
/** 获取 K 线数据驱动参数 */
2020-12-19 23:57:24 +08:00
const Parameter& getKDataDriverParameter() const;
/** 获取预加载参数 */
2020-12-19 23:57:24 +08:00
const Parameter& getPreloadParameter() const;
/** 获取其他参数 */
2020-12-19 23:57:24 +08:00
const Parameter& getHikyuuParameter() const;
/** 获取策略上下文 */
const StrategyContext& getStrategyContext() const;
/** 获取基础信息驱动 */
BaseInfoDriverPtr getBaseInfoDriver() const;
2015-01-07 01:26:14 +08:00
/**
*
* m_config中的tmpdir
*/
string tmpdir() const;
/** 获取数据目录 */
string datadir() const;
2015-01-07 01:26:14 +08:00
/** 获取证券数量 */
size_t size() const;
/** 是否所有数据准备完毕 */
bool dataReady() const;
2015-01-07 01:26:14 +08:00
/**
* "市场简称证券代码"
* @param querystr "sh000001"
* @return Null<Stock>()
*/
2019-08-03 15:14:39 +08:00
Stock getStock(const string& querystr) const;
2015-01-07 01:26:14 +08:00
/** 同 getStock @see getStock */
Stock operator[](const string&) const;
StockList getStockList(
std::function<bool(const Stock&)>&& filter = std::function<bool(const Stock&)>()) const;
2015-01-07 01:26:14 +08:00
/**
*
* @param market
* @return Null<MarketInfo>()
*/
MarketInfo getMarketInfo(const string& market) const;
/**
*
* @param type
* @return Null<StockTypeInf>()
*/
StockTypeInfo getStockTypeInfo(uint32_t type) const;
2015-01-07 01:26:14 +08:00
/** 获取市场简称列表 */
MarketList getAllMarket() const;
2016-04-03 00:08:31 +08:00
/**
*
* @param category
* @param name
* @return
*/
Block getBlock(const string& category, const string& name);
/**
*
* @param category
* @return
*/
2019-08-03 15:14:39 +08:00
BlockList getBlockList(const string& category);
2016-04-03 00:08:31 +08:00
/**
*
* @return
*/
BlockList getBlockList();
/**
*
* @param stk
* @param category
* @return BlockList
*/
BlockList getStockBelongs(const Stock& stk, const string& category);
2024-03-01 17:41:51 +08:00
/**
* "SH"
* @param query
* @param market
* @return DatetimeList
*/
2019-11-10 19:45:57 +08:00
DatetimeList getTradingCalendar(const KQuery& query, const string& market = "SH");
2015-01-07 01:26:14 +08:00
2024-03-01 17:41:51 +08:00
/**
* 10
*/
2024-03-02 03:42:14 +08:00
const ZhBond10List& getZhBond10() const;
2024-03-01 17:41:51 +08:00
2015-01-07 01:26:14 +08:00
/**
*
* @param d
2015-01-07 01:26:14 +08:00
*/
bool isHoliday(const Datetime& d) const;
2015-01-07 01:26:14 +08:00
2024-04-13 17:16:18 +08:00
const string& getHistoryFinanceFieldName(size_t ix) const;
size_t getHistoryFinanceFieldIndex(const string& name) const;
2024-04-14 03:39:45 +08:00
vector<std::pair<size_t, string>> getHistoryFinanceAllFields() const;
2024-04-13 17:16:18 +08:00
2024-04-13 18:05:25 +08:00
vector<HistoryFinanceInfo> getHistoryFinance(const Stock& stk, Datetime start, Datetime end);
2024-04-13 17:16:18 +08:00
/**
* StockStock使用
* @param stock
* @return true | false
*/
bool addStock(const Stock& stock);
/**
* StockManager Stock Stock sm
* @param market_code
*/
void removeStock(const string& market_code);
/**
* CSV文件K线数据StockCSV格式的K线数据时
* @details Stockmarket为TMP
* @param code Stock相同Null<Stock>
* @param day_filename 线CSV文件名
* @param min_filename 线CSV文件名
* @param tick 0.01
* @param tickValue 0.01
* @param precision 2
* @param minTradeNumber 1
* @param maxTradeNumber 1000000
* @return
*/
Stock addTempCsvStock(const string& code, const string& day_filename,
const string& min_filename, price_t tick = 0.01, price_t tickValue = 0.01,
int precision = 2, size_t minTradeNumber = 1,
2019-11-10 19:45:57 +08:00
size_t maxTradeNumber = 1000000);
/**
* Stock
* @param code
*/
void removeTempCsvStock(const string& code);
2021-03-25 00:55:39 +08:00
/**
* 线id Strategy 线
*/
std::thread::id thread_id() const {
return m_thread_id;
}
/** 仅由程序退出使使用!!! */
ThreadPool* getLoadTaskGroup() {
return m_load_tg.get();
}
2015-01-07 01:26:14 +08:00
public:
2016-04-03 00:08:31 +08:00
typedef StockMapIterator const_iterator;
2019-11-10 19:45:57 +08:00
const_iterator begin() const {
return m_stockDict.begin();
}
const_iterator end() const {
return m_stockDict.end();
}
2015-01-07 01:26:14 +08:00
private:
2024-08-30 14:31:08 +08:00
/* 加载全部数据 */
void loadData();
2024-01-04 15:41:19 +08:00
/* 加载 K线数据至缓存 */
void loadAllKData();
/* 加载节假日信息 */
void loadAllHolidays();
/* 初始化时,添加市场信息 */
void loadAllMarketInfos();
/* 初始化时,添加证券类型信息 */
void loadAllStockTypeInfo();
/* 加载所有证券 */
void loadAllStocks();
/* 加载所有权息数据 */
void loadAllStockWeights();
2024-03-01 17:41:51 +08:00
/** 加载10年期中国国债收益率数据 */
void loadAllZhBond10();
2024-04-13 17:16:18 +08:00
/** 加载历史财经字段索引 */
void loadHistoryFinanceField();
2015-01-07 01:26:14 +08:00
private:
StockManager();
2015-01-07 01:26:14 +08:00
private:
2020-04-03 02:05:27 +08:00
static StockManager* m_sm;
2024-03-11 19:40:40 +08:00
std::atomic_bool m_initializing;
std::atomic_bool m_data_ready; // 用于指示是否所有数据准备完毕
2021-03-25 00:55:39 +08:00
std::thread::id m_thread_id; // 记录线程id用于判断Stratege是以独立进程方式还是线程方式运行
2017-10-13 01:50:11 +08:00
string m_tmpdir;
string m_datadir;
BaseInfoDriverPtr m_baseInfoDriver;
BlockInfoDriverPtr m_blockDriver;
2016-04-03 00:08:31 +08:00
StockMapIterator::stock_map_t m_stockDict; // SH000001 -> stock
2021-01-26 22:58:19 +08:00
std::mutex* m_stockDict_mutex;
2016-04-03 00:08:31 +08:00
typedef unordered_map<string, MarketInfo> MarketInfoMap;
mutable MarketInfoMap m_marketInfoDict;
std::mutex* m_marketInfoDict_mutex;
2016-04-03 00:08:31 +08:00
typedef unordered_map<uint32_t, StockTypeInfo> StockTypeInfoMap;
mutable StockTypeInfoMap m_stockTypeInfo;
std::mutex* m_stockTypeInfo_mutex;
std::unordered_set<Datetime> m_holidays; // 节假日
std::mutex* m_holidays_mutex;
2024-03-01 17:41:51 +08:00
ZhBond10List m_zh_bond10; // 10年期中国国债收益率数据
2024-04-13 17:16:18 +08:00
unordered_map<string, size_t> m_field_name_to_ix; // 财经字段名称到字段索引映射
unordered_map<size_t, string> m_field_ix_to_name; // 财经字段索引到字段名称映射
Parameter m_baseInfoDriverParam;
Parameter m_blockDriverParam;
Parameter m_kdataDriverParam;
Parameter m_preloadParam;
Parameter m_hikyuuParam;
StrategyContext m_context;
std::unique_ptr<ThreadPool> m_load_tg; // 异步数据加载辅助线程组
2015-01-07 01:26:14 +08:00
};
inline size_t StockManager::size() const {
return m_stockDict.size();
}
inline bool StockManager::dataReady() const {
return m_data_ready;
}
2015-01-07 01:26:14 +08:00
inline Stock StockManager::operator[](const string& query) const {
return getStock(query);
}
inline bool StockManager::isHoliday(const Datetime& d) const {
return m_holidays.count(d);
}
2020-12-19 23:57:24 +08:00
inline const Parameter& StockManager::getBaseInfoDriverParameter() const {
return m_baseInfoDriverParam;
}
2020-12-19 23:57:24 +08:00
inline const Parameter& StockManager::getBlockDriverParameter() const {
return m_blockDriverParam;
}
2020-12-19 23:57:24 +08:00
inline const Parameter& StockManager::getKDataDriverParameter() const {
return m_kdataDriverParam;
}
2020-12-19 23:57:24 +08:00
inline const Parameter& StockManager::getPreloadParameter() const {
return m_preloadParam;
}
2020-12-19 23:57:24 +08:00
inline const Parameter& StockManager::getHikyuuParameter() const {
return m_hikyuuParam;
}
inline const StrategyContext& StockManager::getStrategyContext() const {
return m_context;
}
inline BaseInfoDriverPtr StockManager::getBaseInfoDriver() const {
return m_baseInfoDriver;
}
2024-04-13 17:16:18 +08:00
inline const string& StockManager::getHistoryFinanceFieldName(size_t ix) const {
return m_field_ix_to_name.at(ix);
}
inline size_t StockManager::getHistoryFinanceFieldIndex(const string& name) const {
return m_field_name_to_ix.at(name);
}
2024-04-13 18:05:25 +08:00
inline vector<HistoryFinanceInfo> StockManager::getHistoryFinance(const Stock& stk, Datetime start,
Datetime end) {
2024-04-13 17:16:18 +08:00
return m_baseInfoDriver->getHistoryFinance(stk.market(), stk.code(), start, end);
}
2019-11-10 19:45:57 +08:00
} // namespace hku
2015-01-07 01:26:14 +08:00
#endif /* STOCKMANAGER_H_ */