概述
WonderTrader中已实现的有CtaMocker、HftMocker、SelMocker、ExecMocker和UftMocker(截止到202312月),从整个回测的结构看,Mocker是在策略和数据回放(HisDataReplayer)之间,Mocker负责管理策略。以下以HftMocker进行说明。
Mocker组成
class HftMocker : public IDataSink, public IHftStraCtx
- 继承IDataSink,为了HisDataReplayer可以使用其接口,操作Mocker,或者说是通知Mocker,也可以说是将数据和信号发给Mocker。在初始化时会把Mocker注册到HisDataReplayer里面去。
replayer.register_sink(mocker, stra_id);
//来自IDataSink的接口 virtual void handle_tick(const char* stdCode, WTSTickData* curTick, uint32_t pxType) override; virtual void handle_order_queue(const char* stdCode, WTSOrdQueData* curOrdQue) override; virtual void handle_order_detail(const char* stdCode, WTSOrdDtlData* curOrdDtl) override; virtual void handle_transaction(const char* stdCode, WTSTransData* curTrans) override; virtual void handle_bar_close(const char* stdCode, const char* period, uint32_t times, WTSBarStruct* newBar) override; virtual void handle_schedule(uint32_t uDate, uint32_t uTime) override; virtual void handle_init() override; virtual void handle_session_begin(uint32_t curTDate) override; virtual void handle_session_end(uint32_t curTDate) override; virtual void handle_replay_done() override; virtual void on_tick_updated(const char* stdCode, WTSTickData* newTick) override; virtual void on_ordque_updated(const char* stdCode, WTSOrdQueData* newOrdQue) override; virtual void on_orddtl_updated(const char* stdCode, WTSOrdDtlData* newOrdDtl) override; virtual void on_trans_updated(const char* stdCode, WTSTransData* newTrans) override;
- 继承IHftStraCtx,个人理解为策略的上下文,存放一些策略常用信息,策略需要一些来自HisDataReplayer的数据,也是通过这些接口获取。接口比较多就不列举,可以见src\Includes\IHftStraCtx.h的定义
Mocker创建与初始化
HftMocker* mocker = new HftMocker(&replayer, "hft");
mocker->init_hft_factory(cfg->get("hft"));
const char* stra_id = cfg->get("hft")->get("strategy")->getCString("id");
replayer.register_sink(mocker, stra_id);
HFT策略配置
# HFT策略配置,当mocker为hft时会读取该配置项
hft:
module: WtHftStraFact.dll # 模块名,linux下为xxxx.so
strategy: # 策略信息
id: hft_if # 策略ID,自定义的
name: SimpleHft # 策略名,要和factory中的匹配
params: # 策略初始化参数,这个根据策略的需要提供
code: CFFEX.IF.HOT
second: 5
freq: 10
offset: 0
stock: false
在init_hft_factory方法中,会创建策略工厂,再通过策略工厂创建对应的策略(即创建WtHftStraDemo对象),并使用配置中的params初始化策略,示例代码如下
// 创建策略工厂
FuncCreateHftStraFact creator = (FuncCreateHftStraFact)DLLHelper::get_symbol(hInst, "createStrategyFact");
// 使用策略工厂创建策略,并初始化策略
_strategy = _factory._fact->createStrategy(cfgStra->getCString("name"), cfgStra->getCString("id"));
_strategy->init(cfgStra->get("params"));
// ...
// 初始化策略
bool WtHftStraDemo::init(WTSVariant* cfg)
{
//这里演示一下外部传入参数的获取
_code = cfg->getCString("code");
_secs = cfg->getUInt32("second");
_freq = cfg->getUInt32("freq");
_offset = cfg->getUInt32("offset");
_reserved = cfg->getDouble("reserve");
_stock = cfg->getBoolean("stock");
_unit = _stock ? 100 : 1;
return true;
}