HFT回测进阶2: 源码解析
source: wtcpp/folder01/file03.md
建议先阅读 “HFT回测进阶1: 源码解析”
请使用最新版0.9dev源码(20220303)
本文主要解决问题
- 回测如何加载数据
- 回测如何加载策略
replayer.prepare()
WtBtRunner.cpp 文件中两句代码最重要
replayer.prepare();
replayer.run();
关键代码 handle_init()
进入 bool HisDataReplayer::prepare()有一句代码最重要
_listener->handle_init();
数据加载路径
我们通过打断点逐步查看他的执行路径
1.进入策略文件 HftMocker::handle_init() -> HftMocker::on_init() -> WtHftStraDemo::on_init
2.加载tick数据 WtHftStraDemo::on_init -> HftMocker::stra_get_ticks -> HisDataReplayer::get_tick_slice -> HisDataReplayer::checkTicks -> HisDataReplayer::cacheRawTicksFromCSV(这里已经开始从csv文件加载tick数据了)
- 此处如果存在文件 "./storage/bin/ticks/CUSTOM.FX.EURUSD_tick_20220221.dsb" 则加载dsb文件, 否则加载 "./storage/csv/ticks/CUSTOM.FX.EURUSD_tick_20220221.csv" 并自动转存储为 "./storage/bin/ticks/CUSTOM.FX.EURUSD_tick_20220221.dsb"
这段csv转dsb逻辑似乎有点问题, csv数据列和tick结构体不好对齐, 最好还是按照文章 “数据压缩/解压” 自己将csv转dsb并放在对应位置
继续往下执行直到再次进入 WtHftStraDemo.cpp
3.加载bar数据 WtHftStraDemo::on_init -> ` HftMocker::stra_get_bars -> HisDataReplayer::get_kline_slice -> HisDataReplayer::cacheRawBarsFromCSV`
- 此处如果存在文件 "./storage/his/min1/CUSTOM/EURUSD.dsb" 则直接加载dsb文件, 否则加载 "./storage/csv/CUSTOM.FX.EURUSD_m1.csv" 并自动转存储为 "./storage/his/min1/CUSTOM/EURUSD.dsb"
继续往下执行直到再次进入 WtHftStraDemo.cpp
4.主动订阅tick数据(也比较关键, 策略中记得订阅) WtHftStraDemo::on_init -> HftMocker::stra_sub_ticks -> HisDataReplayer::sub_tick
replayer.run()
只有一句代码最重要
if(!_main_key.empty())
{
//如果订阅了K线,则按照主K线进行回放
run_by_bars(bNeedDump);
}
主K回放
我们通过打断点逐步查看他的执行路径
1.进入策略文件on_session_begin HisDataReplayer::run_by_bars -> HftMocker::handle_session_begin -> HftMocker::on_session_begin -> _strategy->on_session_begin (策略文件没有实现该方法, 到头了)
继续往下执行直到再次进入HisDataReplayer.cpp
2.进入策略文件on_tick HisDataReplayer::run_by_bars -> HisDataReplayer::replayHftDatas -> HftMocker::handle_tick -> HftMocker::on_tick -> HftMocker::on_tick_updated -> WtHftStraDemo::on_tick
继续往下执行直到第一阶段tick数据回放完毕并再次进入HisDataReplayer::run_by_bars 3.进入策略文件on_bar HisDataReplayer::run_by_bars -> HisDataReplayer::onMinuteEnd -> HftMocker::handle_bar_close -> HftMocker::on_bar -> WtHftStraDemo::on_bar
4.逻辑梳理完毕. 等待数据回放完毕即可