大家好!今天我将带你用 C++ 和 FAST/FIX 协议开发你的第一个剥头皮交易机器人。许多人认为算法交易极其复杂,只属于对冲基金的顶级程序员。但其实,只要你能通过 FAST/FIX 访问交易所,就可以从简单做起。
我们需要什么?
在开始编码之前,让我们准备好工具箱:
- C++ 编译器(GCC、Clang 或 MSVC)
- 用于 FIX/FAST 的库(如 OnixS C++ FIX Engine)
- 顺手的 IDE(Visual Studio、CLion 或你喜欢的)
- 一杯浓咖啡(可选,但强烈推荐)
了解 FIX/FAST 协议
如果你已经能通过 FAST/FIX 访问交易所,你应该知道:
FIX(金融信息交换协议) 是金融信息交换的标准协议。可以想象成"BUY BTCUSD QTY=1 PRICE=50000"这样的电报,只是更正式。
FAST(FIX 流式适配) 是 FIX 的"加速版",专为高速数据传输优化。如果说 FIX 是普通邮件,FAST 就是装了火箭的气动邮件。
剥头皮机器人的架构
一个合格的剥头皮机器人应包含以下模块:
- 交易所连接模块 —— 我们通往财富的桥梁
- 行情数据处理模块 —— 我们的"眼睛和耳朵"
- 决策模块 —— 我们的"大脑"
- 订单管理模块 —— 我们的"手"
- 风控模块 —— 我们的"自我保护本能"
让我们先搭建机器人的骨架:
#include <iostream>
#include <string>
#include <onixs/fix/engine.h> // 假设使用的 FIX 库
class SimpleScalper {
private:
// 连接参数
std::string senderCompID;
std::string targetCompID;
std::string fixVersion;
// 交易参数
double stopLossPercentage = 0.05; // 5% 止损
double profitTargetPercentage = 0.1; // 10% 止盈
double tradeAmount = 0.1; // 仓位大小
// 交易状态
bool inPosition = false;
double entryPrice = 0.0;
// FIX 连接
onixs::fix::Session* session;
public:
SimpleScalper(const std::string& sender, const std::string& target, const std::string& version)
: senderCompID(sender), targetCompID(target), fixVersion(version) {
// 初始化 FIX 连接
initializeFixConnection();
}
// 其他方法...
};
连接交易所
首先,我们需要与交易所建立连接。这就像第一次握手——一定要稳:
void SimpleScalper::initializeFixConnection() {
// 创建会话配置
onixs::fix::SessionConfig config;
config.setSenderCompID(senderCompID);
config.setTargetCompID(targetCompID);
config.setFixVersion(fixVersion);
// 设置连接参数
config.setHost("exchange.hostname.com");
config.setPort(9823); // 交易所 FIX 端口
// 创建并初始化会话
session = new onixs::fix::Session(config);
// 注册事件处理器
session->setMessageHandler(std::bind(&SimpleScalper::onMessage, this, std::placeholders::_1));
// 建立连接
if (!session->connect()) {
std::cerr << "连接交易所失败!" << std::endl;
} else {
std::cout << "连接成功!" << std::endl;
}
}
行情处理与决策
为简单起见,我们实现 RSI 指标和基础的进出场逻辑:
double calculateRSI(const std::vector<double>& prices, int period = 14) {
if (prices.size() < period + 1) return 50.0;
double sumGain = 0.0, sumLoss = 0.0;
for (size_t i = prices.size() - period; i < prices.size() - 1; ++i) {
double change = prices[i + 1] - prices[i];
if (change > 0) sumGain += change;
else sumLoss -= change;
}
if (sumLoss == 0) return 100.0;
double rs = sumGain / sumLoss;
return 100.0 - (100.0 / (1.0 + rs));
}
向交易所发送订单
当策略发出"买入"或"卖出"信号时,我们需要向交易所发送对应订单。就像点菜一样,要说清楚:
void SimpleScalper::sendBuyOrder(double amount, double price) {
std::cout << "发送买单: " << amount << " @ " << price << std::endl;
// 这里组装并发送 FIX NewOrderSingle
// ...
}
处理交易所响应
void SimpleScalper::onMessage(const onixs::fix::Message& message) {
std::string msgType = message.getField(onixs::fix::Tag::MsgType);
if (msgType == "8") { // ExecutionReport
// 处理成交回报
} else if (msgType == "W") { // MarketDataSnapshotFullRefresh
// 处理行情数据
} else if (msgType == "3") { // Reject
std::string reason = message.getField(onixs::fix::Tag::Text);
std::cout << "订单被拒绝: " << reason << std::endl;
}
}
测试与调试
在用真金白银运行机器人前,先用历史数据或仿真模式测试。这就像飞行员先在模拟器训练:
void testScalperOnHistoricalData() {
SimpleScalper scalper("TESTER", "EXCHANGE", "FIX.4.4");
std::vector<double> historicalPrices = loadHistoricalData("BTCUSD_1min_2023.csv");
for (const auto& price : historicalPrices) {
// 模拟行情数据
// scalper.processMarketData(...);
}
// scalper.printPerformanceStats();
}
总结
就是这样!我们用 FAST/FIX 协议开发了一个简单但实用的 C++ 剥头皮机器人。当然,这只是开始。真正的高频系统要复杂得多,但这样一个机器人对初学者来说已经很有价值。
请记住,金融市场交易有风险,算法交易还增加了技术风险。务必先用历史数据和仿真模式充分测试你的策略。
最重要的是——不断学习和优化你的机器人。市场在变,你的算法也要随之进化。
祝你交易顺利,剥头皮机器人带来持续盈利!
引用
@software{soloviov2024scalpercppfastfix,
author = {Soloviov, Eugen},
title = {使用 FAST/FIX 开发简单 C++ 剥头皮交易机器人:分步指南},
year = {2025},
url = {https://marketmaker.cc/zh/blog/post/scalper-cpp-fast-fix},
version = {0.1.0},
description = {分步讲解如何用 FAST/FIX 协议开发 C++ 剥头皮交易机器人。}
}
MarketMaker.cc Team
量化研究与策略