(二)回测框架之策略Mocker

概述

WonderTrader中已实现的有CtaMocker、HftMocker、SelMocker、ExecMocker和UftMocker(截止到202312月),从整个回测的结构看,Mocker是在策略和数据回放(HisDataReplayer)之间,Mocker负责管理策略。以下以HftMocker进行说明。

Mocker组成

class HftMocker : public IDataSink, public IHftStraCtx
  1. 继承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;
    
  2. 继承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;
}

你可能感兴趣的:(WonderTrader解析,服务器,linux,c++)