К списку статей
May 19, 2025
5 мин. чтения

Разработка простого скальпера на C++ с использованием FAST/FIX: пошаговое руководство

C++
алготрейдинг
скальпинг
FIX
FAST
робот
финансы

Привет, друзья! Сегодня я расскажу, как создать своего первого торгового робота-скальпера на C++, используя протоколы FAST/FIX. Многие считают, что алготрейдинг - это что-то запредельно сложное, доступное только избранным гуру программирования с опытом работы в хедж-фондах. Но давайте посмотрим правде в глаза: начать можно с малого, особенно если у вас уже есть доступ к бирже по FAST/FIX.

Что нам понадобится?

Прежде чем мы погрузимся в код, давайте подготовим наш арсенал:

  • C++ компилятор (GCC, Clang или MSVC)
  • Библиотека для работы с FIX/FAST (например, OnixS C++ FIX Engine)
  • Удобная IDE (Visual Studio, CLion или что вам больше нравится)
  • Чашка крепкого кофе (это не обязательно, но настоятельно рекомендуется)

Понимаем FIX/FAST протоколы

Если вы уже имеете доступ к бирже через FAST/FIX, то наверняка знаете, что:

FIX (Financial Information eXchange) - это стандартный протокол для обмена финансовой информацией. Представьте себе телеграммы в стиле "КУПИТЬ BTCUSD КОЛИЧЕСТВО=1 ЦЕНА=50000", только в более формализованном виде.

FAST (FIX Adapted for Streaming) - это "турбо-версия" FIX, оптимизированная для скоростной передачи данных. Если FIX - это обычная почта, то FAST - это пневматическая почта на стероидах.

Архитектура нашего скальпера

Любой уважающий себя скальпер должен иметь следующие компоненты:

  1. Модуль подключения к бирже - наш мост в мир больших денег
  2. Модуль обработки рыночных данных - наши "глаза и уши"
  3. Модуль принятия решений - наш "мозг"
  4. Модуль управления ордерами - наши "руки"
  5. Модуль управления рисками - наш "инстинкт самосохранения"

Давайте набросаем скелет нашего будущего робота:

#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 << "Отправка BUY ордера: " << 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 << "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) {
        // эмулируем рыночные данные
        // scalper.processMarketData(...);
    }
    // scalper.printPerformanceStats();
}

Заключение

Вот и всё! Мы создали простого, но функционального скальпера на C++ с использованием FAST/FIX протоколов. Конечно, это только начало пути. Настоящие HFT-системы гораздо сложнее и оптимизированнее, но даже такой простой робот может быть полезен для начинающего алготрейдера.

Помните, что торговля на финансовых рынках сопряжена с рисками, а алгоритмическая торговля добавляет к ним еще и технические риски. Всегда тестируйте свои стратегии на исторических данных и в режиме симуляции, прежде чем запускать их на реальные деньги.

И самое главное - постоянно учитесь и совершенствуйте своего робота. Рынки меняются, и ваши алгоритмы должны адаптироваться вместе с ними.

Удачной торговли и пусть ваш скальпер приносит только профит!

Цитирование

@software{soloviov2024scalpercppfastfix,
  author = {Soloviov, Eugen},
  title = {Разработка простого скальпера на C++ с использованием FAST/FIX: пошаговое руководство},
  year = {2025},
  url = {https://marketmaker.cc/ru/blog/post/scalper-cpp-fast-fix},
  version = {0.1.0},
  description = {Пошаговое руководство по созданию торгового робота-скальпера на C++ с использованием протоколов FAST/FIX.}
}

MarketMaker.cc Team

Количественные исследования и стратегии

Обсудить в Telegram