FAST/FIXを使用したシンプルなC++スキャルパーの開発:ステップバイステップガイド
高頻度取引アーキテクチャ:高速FIX/FASTネットワークデータストリームを処理するC++アルゴリズムボットの可視化。
こんにちは、みなさん!今日は、FAST/FIXプロトコルを使用してC++で最初のトレーディングスキャルパーボットを構築する方法をお見せします。多くの人がアルゴリズム取引は極めて複雑で、ヘッジファンドの経験を持つエリートプログラマーにしかアクセスできないと信じています。しかし正直に言うと、特にFAST/FIX経由で取引所へのアクセスがすでにある場合は、小さなところから始めることができます。
何が必要?
コードに入る前に、ツールキットを準備しましょう:
- C++コンパイラ(GCC、Clang、またはMSVC)
- FIX/FAST用ライブラリ(例:OnixS C++ FIX Engine)
- 便利なIDE(Visual Studio、CLion、またはお好みのもの)
- 濃いコーヒー一杯(任意ですが、強く推奨)
FIX/FASTプロトコルの理解
FAST/FIX経由で取引所へのアクセスがすでにある場合、おそらくご存知でしょう:
FIX (Financial Information eXchange) は、金融情報を交換するための標準プロトコルです。「BUY BTCUSD QTY=1 PRICE=50000」のような電文を想像してください。ただし、より形式化されたフォーマットです。
FAST (FIX Adapted for Streaming) は、高速データ転送に最適化されたFIXの「ターボバージョン」です。FIXが普通郵便なら、FASTはステロイドを使った気送管郵便です。

スキャルパーのアーキテクチャ
自尊心のあるスキャルパーには以下のコンポーネントが必要です:
- 取引所接続モジュール — 大きなお金の世界への橋
- マーケットデータ処理モジュール — 私たちの「目と耳」
- 意思決定モジュール — 私たちの「脳」
- 注文管理モジュール — 私たちの「手」
- リスク管理モジュール — 私たちの「自己保存本能」
将来のボットの骨格をスケッチしましょう:
#include <iostream>
#include <string>
#include <onixs/fix/engine.h> // Presumed library for FIX
class SimpleScalper {
private:
// Connection parameters
std::string senderCompID;
std::string targetCompID;
std::string fixVersion;
// Trading parameters
double stopLossPercentage = 0.05; // 5% stop-loss
double profitTargetPercentage = 0.1; // 10% profit target
double tradeAmount = 0.1; // Position size
// Trading state
bool inPosition = false;
double entryPrice = 0.0;
// FIX connection
onixs::fix::Session* session;
public:
SimpleScalper(const std::string& sender, const std::string& target, const std::string& version)
: senderCompID(sender), targetCompID(target), fixVersion(version) {
// Initialize FIX connection
initializeFixConnection();
}
// Other methods...
};
取引所への接続
まず、取引所との接続を確立する必要があります。これは最初の握手のようなもの — 失敗しないことが重要です:
void SimpleScalper::initializeFixConnection() {
// Create session configuration
onixs::fix::SessionConfig config;
config.setSenderCompID(senderCompID);
config.setTargetCompID(targetCompID);
config.setFixVersion(fixVersion);
// Set connection parameters
config.setHost("exchange.hostname.com");
config.setPort(9823); // Exchange FIX port
// Create and initialize session
session = new onixs::fix::Session(config);
// Register event handlers
session->setMessageHandler(std::bind(&SimpleScalper::onMessage, this, std::placeholders::_1));
// Establish connection
if (!session->connect()) {
std::cerr << "Failed to connect to the exchange!" << std::endl;
} else {
std::cout << "Connection established!" << 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 << "Sending BUY order: " << amount << " @ " << price << std::endl;
// Here we form and send a FIX NewOrderSingle
// ...
}
取引所からのレスポンス処理
void SimpleScalper::onMessage(const onixs::fix::Message& message) {
std::string msgType = message.getField(onixs::fix::Tag::MsgType);
if (msgType == "8") { // ExecutionReport
// Handle execution report
} else if (msgType == "W") { // MarketDataSnapshotFullRefresh
// Handle market data
} else if (msgType == "3") { // Reject
std::string reason = message.getField(onixs::fix::Tag::Text);
std::cout << "Order rejected: " << 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) {
// emulate market data
// scalper.processMarketData(...);
}
// scalper.printPerformanceStats();
}
結論
以上です!FAST/FIXプロトコルを使用したシンプルで機能的なC++スキャルパーを構築しました。もちろん、これはほんの始まりです。実際のHFTシステムははるかに複雑で最適化されていますが、このようなシンプルなボットでもアルゴリズム取引初心者にとっては有用です。
金融市場での取引にはリスクが伴い、アルゴリズム取引はその上に技術的リスクを追加することを覚えておいてください。本番稼働前に、常にヒストリカルデータおよびシミュレーションモードで戦略をテストしてください。
そして最も重要なのは — 学び続け、ボットを改善し続けることです。市場は変化し、あなたのアルゴリズムもそれに適応しなければなりません。
楽しいトレーディングを。あなたのスキャルパーが常に利益を出せますように!
Citation
@software{soloviov2024scalpercppfastfix,
author = {Soloviov, Eugen},
title = {Developing a Simple C++ Scalper Using FAST/FIX: Step-by-Step Guide},
year = {2025},
url = {https://marketmaker.cc/en/blog/post/scalper-cpp-fast-fix},
version = {0.1.0},
description = {A step-by-step guide to building a C++ trading scalper bot using FAST/FIX protocols.}
}
MarketMaker.cc Team
クオンツ・リサーチ&戦略