Разработка простого скальпера на C++ с использованием FAST/FIX: пошаговое руководство
Привет, друзья! Сегодня я расскажу, как создать своего первого торгового робота-скальпера на 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 - это пневматическая почта на стероидах.
Архитектура нашего скальпера
Любой уважающий себя скальпер должен иметь следующие компоненты:
- Модуль подключения к бирже - наш мост в мир больших денег
- Модуль обработки рыночных данных - наши "глаза и уши"
- Модуль принятия решений - наш "мозг"
- Модуль управления ордерами - наши "руки"
- Модуль управления рисками - наш "инстинкт самосохранения"
Давайте набросаем скелет нашего будущего робота:
#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
Количественные исследования и стратегии