← 記事一覧に戻る
May 19, 2025
読了時間: 5分

FAST/FIXを使用したシンプルなC++スキャルパーの開発:ステップバイステップガイド

FAST/FIXを使用したシンプルなC++スキャルパーの開発:ステップバイステップガイド
#C++
#algorithmic trading
#scalping
#FIX
#FAST
#bot
#finance

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はステロイドを使った気送管郵便です。

高頻度スキャルパー5モジュールアーキテクチャ

スキャルパーのアーキテクチャ

自尊心のあるスキャルパーには以下のコンポーネントが必要です:

  1. 取引所接続モジュール — 大きなお金の世界への橋
  2. マーケットデータ処理モジュール — 私たちの「目と耳」
  3. 意思決定モジュール — 私たちの「脳」
  4. 注文管理モジュール — 私たちの「手」
  5. リスク管理モジュール — 私たちの「自己保存本能」

将来のボットの骨格をスケッチしましょう:

#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));
}

FIXプロトコル注文ライフサイクルシーケンス

取引所への注文送信

戦略が「買い」または「売り」と言ったとき、対応する注文を取引所に送信する必要があります。レストランで注文するようなもの — 正確であることが必要です:

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.}
}
blog.disclaimer

MarketMaker.cc Team

クオンツ・リサーチ&戦略

Telegramで議論する
Newsletter

市場の先を行く

ニュースレターを購読して、独占的なAI取引の洞察、市場分析、プラットフォームの更新情報を受け取りましょう。

プライバシーを尊重します。いつでも配信停止可能です。