QAULTRA C++ 使用示例
October 1, 2025 · View on GitHub
版本: 1.0.0 最后更新: 2025-10-01
目录
基础示例
Hello QAULTRA
最简单的示例 - 创建账户并下单:
#include <qaultra/market/market_system.hpp>
#include <qaultra/account/qa_account.hpp>
#include <iostream>
int main() {
using namespace qaultra;
// 1. 创建市场系统
auto market = std::make_shared<market::QAMarketSystem>();
// 2. 注册账户
market->register_account("my_account", 1000000.0);
// 3. 获取账户
auto account = market->get_account("my_account");
// 4. 买入股票
account->buy("000001.XSHE", 100, 10.5);
// 5. 查询持仓
auto positions = account->get_positions();
for (const auto& [code, pos] : positions) {
std::cout << "持仓 " << code << ": " << pos.volume << " 股\n";
}
// 6. 获取 QIFI 快照
auto qifi = account->get_qifi();
std::cout << "账户权益: " << qifi.account.balance << "\n";
std::cout << "可用资金: " << qifi.account.available << "\n";
return 0;
}
编译运行:
g++ -std=c++17 hello_qaultra.cpp -o hello_qaultra \
-I../include -L../build -lqaultra -lpthread
./hello_qaultra
账户管理
股票账户操作
#include <qaultra/market/market_system.hpp>
#include <iostream>
void stock_trading_example() {
using namespace qaultra;
auto market = std::make_shared<market::QAMarketSystem>();
market->register_account("stock_account", 1000000.0);
auto account = market->get_account("stock_account");
// 买入股票
account->buy("000001.XSHE", 100, 10.0); // 买入100股平安银行
account->buy("600000.XSHG", 200, 8.5); // 买入200股浦发银行
// 卖出股票
account->sell("000001.XSHE", 50, 10.5); // 卖出50股
// 查看持仓
std::cout << "=== 持仓明细 ===\n";
for (const auto& [code, pos] : account->get_positions()) {
std::cout << code << ":\n"
<< " 数量: " << pos.volume << "\n"
<< " 成本: " << pos.cost_price << "\n"
<< " 盈亏: " << pos.profit << "\n";
}
// 查看资金
std::cout << "\n=== 资金状况 ===\n";
std::cout << "现金: " << account->get_cash() << "\n";
std::cout << "可用: " << account->get_available_cash() << "\n";
}
期货账户操作
#include <qaultra/market/market_system.hpp>
#include <iostream>
void futures_trading_example() {
using namespace qaultra;
auto market = std::make_shared<market::QAMarketSystem>();
market->register_account("futures_account", 500000.0);
auto account = market->get_account("futures_account");
// 买入开仓(做多)
account->buy_open("IF2410", 1, 4000.0); // 买入1手沪深300
// 卖出开仓(做空)
account->sell_open("IC2410", 2, 6000.0); // 卖出2手中证500
// 平仓操作
account->sell_close("IF2410", 1, 4050.0); // 平多头
account->buy_close("IC2410", 1, 5950.0); // 平空头
// 平今仓
account->sell_closetoday("IF2410", 1, 4100.0);
// 查看持仓
std::cout << "=== 期货持仓 ===\n";
for (const auto& [code, pos] : account->get_positions()) {
std::cout << code << ":\n"
<< " 多头: " << pos.volume_long << "\n"
<< " 空头: " << pos.volume_short << "\n"
<< " 保证金: " << pos.margin << "\n"
<< " 持仓盈亏: " << pos.position_profit << "\n";
}
}
多账户管理
void multi_account_example() {
using namespace qaultra;
auto market = std::make_shared<market::QAMarketSystem>(
"/data/market", "portfolio_2025"
);
// 注册多个账户
market->register_account("stock_account", 1000000.0);
market->register_account("futures_account", 500000.0);
market->register_account("options_account", 300000.0);
// 获取所有账户名称
auto account_names = market->get_account_names();
std::cout << "管理 " << account_names.size() << " 个账户:\n";
for (const auto& name : account_names) {
auto account = market->get_account(name);
std::cout << " - " << name
<< " (权益: " << account->get_cash() << ")\n";
}
// 分别操作不同账户
auto stock_acc = market->get_account("stock_account");
stock_acc->buy("000001.XSHE", 100, 10.0);
auto futures_acc = market->get_account("futures_account");
futures_acc->buy_open("IF2410", 1, 4000.0);
}
市场系统
时间管理
void time_management_example() {
using namespace qaultra;
auto market = std::make_shared<market::QAMarketSystem>();
market->register_account("acc_001", 1000000.0);
// 设置交易日期
market->set_date("2025-01-02");
std::cout << "当前日期: " << market->get_date() << "\n";
// 模拟日内交易
std::vector<std::string> time_points = {
"2025-01-02 09:30:00", // 开盘
"2025-01-02 10:00:00",
"2025-01-02 11:30:00", // 午盘
"2025-01-02 13:00:00",
"2025-01-02 15:00:00" // 收盘
};
auto account = market->get_account("acc_001");
for (const auto& time : time_points) {
market->set_datetime(time);
std::cout << "\n时间: " << market->get_datetime() << "\n";
// 根据时间执行不同策略
if (time.find("09:30") != std::string::npos) {
account->buy("000001.XSHE", 100, 10.0);
std::cout << " → 开盘买入\n";
} else if (time.find("15:00") != std::string::npos) {
account->sell("000001.XSHE", 100, 10.5);
std::cout << " → 收盘卖出\n";
}
}
}
订单调度
void order_scheduling_example() {
using namespace qaultra;
auto market = std::make_shared<market::QAMarketSystem>();
market->register_account("acc_001", 1000000.0);
// 创建订单
market::MarketOrder order1;
order1.code = "000001.XSHE";
order1.amount = 100;
order1.price = 10.0;
order1.direction = "BUY";
order1.offset = "OPEN";
market::MarketOrder order2;
order2.code = "600000.XSHG";
order2.amount = 200;
order2.price = 8.5;
order2.direction = "BUY";
order2.offset = "OPEN";
// 添加到调度队列
market->schedule_order("acc_001", order1, "开仓订单1");
market->schedule_order("acc_001", order2, "开仓订单2");
std::cout << "订单已加入队列\n";
// 批量处理订单
std::cout << "开始处理订单...\n";
market->process_order_queue();
std::cout << "订单处理完成\n";
// 查看结果
auto account = market->get_account("acc_001");
std::cout << "持仓数量: " << account->get_positions().size() << "\n";
}
QIFI 快照管理
void qifi_snapshot_example() {
using namespace qaultra;
auto market = std::make_shared<market::QAMarketSystem>();
market->register_account("acc_001", 1000000.0);
auto account = market->get_account("acc_001");
// 模拟交易过程
account->buy("000001.XSHE", 100, 10.0);
market->snapshot_all_accounts(); // 快照 1
account->buy("600000.XSHG", 200, 8.5);
market->snapshot_all_accounts(); // 快照 2
account->sell("000001.XSHE", 50, 10.5);
market->snapshot_all_accounts(); // 快照 3
// 获取快照历史
auto snapshots = market->get_account_snapshots("acc_001");
std::cout << "共 " << snapshots.size() << " 个快照:\n";
for (size_t i = 0; i < snapshots.size(); ++i) {
const auto& qifi = snapshots[i];
std::cout << "\n快照 " << (i + 1) << ":\n"
<< " 权益: " << qifi.account.balance << "\n"
<< " 可用: " << qifi.account.available << "\n"
<< " 持仓数: " << qifi.positions.size() << "\n"
<< " 订单数: " << qifi.orders.size() << "\n";
}
}
回测示例
简单均线策略回测
#include <qaultra/market/market_system.hpp>
#include <vector>
#include <numeric>
// 计算简单移动平均
double sma(const std::vector<double>& prices, size_t period) {
if (prices.size() < period) return 0.0;
double sum = std::accumulate(
prices.end() - period, prices.end(), 0.0
);
return sum / period;
}
void sma_strategy_backtest() {
using namespace qaultra;
auto market = std::make_shared<market::QAMarketSystem>(
"/data/stock", "sma_portfolio"
);
market->register_account("strategy_account", 1000000.0);
// 获取历史数据
auto bars = market->get_stock_day(
"000001.XSHE",
"2024-01-01",
"2024-12-31"
);
std::cout << "回测数据: " << bars.size() << " 天\n";
std::vector<double> close_prices;
auto account = market->get_account("strategy_account");
// 遍历每一天
for (size_t i = 0; i < bars.size(); ++i) {
const auto& bar = bars[i];
close_prices.push_back(bar.close);
market->set_date(bar.date.to_string());
if (i < 20) continue; // 需要至少20天数据
// 计算 MA5 和 MA20
double ma5 = sma(close_prices, 5);
double ma20 = sma(close_prices, 20);
// 金叉买入,死叉卖出
auto positions = account->get_positions();
bool has_position = positions.find("000001.XSHE") != positions.end();
if (ma5 > ma20 && !has_position) {
// 金叉买入
account->buy("000001.XSHE", 100, bar.close);
std::cout << bar.date.to_string() << " 买入: " << bar.close << "\n";
} else if (ma5 < ma20 && has_position) {
// 死叉卖出
account->sell("000001.XSHE", 100, bar.close);
std::cout << bar.date.to_string() << " 卖出: " << bar.close << "\n";
}
// 保存快照
market->snapshot_all_accounts();
}
// 输出回测结果
auto qifi = account->get_qifi();
std::cout << "\n=== 回测结果 ===\n";
std::cout << "初始资金: 1000000.0\n";
std::cout << "最终权益: " << qifi.account.balance << "\n";
std::cout << "收益: " << (qifi.account.balance - 1000000.0) << "\n";
std::cout << "收益率: "
<< ((qifi.account.balance - 1000000.0) / 1000000.0 * 100)
<< "%\n";
}
使用回测框架
void backtest_framework_example() {
using namespace qaultra;
auto market = std::make_shared<market::QAMarketSystem>(
"/data/stock", "backtest_2025"
);
market->register_account("bt_account", 1000000.0);
// 定义策略函数
auto my_strategy = [](market::QAMarketSystem& m) {
auto account = m.get_account("bt_account");
auto date = m.get_date();
// 简单策略:每5天买入一次
static int day_count = 0;
if (++day_count % 5 == 0) {
account->buy("000001.XSHE", 100, 10.0);
std::cout << date << " 买入\n";
}
};
// 运行回测
market->run_backtest(
"2024-01-01",
"2024-12-31",
my_strategy
);
// 查看结果
auto snapshots = market->get_account_snapshots("bt_account");
std::cout << "生成 " << snapshots.size() << " 个快照\n";
}
IPC 零拷贝通信
数据发布者 (Publisher)
#include <qaultra/ipc/broadcast_hub_v2.hpp>
#include <iostream>
#include <vector>
void ipc_publisher_example() {
using namespace qaultra::ipc;
// 配置
BroadcastConfig config;
config.max_subscribers = 100;
config.batch_size = 1000;
config.zero_copy_enabled = true;
// 创建广播器
DataBroadcaster broadcaster(config);
// 模拟市场数据
std::vector<uint8_t> tick_data(1000);
for (size_t i = 0; i < tick_data.size(); ++i) {
tick_data[i] = static_cast<uint8_t>(i % 256);
}
// 发送数据
std::cout << "开始发送数据...\n";
for (int i = 0; i < 1000; ++i) {
broadcaster.broadcast(
"market_stream",
tick_data,
tick_data.size(),
MarketDataType::Tick
);
if (i % 100 == 0) {
std::cout << "已发送 " << i << " 条数据\n";
}
}
// 获取统计信息
auto stats = broadcaster.get_stats();
std::cout << "\n=== 发送统计 ===\n";
std::cout << "总消息数: " << stats.total_messages << "\n";
std::cout << "成功率: " << stats.success_rate << "%\n";
std::cout << "吞吐量: " << stats.throughput_per_sec << " msg/sec\n";
}
数据订阅者 (Subscriber)
#include <qaultra/ipc/broadcast_hub_v2.hpp>
#include <iostream>
void ipc_subscriber_example() {
using namespace qaultra::ipc;
BroadcastConfig config;
config.max_subscribers = 100;
// 创建订阅者
DataSubscriber subscriber(config, "market_stream");
std::cout << "开始接收数据...\n";
int count = 0;
while (count < 1000) {
// 非阻塞接收
auto data = subscriber.receive_nowait();
if (data.has_value()) {
count++;
std::cout << "收到数据 " << count
<< ", 大小: " << data->size() << "\n";
}
}
std::cout << "接收完成,共 " << count << " 条数据\n";
}
跨语言通信 (C++ ↔ Rust)
C++ 发布者:
#include <qaultra/ipc/cross_lang_data.hpp>
void cross_lang_publisher() {
using namespace qaultra::ipc;
CrossLangDataPublisher publisher("cross_lang_stream");
// 发送跨语言数据
CrossLangMarketData data;
data.code = "000001.XSHE";
data.price = 10.5;
data.volume = 1000;
data.timestamp = std::time(nullptr);
publisher.publish(data);
std::cout << "已发送跨语言数据\n";
}
Rust 订阅者 (在 Rust 代码中):
use qaultra::ipc::CrossLangDataSubscriber;
fn cross_lang_subscriber() {
let subscriber = CrossLangDataSubscriber::new("cross_lang_stream");
while let Some(data) = subscriber.receive() {
println!("收到数据: {} @ {} x {}",
data.code, data.price, data.volume);
}
}
数据库集成
MongoDB 保存 QIFI
#include <qaultra/connector/mongodb_connector.hpp>
#include <qaultra/market/market_system.hpp>
void mongodb_save_example() {
using namespace qaultra;
// 创建 MongoDB 连接
connector::MongoDBConnector db("mongodb://localhost:27017");
// 创建市场系统和账户
auto market = std::make_shared<market::QAMarketSystem>();
market->register_account("acc_001", 1000000.0);
auto account = market->get_account("acc_001");
// 交易操作
account->buy("000001.XSHE", 100, 10.0);
account->buy("600000.XSHG", 200, 8.5);
// 获取 QIFI 并保存到 MongoDB
auto qifi = account->get_qifi();
db.save_qifi(qifi);
std::cout << "QIFI 已保存到 MongoDB\n";
}
MongoDB 查询 QIFI
void mongodb_query_example() {
using namespace qaultra;
connector::MongoDBConnector db("mongodb://localhost:27017");
// 查询指定日期范围的 QIFI
auto qifis = db.query_qifi(
"acc_001",
"2025-01-01",
"2025-01-31"
);
std::cout << "查询到 " << qifis.size() << " 条 QIFI 记录\n";
for (const auto& qifi : qifis) {
std::cout << "账户: " << qifi.account_cookie
<< ", 权益: " << qifi.account.balance << "\n";
}
}
高级用法
自定义市场数据源
#include <qaultra/data/marketcenter.hpp>
class MyCustomMarketCenter : public qaultra::data::QAMarketCenter {
public:
std::vector<qaultra::data::StockCnDay> get_stock_day(
const std::string& code,
const std::string& start,
const std::string& end) override
{
std::vector<qaultra::data::StockCnDay> result;
// 自定义数据加载逻辑
// 例如:从 CSV 文件、Redis、或 API 加载
result = load_from_custom_source(code, start, end);
return result;
}
private:
std::vector<qaultra::data::StockCnDay> load_from_custom_source(
const std::string& code,
const std::string& start,
const std::string& end)
{
// 实现自定义加载逻辑
// ...
return {};
}
};
void custom_data_source_example() {
auto custom_mc = std::make_shared<MyCustomMarketCenter>();
auto market = std::make_shared<qaultra::market::QAMarketSystem>(custom_mc);
// 使用自定义数据源
auto bars = market->get_stock_day("000001.XSHE", "2024-01-01", "2024-12-31");
}
批量操作
#include <qaultra/account/batch_operations.hpp>
void batch_operations_example() {
using namespace qaultra;
auto market = std::make_shared<market::QAMarketSystem>();
market->register_account("acc_001", 1000000.0);
market->register_account("acc_002", 1000000.0);
// 创建批量操作处理器
account::BatchOrderProcessor processor;
// 准备账户列表
std::vector<std::shared_ptr<account::QA_Account>> accounts = {
market->get_account("acc_001"),
market->get_account("acc_002")
};
// 准备订单列表
std::vector<account::Order> orders;
// ... 填充订单
// 批量下单
size_t success_count = processor.batch_place_orders(accounts, orders);
std::cout << "成功下单: " << success_count << "/" << orders.size() << "\n";
}
性能分析
#include <qaultra/analysis/performance_analyzer.hpp>
#include <chrono>
void performance_analysis_example() {
using namespace qaultra;
auto market = std::make_shared<market::QAMarketSystem>();
market->register_account("acc_001", 1000000.0);
auto account = market->get_account("acc_001");
// 模拟交易
account->buy("000001.XSHE", 100, 10.0);
account->sell("000001.XSHE", 100, 10.5);
// 性能分析
analysis::PerformanceAnalyzer analyzer;
auto qifi = account->get_qifi();
auto metrics = analyzer.analyze(qifi);
std::cout << "=== 性能指标 ===\n";
std::cout << "总收益: " << metrics.total_return << "\n";
std::cout << "夏普比率: " << metrics.sharpe_ratio << "\n";
std::cout << "最大回撤: " << metrics.max_drawdown << "\n";
std::cout << "胜率: " << metrics.win_rate << "%\n";
}
完整策略示例
动量策略回测
#include <qaultra/market/market_system.hpp>
#include <algorithm>
#include <cmath>
class MomentumStrategy {
private:
qaultra::market::QAMarketSystem& market_;
std::string account_name_;
int lookback_period_;
public:
MomentumStrategy(qaultra::market::QAMarketSystem& market,
const std::string& account_name,
int lookback_period = 20)
: market_(market)
, account_name_(account_name)
, lookback_period_(lookback_period) {}
double calculate_momentum(const std::vector<double>& prices) {
if (prices.size() < 2) return 0.0;
return (prices.back() - prices.front()) / prices.front();
}
void on_bar(const qaultra::data::StockCnDay& bar,
const std::vector<double>& price_history) {
if (price_history.size() < lookback_period_) return;
auto account = market_.get_account(account_name_);
auto positions = account->get_positions();
bool has_position = positions.find(bar.order_book_id) != positions.end();
// 计算动量
std::vector<double> recent_prices(
price_history.end() - lookback_period_,
price_history.end()
);
double momentum = calculate_momentum(recent_prices);
// 交易逻辑
if (momentum > 0.05 && !has_position) {
// 正动量且无持仓,买入
account->buy(bar.order_book_id, 100, bar.close);
std::cout << bar.date.to_string() << " 买入 (动量=" << momentum << ")\n";
} else if (momentum < -0.05 && has_position) {
// 负动量且有持仓,卖出
account->sell(bar.order_book_id, 100, bar.close);
std::cout << bar.date.to_string() << " 卖出 (动量=" << momentum << ")\n";
}
}
};
void momentum_strategy_backtest() {
using namespace qaultra;
auto market = std::make_shared<market::QAMarketSystem>(
"/data/stock", "momentum_portfolio"
);
market->register_account("strategy_acc", 1000000.0);
MomentumStrategy strategy(*market, "strategy_acc", 20);
// 获取数据
auto bars = market->get_stock_day("000001.XSHE", "2024-01-01", "2024-12-31");
std::vector<double> price_history;
// 回测循环
for (const auto& bar : bars) {
price_history.push_back(bar.close);
market->set_date(bar.date.to_string());
strategy.on_bar(bar, price_history);
market->snapshot_all_accounts();
}
// 结果分析
auto account = market->get_account("strategy_acc");
auto qifi = account->get_qifi();
std::cout << "\n=== 回测结果 ===\n";
std::cout << "最终权益: " << qifi.account.balance << "\n";
std::cout << "收益率: "
<< ((qifi.account.balance - 1000000.0) / 1000000.0 * 100) << "%\n";
}
编译所有示例
创建 CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
project(qaultra_examples)
set(CMAKE_CXX_STANDARD 17)
find_package(qaultra REQUIRED)
# Hello QAULTRA
add_executable(hello_qaultra hello_qaultra.cpp)
target_link_libraries(hello_qaultra qaultra::qaultra)
# 股票交易
add_executable(stock_trading stock_trading.cpp)
target_link_libraries(stock_trading qaultra::qaultra)
# 回测示例
add_executable(backtest_example backtest.cpp)
target_link_libraries(backtest_example qaultra::qaultra)
# IPC 示例
add_executable(ipc_pub_sub ipc_example.cpp)
target_link_libraries(ipc_pub_sub qaultra::qaultra)
编译运行:
mkdir build && cd build
cmake ..
make
./hello_qaultra
更多示例: 查看 examples/ 目录
API 文档: API_REFERENCE.md
问题反馈: GitHub Issues