API索引

ThunderTrader C++ SDK 接口、函数与示例

Previous page Next page

接口目录:

binary_serializable_t

头文件:serializable.h;命名空间:thunder。

二进制序列化契约,由需要存档的对象实现。写入和读取字段的顺序、类型必须一致。

binary_serialize_to

virtual void binary_serialize_to(boost::archive::binary_oarchive&);

通过 Boost binary 归档写入对象。调用方创建归档并保证流可用;实现类负责匹配字段顺序和版本。

示例:

void demo(binary_serializable_t &api, std::ostream &stream) {
    boost::archive::binary_oarchive archive(stream);
    api.binary_serialize_to(archive);
}

binary_deserialize_from

virtual void binary_deserialize_from(boost::archive::binary_iarchive&);

通过 Boost binary 归档读取对象。调用方创建归档并保证流可用;实现类负责匹配字段顺序和版本。

示例:

void demo(binary_serializable_t &api, std::istream &stream) {
    boost::archive::binary_iarchive archive(stream);
    api.binary_deserialize_from(archive);
}

commission_supplier_t

头文件:commission_interface.h;命名空间:thunder。

手续费供应接口,可作为交易插件的附加能力。CTP 实现会查询费率;当前 IBKR 交易插件直接返回 false,调用方必须处理不可用情况。

on_query_commission

virtual bool on_query_commission(const instrument_unique_name_t&, commission_t&);

由供应方查询合约手续费,返回 true 时输出有效。CTP 查询包含异步请求和等待,避免假定它是无阻塞读取。

示例:

void demo(commission_supplier_t &api, const instrument_unique_name_t &name) {
    commission_t commission;
    if (api.on_query_commission(name, commission)) {
        const auto ratio = commission.open_ratio_by_money();
        (void)ratio;
    }
}

dashboard_meta_context_t

头文件:strategy/dashboard_meta_context.h;命名空间:thunder::strategy。

框架传给 strategy_t::get_dashboard_meta 的上下文,用于构造仪表盘元数据。

继承接口:logger_t、metric_t、environment_context_t。继承函数的参数及示例见对应基类。

此类没有新增业务函数。以下示例展示通过该阶段上下文调用继承的日志函数;指标与环境变量用法参见基类。

void demo(dashboard_meta_context_t &context) {
    context.logging(severity_levels::debug, "进入当前阶段");
}

data_collector_plugin_context_t

头文件:data_center/data_collector_plugin_context.h;命名空间:thunder::data_collector。

DataCenter 提供给采集插件的上下文,用于上传合约资料以及记录日志和指标。

继承接口:logger_t、metric_t。继承函数的参数及示例见对应基类。

on_instrument_data

virtual void on_instrument_data(const instrument_t&);

采集插件向 DataCenter 上报完整合约资料;实参由通道转换得到。

示例:

void demo(data_collector_plugin_context_t &api, const instrument_t &instrument) {
    api.on_instrument_data(instrument);
}

data_collector_plugin_t

头文件:data_center/data_collector_plugin.h;命名空间:thunder::data_collector。

DataCenter 采集插件契约。宿主依次调用 initialization、install,运行期间可调用 update_configuration,最后调用 uninstall。初始化成功或安装成功不等于远端已经登录。实现类用 COLLECTOR_PLUGIN_EXPORT 导出。

get_name

virtual name_t get_name();

返回采集插件名称。

示例:

void demo(data_collector_plugin_t &api) {
    const auto name = api.get_name();
    (void)name;
}

get_description

virtual description_t get_description();

返回说明文本。

示例:

void demo(data_collector_plugin_t &api) {
    const auto description = api.get_description();
    (void)description;
}

get_configuration_fields

virtual fields_set_t get_configuration_fields();

返回采集插件初始化字段及说明;配置值统一通过字符串映射传入。IBKR 采集器使用 host、port、client_id;CTP 使用前置地址和账户等字段。

示例:

void demo(data_collector_plugin_t &api) {
    const auto fields = api.get_configuration_fields();
    for (const auto &[name, description] : fields) {
        (void)name; (void)description;
    }
}

initialization

virtual bool initialization(const configuration_t &, data_collector_plugin_context_t*, std::weak_ptr<tick_sink_t>);

安装前初始化。传入配置、借用的插件上下文和行情接收端弱引用;返回 false 时不应继续安装。示例配置针对 IBKR,CTP 应按其字段说明准备配置。

示例:

void demo(data_collector_plugin_t &api, data_collector_plugin_context_t &context, std::weak_ptr<tick_sink_t> sink) {
    data_collector_plugin_t::configuration_t configuration{
        {"host", "127.0.0.1"}, {"port", "7497"}, {"client_id", "1"}
    };
    const bool ready = api.initialization(configuration, &context, sink);
    (void)ready;
}

install

virtual bool install();

初始化成功后启动采集,返回安装结果;远端连接和登录可能仍在异步进行。

示例:

void demo(data_collector_plugin_t &api) {
    const bool installed = api.install();
    (void)installed;
}

uninstall

virtual void uninstall();

停止采集并释放线程、连接及定时器。应先停止异步回调,再释放上下文。

示例:

void demo(data_collector_plugin_t &api) {
    api.uninstall();
}

update_configuration

virtual void update_configuration(const collect_configuration_t &);

热更新采集范围,参数是 JSON 文本字符串,格式由插件定义。CTP 当前接受正则表达式数组,IBKR 接受含 instruments 数组的对象;不是 initialization 的账户配置映射。下面两个函数分别针对相应插件,不应对同一实例混用。

示例:

void demo(data_collector_plugin_t &api) {
    api.update_configuration(R"(["rb.*", "ag.*"])");
}

// 仅对 IBKR 采集器:此配置表示最新合约集合为空。
void demo_ibkr(data_collector_plugin_t &api) {
    api.update_configuration(R"({"instruments":[]})");
}

deployment_context_t

头文件:strategy/deployment_context.h;命名空间:thunder::strategy。

部署时由框架提供,用于查询交易槽、合约属性并恢复保存点。strategy_arbitrage/spi.cpp 在 on_deployment 中读取价格步长和合约乘数。

继承接口:logger_t、metric_t、environment_context_t、strategy_meta_context_t、strategy_state_manager_t、parameter_access_context_t、position_access_context_t。继承函数的参数及示例见对应基类。

get_slot_count

virtual size_t get_slot_count();

返回部署的交易槽数量;交易槽参数应对应已配置的合约。

示例:

void demo(deployment_context_t &api) {
    const size_t count = api.get_slot_count();
    (void)count;
}

get_price_tick

virtual ratio_t get_price_tick(trade_slot_t);

返回交易槽合约的最小价格变动单位。

示例:

void demo(deployment_context_t &api) {
    const ratio_t step = api.get_price_tick(0);
    (void)step;
}

get_volume_multiple

virtual size_t get_volume_multiple(trade_slot_t);

返回交易槽的合约乘数。套利策略将乘数保存在 uint_vector_state 中用于金额计算。

示例:

void demo(deployment_context_t &api) {
    const size_t multiplier = api.get_volume_multiple(0);
    (void)multiplier;
}

get_margin_ratio

virtual bool get_margin_ratio(trade_slot_t, double &long_position, double &short_position);

查询多头、空头保证金比例,经引用参数输出;返回 false 时不使用输出。

示例:

void demo(deployment_context_t &api) {
    double long_ratio = 0.0, short_ratio = 0.0;
    if (api.get_margin_ratio(0, long_ratio, short_ratio)) {
        const double ratio = long_ratio;
        (void)ratio;
    }
}

query_instrument

virtual bool query_instrument(trade_slot_t, instrument_t &);

按交易槽查询合约资料。成功时输出 instrument_t,否则返回 false。

示例:

void demo(deployment_context_t &api) {
    instrument_t instrument{};
    if (api.query_instrument(0, instrument)) {
        const auto name = instrument.unique_name;
        (void)name;
    }
}

get_user_defined_savepoint

virtual bool get_user_defined_savepoint(strategy_user_defined_savepoint_t&);

读取策略自定义保存点字符串。与 strategy_t::on_user_defined_savepoint 配套;解码格式由策略约定。

示例:

void demo(deployment_context_t &api) {
    strategy_user_defined_savepoint_t payload;
    if (api.get_user_defined_savepoint(payload)) {
        // 本示例约定保存点为字符串版本号。
        const bool version_one = payload == "v1";
        (void)version_one;
    }
}

get_currency_unit

virtual std::optional<currency_unit_t> get_currency_unit(trade_slot_t);

返回可选的币值单位比例;无值时不能直接解引用。

示例:

void demo(deployment_context_t &api) {
    if (const auto unit = api.get_currency_unit(0)) {
        const auto numerator = unit->numerator();
        const auto denominator = unit->denominator();
        (void)numerator; (void)denominator;
    }
}

description_meta_context_t

头文件:strategy/description_meta_context.h;命名空间:thunder::strategy。

框架传给 strategy_t::get_description 的上下文。

继承接口:logger_t、metric_t、environment_context_t。继承函数的参数及示例见对应基类。

此类没有新增业务函数。以下示例展示通过该阶段上下文调用继承的日志函数;指标与环境变量用法参见基类。

void demo(description_meta_context_t &context) {
    context.logging(severity_levels::debug, "进入当前阶段");
}

environment_context_t

头文件:strategy/environment_context.h;命名空间:thunder::strategy。

读取策略环境变量的基础接口;返回字符串映射的只读引用。

get_environment_variables

virtual const std::map<std::string, std::string> & get_environment_variables();

返回环境变量的只读映射引用;先检查键是否存在。

示例:

void demo(environment_context_t &api) {
    const auto &env = api.get_environment_variables();
    if (auto it = env.find("MODE"); it != env.end()) {
        const std::string mode = it->second;
        (void)mode;
    }
}

exit_context_t

头文件:strategy/exit_context.h;命名空间:thunder::strategy。

框架传给 strategy_t::on_exit 的退出阶段上下文。

继承接口:logger_t、metric_t、environment_context_t。继承函数的参数及示例见对应基类。

此类没有新增业务函数。以下示例展示通过该阶段上下文调用继承的日志函数;指标与环境变量用法参见基类。

void demo(exit_context_t &context) {
    context.logging(severity_levels::debug, "进入当前阶段");
}

initialization_context_t

头文件:strategy/initialization_context.h;命名空间:thunder::strategy。

策略初始化阶段上下文,可判断是否从归档加载。

继承接口:logger_t、metric_t、environment_context_t、strategy_meta_context_t。继承函数的参数及示例见对应基类。

此类没有新增业务函数。以下示例展示通过该阶段上下文调用继承的日志函数;指标与环境变量用法参见基类。

void demo(initialization_context_t &context) {
    context.logging(severity_levels::debug, "进入当前阶段");
}

instrument_configuration_supplier_t

头文件:source/instrument_configuration_supplier.h;命名空间:thunder。

按合约唯一名称提供合约配置的查询契约。

get_instrument_configuration

virtual bool get_instrument_configuration(const instrument_unique_name_t&, instrument_t&);

按合约唯一名称查询配置,返回 true 时输出有效。

示例:

void demo(instrument_configuration_supplier_t &api, const instrument_unique_name_t &name) {
    instrument_t instrument{};
    if (api.get_instrument_configuration(name, instrument)) {
        const auto step = instrument.price_tick;
        (void)step;
    }
}

logger_t

头文件:logger.h;命名空间:thunder。

框架提供的日志接口,采用 printf 风格的变参格式。

logging

virtual void logging(severity_levels, const char *, ...);

写入指定级别的日志。格式串和实参类型必须匹配;动态文本用 %s 传递。

示例:

void demo(logger_t &api) {
    api.logging(severity_levels::info, "合约=%s 最新价=%.2f", "demo", 100.0);
}

market_data_source_context_t

头文件:source/market_data_source_context.h;命名空间:thunder。

引擎提供给行情源的回调接口。行情插件将转换后的 tick 所有权交给引擎。

继承接口:metric_t。继承函数的参数及示例见对应基类。

on_tick_data

virtual void on_tick_data(std::unique_ptr<tick_t>);

行情插件向引擎提交 tick。unique_ptr 按值传递,调用后原指针不再拥有对象。

示例:

void demo(market_data_source_context_t &api, const tick_t &sample) {
    auto tick = std::make_unique<tick_t>(sample);
    api.on_tick_data(std::move(tick));
}

market_data_source_plugin_t

头文件:source/market_data_source_plugin.h;命名空间:thunder。

行情源插件契约。宿主初始化插件并推送完整订阅集合;插件负责维护订阅差异与连接,在卸载时释放资源。实现类用 SOURCE_PLUGIN_EXPORT 导出。

继承接口:source_plugin_t。继承函数的参数及示例见对应基类。

market_data_source_initialization

virtual void market_data_source_initialization(source_plugin_context_t *, market_data_source_context_t *);

宿主传入公共上下文和行情上下文。插件保存借用指针、读取配置并启动连接流程,指针寿命由宿主管理。

示例:

void demo(market_data_source_plugin_t &api, source_plugin_context_t &source, market_data_source_context_t &market) {
    api.market_data_source_initialization(&source, &market);
}

market_data_source_on_update_subscribed_instruments_list

virtual void market_data_source_on_update_subscribed_instruments_list(const std::set<instrument_unique_name_t> &);

接收最新的完整订阅集合,不是仅新增的合约。IBKR 实现转换集合后调用订阅更新;传空集合表示最新列表为空。

示例:

void demo(market_data_source_plugin_t &api, const std::set<instrument_unique_name_t> &instruments) {
    api.market_data_source_on_update_subscribed_instruments_list(instruments);
}

market_data_source_is_subscribing_instruments

virtual bool market_data_source_is_subscribing_instruments();

返回当前是否仍有订阅;为 true 时引擎拒绝移除该源。

示例:

void demo(market_data_source_plugin_t &api) {
    const bool subscribed = api.market_data_source_is_subscribing_instruments();
    (void)subscribed;
}

market_data_source_unload

virtual void market_data_source_unload();

卸载行情源,结束订阅、连接及后台任务;实现应保证资源释放后不再调用借用的宿主上下文。

示例:

void demo(market_data_source_plugin_t &api) {
    api.market_data_source_unload();
}

metric_t

头文件:metric.h;命名空间:thunder。

带标签的指标接口。store、counter、scalar 的名称与参数由 SDK 定义;存储、聚合和采样细节取决于宿主实现。IBKR 和 CTP 采集器使用 counter 上报一段时间内累计的 tick 数。

store

virtual void store(const metric_name_t&, const metric_value_t&, const metric_tags_t&);

记录带标签的指标值。本例记录最新价。

示例:

void demo(metric_t &api) {
    api.store("last_price", 100.0, {{"slot", "0"}});
}

counter

virtual void counter(const metric_name_t&, const metric_value_t&, const metric_tags_t&);

上报计数指标。本例上报本批次处理的 12 条行情。

示例:

void demo(metric_t &api) {
    api.counter("tick_count", 12.0, {{"source", "demo"}});
}

scalar

virtual void scalar(const metric_name_t&, const metric_value_t&, const metric_tags_t&);

上报标量指标。本例记录当前连接数;具体展示方式由宿主决定。

示例:

void demo(metric_t &api) {
    api.scalar("connections", 1.0, {{"source", "demo"}});
}

parameter_access_context_t

头文件:strategy/parameter_access_context.h;命名空间:thunder::strategy。

按名称和类型读取策略参数。参数应先在 get_parameters_meta 中声明;缺失参数或类型不匹配的行为未在接口头文件中规定。

int_parameter

virtual int64_t int_parameter(const std::string &);

按键读取 int64_t 参数。示例键 volume 应在参数元数据中以对应类型声明。

示例:

void demo(parameter_access_context_t &api) {
    const int64_t value = api.int_parameter("volume");
    (void)value;
}

double_parameter

virtual double double_parameter(const std::string &);

按键读取 double 参数。示例键 threshold 应在参数元数据中以对应类型声明。

示例:

void demo(parameter_access_context_t &api) {
    const double value = api.double_parameter("threshold");
    (void)value;
}

string_parameter

virtual std::string string_parameter(const std::string &);

按键读取 std::string 参数。示例键 instrument 应在参数元数据中以对应类型声明。

示例:

void demo(parameter_access_context_t &api) {
    const std::string value = api.string_parameter("instrument");
    (void)value;
}

parameter_context_t

头文件:strategy/parameter_context.h;命名空间:thunder::strategy。

框架传给 strategy_t::get_parameters_meta 的元数据上下文。

继承接口:logger_t、metric_t、environment_context_t。继承函数的参数及示例见对应基类。

此类没有新增业务函数。以下示例展示通过该阶段上下文调用继承的日志函数;指标与环境变量用法参见基类。

void demo(parameter_context_t &context) {
    context.logging(severity_levels::debug, "进入当前阶段");
}

position_access_context_t

头文件:strategy/position_access_context.h;命名空间:thunder。

按交易槽读取持仓及已实现、未实现盈亏;其命名空间是 thunder,不是 thunder::strategy。

get_position

virtual assets_t get_position(trade_slot_t);

返回交易槽持仓快照,包含多空数量、均价及明细。

示例:

void demo(position_access_context_t &api) {
    const assets_t p = api.get_position(0);
    const volume_t net = p.long_volume - p.short_volume;
    (void)net;
}

get_realized_profit

virtual price_t get_realized_profit(trade_slot_t);

返回指定交易槽的已实现盈亏。金额口径由宿主实现决定。

示例:

void demo(position_access_context_t &api) {
    const price_t profit = api.get_realized_profit(0);
    (void)profit;
}

get_unrealized_profit

virtual price_t get_unrealized_profit(trade_slot_t);

返回指定交易槽的未实现盈亏。金额口径由宿主实现决定。

示例:

void demo(position_access_context_t &api) {
    const price_t profit = api.get_unrealized_profit(0);
    (void)profit;
}

runtime_context_t

头文件:strategy/runtime_context.h;命名空间:thunder::strategy。

部署时由引擎交给策略的运行服务。strategy_arbitrage 保存其地址,用于报单、状态、持仓、定时器和汇率操作。仅在框架保证的生命周期内使用。

继承接口:logger_t、metric_t、environment_context_t、strategy_meta_context_t、strategy_state_manager_t、parameter_access_context_t、position_access_context_t。继承函数的参数及示例见对应基类。

insert_order

virtual primary_order_ref_t insert_order(const order_parameter_t&);

按交易槽提交订单并返回主引用;空引用表示未得到有效主引用。价格、数量、类型及开平标志应匹配合约和通道能力,后续状态以订单回报为准。

示例:

void demo(runtime_context_t &api) {
    order_parameter_t order{};
    order.slot = 0;
    order.type = order_type_t::NORMAL_LIMIT_ORDER;
    order.direction = order_direction_t::BUY;
    order.offset = order_offset_t::INCREASE;
    order.volume = 1;
    order.price = 100.0; // 演示价,调用前按合约步长及行情校验。
    const auto ref = api.insert_order(order);
    if (!ref) {
        api.logging(severity_levels::warning, "未获得有效订单引用");
    }
}

cancel_order

virtual last_error_id_t cancel_order(const cancellation_parameter_t&);

提交撤单请求,参数包含交易槽和订单引用。NO_ERROR 不代表已经撤单成功,应等待状态回报。

示例:

void demo(runtime_context_t &api, trade_slot_t slot, const primary_order_ref_t &primary, const secondary_order_ref_t &secondary) {
    cancellation_parameter_t request{};
    request.slot = slot;
    request.primary_ref = primary;
    request.secondary_ref = secondary;
    const auto error = api.cancel_order(request);
    if (error != last_error_id_t::NO_ERROR) {
        api.logging(severity_levels::warning, "撤单请求未成功提交");
    }
}

is_channel_valid

virtual bool is_channel_valid(trade_slot_t);

检查交易槽对应通道当前是否有效;返回 true 也不能保证后续请求必然成功。

示例:

void demo(runtime_context_t &api) {
    const bool available = api.is_channel_valid(0);
    (void)available;
}

get_shared_value

virtual bool get_shared_value(shared_index_id_t, double &ret);

按共享索引读取 double 值,经引用输出;只有返回 true 时使用结果。

示例:

void demo(runtime_context_t &api, shared_index_id_t index) {
    double value = 0.0;
    if (api.get_shared_value(index, value)) {
        const double snapshot = value;
        (void)snapshot;
    }
}

increase_shared_value

virtual bool increase_shared_value(shared_index_id_t, double dt, function<bool(double)>);

增加共享值,返回操作结果。第三个参数是条件函数;头文件未规定传入条件的是更新前还是更新后值,也未承诺并发语义。本例使用恒真条件,不依赖这些细节。

示例:

void demo(runtime_context_t &api, shared_index_id_t index) {
    const bool ok = api.increase_shared_value(index, 1.0, [](double) { return true; });
    (void)ok;
}

decrease_shared_value

virtual bool decrease_shared_value(shared_index_id_t, double dt, function<bool(double)>);

减少共享值,返回操作结果。第三个参数是条件函数;头文件未规定传入条件的是更新前还是更新后值,也未承诺并发语义。本例使用恒真条件,不依赖这些细节。

示例:

void demo(runtime_context_t &api, shared_index_id_t index) {
    const bool ok = api.decrease_shared_value(index, 1.0, [](double) { return true; });
    (void)ok;
}

set_shared_value

virtual bool set_shared_value(shared_index_id_t, double new_value, function<bool(double)>);

设置共享值,返回操作结果。第三个参数是条件函数;头文件未规定传入条件的是更新前还是更新后值,也未承诺并发语义。本例使用恒真条件,不依赖这些细节。

示例:

void demo(runtime_context_t &api, shared_index_id_t index) {
    const bool ok = api.set_shared_value(index, 10.0, [](double) { return true; });
    (void)ok;
}

query_commission

virtual bool query_commission(const instrument_unique_name_t&, commission_t&);

按合约唯一名称查询手续费结构;成功时填充 commission_t。不可用时返回 false,不能当成零手续费。

示例:

void demo(runtime_context_t &api, const instrument_unique_name_t &instrument) {
    commission_t commission;
    if (api.query_commission(instrument, commission)) {
        const auto text = commission.to_string();
        (void)text;
    }
}

calculate_commission

virtual bool calculate_commission(trade_slot_t, price_t, volume_t, commission_value_t&);

根据槽位、价格和数量计算开仓、平今、平昨手续费。返回 true 后读取各金额和币种。

示例:

void demo(runtime_context_t &api) {
    commission_value_t fees{};
    if (api.calculate_commission(0, 100.0, 1, fees)) {
        const auto open_fee = fees.increase;
        const auto currency = fees.current_type;
        (void)open_fee; (void)currency;
    }
}

create_timer

virtual timer_handler_t create_timer(size_t timeout_ms, timer_callback_t&&, bool enable_lock = true);

创建毫秒定时任务并返回句柄。回调接收无参数;enable_lock 默认为 true,具体锁语义由宿主定义。套利示例在回调中再次创建定时器实现周期调度,因此不要假设它自动重复。

示例:

void demo(runtime_context_t &api) {
    const timer_handler_t timer = api.create_timer(1000, []() {
        // 到期后执行任务;需要周期执行时按宿主约定再次调度。
    });
    (void)timer;
}

cancel_timer

virtual void cancel_timer(timer_handler_t);

按句柄取消定时器。退出时同步处理回调捕获对象的生命周期;接口未承诺取消会等待正在执行的回调结束。

示例:

void demo(runtime_context_t &api, timer_handler_t timer) {
    api.cancel_timer(timer);
}

get_utc_time

virtual time_point_t get_utc_time();

返回 UTC 系统时间点 time_point_t。

示例:

void demo(runtime_context_t &api) {
    const time_point_t now = api.get_utc_time();
    (void)now;
}

get_trade_permission_state

virtual void get_trade_permission_state(bool &increase_enabled, bool &decrease_today_enabled, bool &decrease_yesterday_enabled);

通过三个 bool 引用分别输出开仓、平今和平昨权限。

示例:

void demo(runtime_context_t &api) {
    bool increase = false, today = false, yesterday = false;
    api.get_trade_permission_state(increase, today, yesterday);
    (void)increase; (void)today; (void)yesterday;
}

is_trading

virtual bool is_trading(trade_slot_t, const zoned_time_point_t&);

按交易槽和带时区时间检查交易时段。当前参数是 zoned_time_point_t,应显式传入时区;部分旧项目直接传 UTC time_point_t 的写法不适用于此声明。

示例:

void demo(runtime_context_t &api) {
    const zoned_time_point_t local_time{"Asia/Shanghai", api.get_utc_time()};
    const bool active = api.is_trading(0, local_time);
    (void)active;
}

get_trade_day

virtual trade_day_t get_trade_day(trade_slot_t);

返回槽位对应的交易日字符串。交易日与自然日不一定相同,格式由对应通道定义。

示例:

void demo(runtime_context_t &api) {
    const trade_day_t day = api.get_trade_day(0);
    (void)day;
}

to_uniform_price

virtual uniform_price_t to_uniform_price(trade_slot_t, price_t);

将价格转换为统一单位、统一币种及同时统一单位和币种的三个结果。

示例:

void demo(runtime_context_t &api) {
    const uniform_price_t converted = api.to_uniform_price(0, 100.0);
    const price_t unified = converted.uniform_price;
    (void)unified;
}

update_currency_exchange_rate

virtual void update_currency_exchange_rate(const currency_t &from, const currency_t &to, ratio_t, bool global = false);

更新 from 到 to 的换算比率;global 默认为 false。示例将 1 USD 换算为 7 CNY;作用范围及反向汇率维护由宿主实现决定。

示例:

void demo(runtime_context_t &api) {
    api.update_currency_exchange_rate(currency_t::USD, currency_t::CNY, 7.0, false);
}

serializable_merge_t

头文件:serializable.h;命名空间:thunder。

二进制序列化的扩展接口,提供合并式反序列化。哪些字段覆盖或累加由实现类定义。

继承接口:binary_serializable_t。继承函数的参数及示例见对应基类。

deserialize_merge_from

virtual void deserialize_merge_from(boost::archive::binary_iarchive &);

从二进制归档读取并合并到当前对象;合并规则由实现定义。

示例:

void demo(serializable_merge_t &api, std::istream &stream) {
    boost::archive::binary_iarchive archive(stream);
    api.deserialize_merge_from(archive);
}

signal_meta_context_t

头文件:strategy/signal_meta_context.h;命名空间:thunder::strategy。

框架传给策略信号声明及调用函数的上下文。

继承接口:logger_t、metric_t、environment_context_t。继承函数的参数及示例见对应基类。

此类没有新增业务函数。以下示例展示通过该阶段上下文调用继承的日志函数;指标与环境变量用法参见基类。

void demo(signal_meta_context_t &context) {
    context.logging(severity_levels::debug, "进入当前阶段");
}

source_plugin_context_t

头文件:source/source_plugin_context.h;命名空间:thunder。

引擎为行情源和交易源提供的公共上下文。初始化时保存宿主传入的指针,不接管其所有权。

继承接口:logger_t、metric_t。继承函数的参数及示例见对应基类。

query_instrument_configuration

virtual bool query_instrument_configuration(const instrument_unique_name_t&, std::map<source_name_t, instrument_t>&);

查询多个源提供的合约配置。输出映射的键为源名称;应选取与当前通道匹配的条目。

示例:

void demo(source_plugin_context_t &api, const instrument_unique_name_t &name, const source_name_t &source) {
    std::map<source_name_t, instrument_t> configurations;
    if (api.query_instrument_configuration(name, configurations)) {
        if (const auto it = configurations.find(source); it != configurations.end()) {
            const instrument_t instrument = it->second;
            (void)instrument;
        }
    }
}

upload_instrument_configuration

virtual void upload_instrument_configuration(const source_name_t&, const instrument_unique_name_t&, instrument_t&&);

上传指定源、指定合约的配置,第三个参数是右值引用。

示例:

void demo(source_plugin_context_t &api, const source_name_t &source, instrument_t instrument) {
    const auto name = instrument.unique_name;
    api.upload_instrument_configuration(source, name, std::move(instrument));
}

get_configuration

virtual source_plugin_configuration_t get_configuration() const;

获取当前源实例配置,JSON 位于 json_config 成员中。

示例:

void demo(source_plugin_context_t &api) {
    const source_plugin_configuration_t configuration = api.get_configuration();
    const boost::json::value json = configuration.json_config;
    (void)json;
}

get_instance_index

virtual size_t get_instance_index() const;

返回插件实例索引。IBKR 和 CTP 交易源将其写入订单引用的 account_number 字段,需遵守该字段范围。

示例:

void demo(source_plugin_context_t &api) {
    const size_t index = api.get_instance_index();
    (void)index;
}

source_plugin_t

头文件:source/source_plugin.h;命名空间:thunder。

行情源和交易源的公共基类。实现插件时继承 market_data_source_plugin_t 或 trade_source_plugin_t。配置字段模式是字段名到说明的映射,不是 JSON Schema。

get_configuration_schema

virtual configuration_schema_t get_configuration_schema() const;

返回配置字段名到说明的映射。IBKR 使用 name、host、port、client_id 等字段。

示例:

void demo(source_plugin_t &api) {
    const auto fields = api.get_configuration_schema();
    for (const auto &[name, description] : fields) {
        (void)name; (void)description;
    }
}

get_plugin_name

virtual std::string get_plugin_name() const;

返回插件类型名称,例如 ibkr_tws_md;与实例唯一名称不同。

示例:

void demo(source_plugin_t &api) {
    const std::string name = api.get_plugin_name();
    (void)name;
}

is_source_pending

virtual bool is_source_pending();

返回源是否处于 pending 状态。头文件规定 pending 期间引擎拒绝操作请求。

示例:

void demo(source_plugin_t &api) {
    const bool pending = api.is_source_pending();
    (void)pending;
}

is_source_online

virtual bool is_source_online();

返回源的在线状态。具体登录和连接判定由插件实现。

示例:

void demo(source_plugin_t &api) {
    const bool online = api.is_source_online();
    (void)online;
}

get_source_state

virtual void get_source_state(boost::json::value& out);

将用于控制面板展示的自定义状态写入 JSON 输出参数。不要展示口令等敏感配置。

示例:

void demo(source_plugin_t &api) {
    boost::json::value state;
    api.get_source_state(state);
    const std::string text = boost::json::serialize(state);
    (void)text;
}

configuration_hot_update

virtual void configuration_hot_update();

由宿主在配置更新后调用。接口没有配置参数,插件通过已保存的 source_plugin_context_t 重新读取配置;是否重连取决于实现。

示例:

void demo(source_plugin_t &api) {
    api.configuration_hot_update();
}

symbol_validation

virtual bool symbol_validation(const instrument_unique_name_t&);

判断插件是否接受合约标识。IBKR 行情源检查类型是否为 IBKR_TWS_L1,不能将 true 等同于合约已被远端确认。

示例:

void demo(source_plugin_t &api, const instrument_unique_name_t &instrument) {
    const bool accepted = api.symbol_validation(instrument);
    (void)accepted;
}

get_source_unique_name

virtual std::string get_source_unique_name();

返回当前源实例的唯一名称。IBKR 实现从配置的 name 字段读取。

示例:

void demo(source_plugin_t &api) {
    const std::string unique_name = api.get_source_unique_name();
    (void)unique_name;
}

calculate_source_unique_name

virtual std::string calculate_source_unique_name(const boost::json::value&) const;

从给定 JSON 配置计算实例唯一名称。配置解析失败可能抛出异常,格式由插件决定。

示例:

void demo(source_plugin_t &api, const boost::json::value &config) {
    const std::string name = api.calculate_source_unique_name(config);
    (void)name;
}

strategy_base_imp_t

头文件:strategy/strategy_base_imp.h;命名空间:thunder::strategy。

继承 strategy_t 的信号辅助抽象基类。已实现信号声明和分派,派生类仍须实现策略生命周期及其他纯虚函数。使用时链接 strategy_base_imp 库。

继承接口:strategy_t。继承函数的参数及示例见对应基类。

get_signal_struct

virtual const signal_controller_t & get_signal_struct(signal_meta_context_t&);

受保护的纯虚函数,返回信号名到元数据与处理器的映射引用。派生类可用 BEGIN_SIGNAL_HANDLER_DEF 等宏实现;映射及其中捕获的对象必须保持有效。

示例:

// 以下成员放在策略派生类内;其他策略纯虚函数仍需实现。
const signal_controller_t &get_signal_struct(signal_meta_context_t &) override {
    return handlers_;
}
signal_controller_t handlers_; // 放在 strategy_base_imp_t 派生类中。

get_signal_declares

void get_signal_declares(signal_declares_t &signals, signal_meta_context_t&);

将信号参数名称、类型签名和说明输出到映射。strategy_base_imp_t 从 get_signal_struct 读取并写入,现有输出映射不会自动清空。

示例:

void demo(strategy_base_imp_t &api, signal_meta_context_t &context) {
    signal_declares_t declarations;
    api.get_signal_declares(declarations, context);
}

invoke_signal

std::string invoke_signal(const signal_name_t &name, signal_argument_list_t &args, signal_meta_context_t&);

按信号名称分派字符串参数并返回结果文本。strategy_base_imp_t 对名称不存在、参数数量不匹配或处理器无效抛出 runtime_error;参数转换也可能失败。

示例:

void demo(strategy_base_imp_t &api, const signal_name_t &name, signal_argument_list_t &arguments, signal_meta_context_t &context) {
    try {
        const std::string result = api.invoke_signal(name, arguments, context);
        (void)result;
    } catch (const std::exception &) {
        // 调用方记录或向界面报告信号错误。
    }
}

strategy_meta_context_t

头文件:strategy/strategy_meta_context.h;命名空间:thunder::strategy。

提供策略数值 ID 和 UUID 的基础接口。

get_strategy_id

virtual strategy_id_t get_strategy_id();

返回当前策略的数值标识。

示例:

void demo(strategy_meta_context_t &api) {
    const strategy_id_t id = api.get_strategy_id();
    (void)id;
}

get_strategy_uuid

virtual boost::uuids::uuid get_strategy_uuid();

返回策略 UUID,类型为 boost::uuids::uuid。

示例:

void demo(strategy_meta_context_t &api) {
    const auto uuid = api.get_strategy_uuid();
    (void)uuid;
}

strategy_state_manager_t

头文件:strategy_state_manager.h;命名空间:thunder。

以字符串键访问框架管理的策略状态。下列函数均由 STRATEGY_STATE_ACCESS_INTERFACE 宏展开;每种类型分别提供可写引用访问和存在性查询。首次访问的创建及默认值语义取决于宿主;恢复后不要无条件重置已有状态。

int_state

int_state_t &int_state(const std::string &key);

返回 int_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.int_state("demo.int");
    state = 1;
}

int_state_exists

bool int_state_exists(const std::string &key) const;

查询 int_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.int_state_exists("demo.int");
    (void)exists;
}

uint_state

uint_state_t &uint_state(const std::string &key);

返回 uint_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.uint_state("demo.uint");
    state = 1u;
}

uint_state_exists

bool uint_state_exists(const std::string &key) const;

查询 uint_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.uint_state_exists("demo.uint");
    (void)exists;
}

double_state

double_state_t &double_state(const std::string &key);

返回 double_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.double_state("demo.double");
    state = 1.5;
}

double_state_exists

bool double_state_exists(const std::string &key) const;

查询 double_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.double_state_exists("demo.double");
    (void)exists;
}

string_state

string_state_t &string_state(const std::string &key);

返回 string_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.string_state("demo.string");
    state = "ready";
}

string_state_exists

bool string_state_exists(const std::string &key) const;

查询 string_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.string_state_exists("demo.string");
    (void)exists;
}

int_int_map_state

int_int_map_state_t &int_int_map_state(const std::string &key);

返回 int_int_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.int_int_map_state("demo.int_int_map");
    state[0] = 1;
}

int_int_map_state_exists

bool int_int_map_state_exists(const std::string &key) const;

查询 int_int_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.int_int_map_state_exists("demo.int_int_map");
    (void)exists;
}

int_uint_map_state

int_uint_map_state_t &int_uint_map_state(const std::string &key);

返回 int_uint_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.int_uint_map_state("demo.int_uint_map");
    state[0] = 1;
}

int_uint_map_state_exists

bool int_uint_map_state_exists(const std::string &key) const;

查询 int_uint_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.int_uint_map_state_exists("demo.int_uint_map");
    (void)exists;
}

int_double_map_state

int_double_map_state_t &int_double_map_state(const std::string &key);

返回 int_double_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.int_double_map_state("demo.int_double_map");
    state[0] = 1.5;
}

int_double_map_state_exists

bool int_double_map_state_exists(const std::string &key) const;

查询 int_double_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.int_double_map_state_exists("demo.int_double_map");
    (void)exists;
}

int_string_map_state

int_string_map_state_t &int_string_map_state(const std::string &key);

返回 int_string_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.int_string_map_state("demo.int_string_map");
    state[0] = "ready";
}

int_string_map_state_exists

bool int_string_map_state_exists(const std::string &key) const;

查询 int_string_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.int_string_map_state_exists("demo.int_string_map");
    (void)exists;
}

uint_int_map_state

uint_int_map_state_t &uint_int_map_state(const std::string &key);

返回 uint_int_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.uint_int_map_state("demo.uint_int_map");
    state[0] = 1;
}

uint_int_map_state_exists

bool uint_int_map_state_exists(const std::string &key) const;

查询 uint_int_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.uint_int_map_state_exists("demo.uint_int_map");
    (void)exists;
}

uint_uint_map_state

uint_uint_map_state_t &uint_uint_map_state(const std::string &key);

返回 uint_uint_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.uint_uint_map_state("demo.uint_uint_map");
    state[0] = 1;
}

uint_uint_map_state_exists

bool uint_uint_map_state_exists(const std::string &key) const;

查询 uint_uint_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.uint_uint_map_state_exists("demo.uint_uint_map");
    (void)exists;
}

uint_double_map_state

uint_double_map_state_t &uint_double_map_state(const std::string &key);

返回 uint_double_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.uint_double_map_state("demo.uint_double_map");
    state[0] = 1.5;
}

uint_double_map_state_exists

bool uint_double_map_state_exists(const std::string &key) const;

查询 uint_double_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.uint_double_map_state_exists("demo.uint_double_map");
    (void)exists;
}

uint_string_map_state

uint_string_map_state_t &uint_string_map_state(const std::string &key);

返回 uint_string_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.uint_string_map_state("demo.uint_string_map");
    state[0] = "ready";
}

uint_string_map_state_exists

bool uint_string_map_state_exists(const std::string &key) const;

查询 uint_string_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.uint_string_map_state_exists("demo.uint_string_map");
    (void)exists;
}

string_int_map_state

string_int_map_state_t &string_int_map_state(const std::string &key);

返回 string_int_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.string_int_map_state("demo.string_int_map");
    state["leg0"] = 1;
}

string_int_map_state_exists

bool string_int_map_state_exists(const std::string &key) const;

查询 string_int_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.string_int_map_state_exists("demo.string_int_map");
    (void)exists;
}

string_uint_map_state

string_uint_map_state_t &string_uint_map_state(const std::string &key);

返回 string_uint_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.string_uint_map_state("demo.string_uint_map");
    state["leg0"] = 1;
}

string_uint_map_state_exists

bool string_uint_map_state_exists(const std::string &key) const;

查询 string_uint_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.string_uint_map_state_exists("demo.string_uint_map");
    (void)exists;
}

string_double_map_state

string_double_map_state_t &string_double_map_state(const std::string &key);

返回 string_double_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.string_double_map_state("demo.string_double_map");
    state["leg0"] = 1.5;
}

string_double_map_state_exists

bool string_double_map_state_exists(const std::string &key) const;

查询 string_double_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.string_double_map_state_exists("demo.string_double_map");
    (void)exists;
}

string_string_map_state

string_string_map_state_t &string_string_map_state(const std::string &key);

返回 string_string_map_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.string_string_map_state("demo.string_string_map");
    state["leg0"] = "ready";
}

string_string_map_state_exists

bool string_string_map_state_exists(const std::string &key) const;

查询 string_string_map_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.string_string_map_state_exists("demo.string_string_map");
    (void)exists;
}

int_vector_state

int_vector_state_t &int_vector_state(const std::string &key);

返回 int_vector_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.int_vector_state("demo.int_vector");
    state.push_back(1);
}

int_vector_state_exists

bool int_vector_state_exists(const std::string &key) const;

查询 int_vector_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.int_vector_state_exists("demo.int_vector");
    (void)exists;
}

uint_vector_state

uint_vector_state_t &uint_vector_state(const std::string &key);

返回 uint_vector_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.uint_vector_state("demo.uint_vector");
    state.push_back(1);
}

uint_vector_state_exists

bool uint_vector_state_exists(const std::string &key) const;

查询 uint_vector_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.uint_vector_state_exists("demo.uint_vector");
    (void)exists;
}

double_vector_state

double_vector_state_t &double_vector_state(const std::string &key);

返回 double_vector_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.double_vector_state("demo.double_vector");
    state.push_back(1.5);
}

double_vector_state_exists

bool double_vector_state_exists(const std::string &key) const;

查询 double_vector_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.double_vector_state_exists("demo.double_vector");
    (void)exists;
}

string_vector_state

string_vector_state_t &string_vector_state(const std::string &key);

返回 string_vector_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.string_vector_state("demo.string_vector");
    state.push_back("ready");
}

string_vector_state_exists

bool string_vector_state_exists(const std::string &key) const;

查询 string_vector_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.string_vector_state_exists("demo.string_vector");
    (void)exists;
}

int_list_state

int_list_state_t &int_list_state(const std::string &key);

返回 int_list_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.int_list_state("demo.int_list");
    state.push_back(1);
}

int_list_state_exists

bool int_list_state_exists(const std::string &key) const;

查询 int_list_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.int_list_state_exists("demo.int_list");
    (void)exists;
}

uint_list_state

uint_list_state_t &uint_list_state(const std::string &key);

返回 uint_list_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.uint_list_state("demo.uint_list");
    state.push_back(1);
}

uint_list_state_exists

bool uint_list_state_exists(const std::string &key) const;

查询 uint_list_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.uint_list_state_exists("demo.uint_list");
    (void)exists;
}

double_list_state

double_list_state_t &double_list_state(const std::string &key);

返回 double_list_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.double_list_state("demo.double_list");
    state.push_back(1.5);
}

double_list_state_exists

bool double_list_state_exists(const std::string &key) const;

查询 double_list_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.double_list_state_exists("demo.double_list");
    (void)exists;
}

string_list_state

string_list_state_t &string_list_state(const std::string &key);

返回 string_list_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.string_list_state("demo.string_list");
    state.push_back("ready");
}

string_list_state_exists

bool string_list_state_exists(const std::string &key) const;

查询 string_list_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.string_list_state_exists("demo.string_list");
    (void)exists;
}

int_deque_state

int_deque_state_t &int_deque_state(const std::string &key);

返回 int_deque_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.int_deque_state("demo.int_deque");
    state.push_back(1);
}

int_deque_state_exists

bool int_deque_state_exists(const std::string &key) const;

查询 int_deque_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.int_deque_state_exists("demo.int_deque");
    (void)exists;
}

uint_deque_state

uint_deque_state_t &uint_deque_state(const std::string &key);

返回 uint_deque_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.uint_deque_state("demo.uint_deque");
    state.push_back(1);
}

uint_deque_state_exists

bool uint_deque_state_exists(const std::string &key) const;

查询 uint_deque_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.uint_deque_state_exists("demo.uint_deque");
    (void)exists;
}

double_deque_state

double_deque_state_t &double_deque_state(const std::string &key);

返回 double_deque_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.double_deque_state("demo.double_deque");
    state.push_back(1.5);
}

double_deque_state_exists

bool double_deque_state_exists(const std::string &key) const;

查询 double_deque_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.double_deque_state_exists("demo.double_deque");
    (void)exists;
}

string_deque_state

string_deque_state_t &string_deque_state(const std::string &key);

返回 string_deque_state_t 的可写引用。示例演示写入;初始化逻辑应结合对应的 exists 函数,避免覆盖恢复值。

示例:

void demo(strategy_state_manager_t &api) {
    auto &state = api.string_deque_state("demo.string_deque");
    state.push_back("ready");
}

string_deque_state_exists

bool string_deque_state_exists(const std::string &key) const;

查询 string_deque_state_t 类型的指定键是否已存在。存在性按类型查询,不应假定与其他状态类型共享命名空间。

示例:

void demo(strategy_state_manager_t &api) {
    const bool exists = api.string_deque_state_exists("demo.string_deque");
    (void)exists;
}

strategy_t

头文件:strategy/strategy.h;命名空间:thunder::strategy。

策略主接口,由策略实现,框架调用生命周期、行情、订单和元数据回调。STRATEGY_EXPORT 导出策略工厂。示例中的回调调用用于说明参数,实际策略由框架驱动。

get_description

virtual std::string get_description(description_meta_context_t&);

返回策略简介,框架传入描述元数据上下文。

示例:

void demo(strategy_t &api, description_meta_context_t &context) {
    const std::string description = api.get_description(context);
    (void)description;
}

get_dashboard_meta

virtual dashboard_meta_t get_dashboard_meta(dashboard_meta_context_t&);

返回仪表盘二维布局,每项包含指标指针、名称、颜色和坐标轴等。指针指向的原子数值必须在使用期间有效。

示例:

void demo(strategy_t &api, dashboard_meta_context_t &context) {
    const auto dashboard = api.get_dashboard_meta(context);
    (void)dashboard;
}

get_metrics_abstract_row

virtual void get_metrics_abstract_row(std::vector<double>&);

填充摘要行数值。各列的含义和顺序应与策略界面约定一致。

示例:

void demo(strategy_t &api) {
    std::vector<double> row;
    api.get_metrics_abstract_row(row);
}

get_parameters_meta

virtual std::map<std::string, parameter_item_meta_t> get_parameters_meta(parameter_context_t&);

返回参数名到 parameter_item_meta_t 的映射。参数类型、说明及默认值应匹配运行时 int/double/string_parameter 访问。

示例:

void demo(strategy_t &api, parameter_context_t &context) {
    const auto parameters = api.get_parameters_meta(context);
    (void)parameters;
}

on_user_defined_savepoint

virtual bool on_user_defined_savepoint(strategy_user_defined_savepoint_t&);

生成自定义保存点,经字符串引用输出;返回 false 表示未成功生成。套利策略使用 Boost 文本归档编码自己的状态。

示例:

void demo(strategy_t &api) {
    strategy_user_defined_savepoint_t payload;
    if (api.on_user_defined_savepoint(payload)) {
        // 宿主保存 payload,部署时通过 get_user_defined_savepoint 交回。
    }
}

on_initialization

virtual void on_initialization(initialization_context_t &);

策略初始化回调。可读取归档恢复状态;不要在此假定运行上下文已经可用。

示例:

void demo(strategy_t &api, initialization_context_t &context) {
    api.on_initialization(context);
}

on_deployment

virtual void on_deployment(deployment_context_t &, runtime_context_t &);

部署回调,同时获得部署上下文和运行上下文。套利策略在此保存 runtime_context_t 指针并恢复状态。

示例:

void demo(strategy_t &api, deployment_context_t &deployment, runtime_context_t &runtime) {
    api.on_deployment(deployment, runtime);
}

on_exit

virtual void on_exit(exit_context_t&);

退出回调。在实现中停止策略持有的异步任务,并处理定时器和回调捕获对象的生命周期。

示例:

void demo(strategy_t &api, exit_context_t &context) {
    api.on_exit(context);
}

on_tick

virtual void on_tick(trade_slot_t, const ::thunder::tick_t &);

收到槽位行情时回调,tick 为借用的只读引用;需长期保存时复制必要字段。

示例:

void demo(strategy_t &api, trade_slot_t slot, const tick_t &tick) {
    api.on_tick(slot, tick);
}

on_order_trade

virtual void on_order_trade(const order_trade_event_t &);

逐笔成交事件,包含成交日、时间、价格和本次成交量。 由引擎触发;下例用于演示事件参数传递。

示例:

void demo(strategy_t &api, const order_trade_event_t &event) {
    api.on_order_trade(event);
}

on_order_progress

virtual void on_order_progress(const order_progress_event_t &);

订单进度事件,包含累计成交量 traded_volume 和剩余数量 remain_volume。套利策略把它交给订单执行器。 由引擎触发;下例用于演示事件参数传递。

示例:

void demo(strategy_t &api, const order_progress_event_t &event) {
    api.on_order_progress(event);
}

on_order_state_change

virtual void on_order_state_change(const order_state_change_event_t &);

订单状态变化事件,例如 CANCELED;不能用撤单请求返回值替代此回报。 由引擎触发;下例用于演示事件参数传递。

示例:

void demo(strategy_t &api, const order_state_change_event_t &event) {
    api.on_order_state_change(event);
}

on_secondary_ref

virtual void on_secondary_ref(const secondary_order_ref_event_t &);

接收柜台侧订单引用,供关联回报及撤单使用。套利策略检查非空后交给订单执行器。 由引擎触发;下例用于演示事件参数传递。

示例:

void demo(strategy_t &api, const secondary_order_ref_event_t &event) {
    api.on_secondary_ref(event);
}

get_signal_declares

virtual void get_signal_declares(signal_declares_t &signals, signal_meta_context_t&);

将信号参数名称、类型签名和说明输出到映射。strategy_base_imp_t 从 get_signal_struct 读取并写入,现有输出映射不会自动清空。

示例:

void demo(strategy_t &api, signal_meta_context_t &context) {
    signal_declares_t declarations;
    api.get_signal_declares(declarations, context);
}

invoke_signal

virtual std::string invoke_signal(const signal_name_t &, signal_argument_list_t &, signal_meta_context_t&);

按信号名称分派字符串参数并返回结果文本。strategy_base_imp_t 对名称不存在、参数数量不匹配或处理器无效抛出 runtime_error;参数转换也可能失败。

示例:

void demo(strategy_t &api, const signal_name_t &name, signal_argument_list_t &arguments, signal_meta_context_t &context) {
    try {
        const std::string result = api.invoke_signal(name, arguments, context);
        (void)result;
    } catch (const std::exception &) {
        // 调用方记录或向界面报告信号错误。
    }
}

text_serializable_t

头文件:serializable.h;命名空间:thunder。

文本序列化契约,使用 Boost.Serialization 文本归档;不等同于 JSON。

text_serialize_to

virtual void text_serialize_to(boost::archive::text_oarchive&);

通过 Boost text 归档写入对象。调用方创建归档并保证流可用;实现类负责匹配字段顺序和版本。

示例:

void demo(text_serializable_t &api, std::ostream &stream) {
    boost::archive::text_oarchive archive(stream);
    api.text_serialize_to(archive);
}

text_deserialize_from

virtual void text_deserialize_from(boost::archive::text_iarchive&);

通过 Boost text 归档读取对象。调用方创建归档并保证流可用;实现类负责匹配字段顺序和版本。

示例:

void demo(text_serializable_t &api, std::istream &stream) {
    boost::archive::text_iarchive archive(stream);
    api.text_deserialize_from(archive);
}

tick_sink_t

头文件:data_center/tick_sink.h;命名空间:thunder::data_collector。

DataCenter 行情接收端。采集器在初始化时保存 weak_ptr,发送前 lock 并判空;start 和 stop 由接收端的生命周期管理者调用。

sink

virtual void sink(std::unique_ptr<const thunder::tick_t> tick);

提交一条只读 tick 并转移所有权。接收端不可用时不要解引用空 shared_ptr。

示例:

void demo(tick_sink_t &api, const tick_t &sample) {
    auto tick = std::make_unique<tick_t>(sample);
    api.sink(std::move(tick));
}

start

virtual void start();

启动接收端处理;该操作属于接收端生命周期,不是采集插件的 install。

示例:

void demo(tick_sink_t &api) {
    api.start();
}

stop

virtual void stop();

停止接收端处理。停止时队列如何排空由具体接收端实现规定。

示例:

void demo(tick_sink_t &api) {
    api.stop();
}

trade_source_context_t

头文件:source/trade_source_context.h;命名空间:thunder。

交易插件向引擎上报订单事件的接口。引擎再将带交易槽等信息的事件转发给策略。主引用关联引擎订单,次级引用保存通道或柜台侧标识。

on_order_trade

virtual void on_order_trade(const primary_order_ref_t&, const secondary_order_ref_t&, const trade_day_t&, const trade_time_t&, price_t, volume_t);

向引擎上报本次成交,参数依次为主引用、次级引用、交易日、成交 UTC 时间、价格和成交量。

示例:

void demo(trade_source_context_t &api, const primary_order_ref_t &primary, const secondary_order_ref_t &secondary, const trade_day_t &day, const trade_time_t &time) {
    api.on_order_trade(primary, secondary, day, time, 100.0, 1);
}

on_order_progress

virtual void on_order_progress(const primary_order_ref_t&, const secondary_order_ref_t&, completed_volume_t, remaining_volume_t);

向引擎上报累计已成交量和剩余量。例中原始数量为 3,累计成交 1,剩余 2;不要把累计量当成新增成交量。

示例:

void demo(trade_source_context_t &api, const primary_order_ref_t &primary, const secondary_order_ref_t &secondary) {
    api.on_order_progress(primary, secondary, 1, 2);
}

on_order_state_change

virtual void on_order_state_change(const primary_order_ref_t&, const secondary_order_ref_t&, order_state_t);

向引擎上报柜台已确认的订单状态,例如 CANCELED。

示例:

void demo(trade_source_context_t &api, const primary_order_ref_t &primary, const secondary_order_ref_t &secondary) {
    api.on_order_state_change(primary, secondary, order_state_t::CANCELED);
}

on_secondary_ref

virtual void on_secondary_ref(const primary_order_ref_t&, const secondary_order_ref_t&);

向引擎上报主引用与柜台次级引用的对应关系;应使用实际收到的标识。

示例:

void demo(trade_source_context_t &api, const primary_order_ref_t &primary, const secondary_order_ref_t &secondary) {
    api.on_secondary_ref(primary, secondary);
}

trade_source_plugin_t

头文件:source/trade_source_plugin.h;命名空间:thunder。

交易源插件契约,由宿主初始化并调用报单、撤单和卸载函数。通道返回只表示请求阶段结果,订单最终进度通过 trade_source_context_t 异步回报。实现类用 SOURCE_PLUGIN_EXPORT 导出。

继承接口:source_plugin_t。继承函数的参数及示例见对应基类。

trade_source_initialization

virtual void trade_source_initialization(source_plugin_context_t *, trade_source_context_t *);

宿主注入公共上下文和交易回报上下文。插件保存指针并启动连接与登录流程。

示例:

void demo(trade_source_plugin_t &api, source_plugin_context_t &source, trade_source_context_t &trade) {
    api.trade_source_initialization(&source, &trade);
}

trade_source_insert_order

virtual primary_order_ref_t trade_source_insert_order(order_type_t, const instrument_t &, order_direction_t, order_offset_t, volume_t, price_t, primary_order_ref_t);

宿主调用插件报单,依次传入订单类型、合约、方向、开平、数量、价格和主引用。插件可能补充主引用字段;空引用表示失败。IBKR 当前实现处理普通限价和市价,不能假定所有枚举均受支持。

示例:

void demo(trade_source_plugin_t &api, const instrument_t &instrument, primary_order_ref_t primary) {
    const auto ref = api.trade_source_insert_order(
        order_type_t::NORMAL_LIMIT_ORDER, instrument, order_direction_t::BUY,
        order_offset_t::INCREASE, 1, 100.0, primary);
    if (!ref) {
        // 请求阶段未得到有效引用。
    }
}

trade_source_cancel_order

virtual last_error_id_t trade_source_cancel_order(primary_order_ref_t, const instrument_t&, secondary_order_ref_t);

按主引用、合约配置和次级引用发起撤单。CTP 使用柜台订单号,IBKR 当前实现主要使用主引用中的递增部分。返回 NO_ERROR 后仍须等待异步回报。

示例:

void demo(trade_source_plugin_t &api, primary_order_ref_t primary, const instrument_t &instrument, secondary_order_ref_t secondary) {
    const auto error = api.trade_source_cancel_order(primary, instrument, secondary);
    const bool submitted = error == last_error_id_t::NO_ERROR;
    (void)submitted;
}

trade_source_get_trade_day

virtual trade_day_t trade_source_get_trade_day();

读取交易源的交易日字符串。CTP 与登录时的交易日相关;当前 IBKR 实现返回 IBKR_CONST_TRADE_DAY,不能统一按日期解析。

示例:

void demo(trade_source_plugin_t &api) {
    const trade_day_t day = api.trade_source_get_trade_day();
    (void)day;
}

trade_source_unload

virtual void trade_source_unload();

卸载交易源并终止连接、定时器和工作线程。

示例:

void demo(trade_source_plugin_t &api) {
    api.trade_source_unload();
}