Sviluppo di un Semplice Scalper in C++ con FAST/FIX: Guida Passo dopo Passo
Architettura di Trading ad Alta Frequenza: Una visualizzazione di un bot algoritmico in C++ che elabora flussi di dati di rete FIX/FAST ad alta velocità.
Ciao, amici! Oggi vi mostrerò come costruire il vostro primo bot scalper di trading in C++ utilizzando i protocolli FAST/FIX. Molti credono che il trading algoritmico sia qualcosa di estremamente complesso, accessibile solo a programmatori d'élite con esperienza negli hedge fund. Ma siamo onesti: si può iniziare in piccolo, soprattutto se avete già accesso a un exchange tramite FAST/FIX.
Di Cosa Abbiamo Bisogno?
Prima di immergerci nel codice, prepariamo il nostro kit di strumenti:
- Compilatore C++ (GCC, Clang o MSVC)
- Libreria per lavorare con FIX/FAST (ad es. OnixS C++ FIX Engine)
- Un IDE conveniente (Visual Studio, CLion o il vostro preferito)
- Una tazza di caffè forte (opzionale, ma altamente consigliata)
Comprensione dei Protocolli FIX/FAST
Se avete già accesso a un exchange tramite FAST/FIX, probabilmente sapete che:
FIX (Financial Information eXchange) è un protocollo standard per lo scambio di informazioni finanziarie. Immaginate telegrammi come "ACQUISTA BTCUSD QTY=1 PRICE=50000", ma in un formato più formalizzato.
FAST (FIX Adapted for Streaming) è una "versione turbo" di FIX, ottimizzata per il trasferimento di dati ad alta velocità. Se FIX è la posta ordinaria, FAST è la posta pneumatica sotto steroidi.

L'Architettura del Nostro Scalper
Qualsiasi scalper che si rispetti dovrebbe avere i seguenti componenti:
- Modulo di connessione all'exchange – il nostro ponte verso il mondo del grande denaro
- Modulo di elaborazione dei dati di mercato – i nostri "occhi e orecchie"
- Modulo decisionale – il nostro "cervello"
- Modulo di gestione degli ordini – le nostre "mani"
- Modulo di gestione del rischio – il nostro "istinto di autoconservazione"
Sketchiamo lo scheletro del nostro futuro bot:
#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...
};
Connessione all'Exchange
Prima di tutto, dobbiamo stabilire una connessione con l'exchange. È come una prima stretta di mano – è importante non sbagliare:
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;
}
}
Elaborazione dei Dati di Mercato e Processo Decisionale
Per semplicità, implementiamo un indicatore RSI e la logica di base per l'entrata/uscita:
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));
}

Invio degli Ordini all'Exchange
Quando la nostra strategia dice "acquista" o "vendi", dobbiamo inviare l'ordine corrispondente all'exchange. È come ordinare al ristorante – bisogna essere precisi:
void SimpleScalper::sendBuyOrder(double amount, double price) {
std::cout << "Sending BUY order: " << amount << " @ " << price << std::endl;
// Here we form and send a FIX NewOrderSingle
// ...
}
Gestione delle Risposte dell'Exchange
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;
}
}
Test e Debug
Prima di far girare il nostro bot con denaro reale, testiamolo su dati storici o in modalità simulazione. È come un pilota che si allena su un simulatore prima di un volo reale:
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();
}
Conclusione
Ecco fatto! Abbiamo costruito un semplice ma funzionale scalper in C++ utilizzando i protocolli FAST/FIX. Naturalmente, questo è solo l'inizio. I sistemi HFT reali sono molto più complessi e ottimizzati, ma anche un bot così semplice può essere utile per un trader algoritmico alle prime armi.
Ricordate, il trading sui mercati finanziari comporta dei rischi, e il trading algoritmico aggiunge rischi tecnici in cima a questi. Testate sempre le vostre strategie su dati storici e in modalità simulazione prima di andare in produzione.
E soprattutto – continuate a imparare e a migliorare il vostro bot. I mercati cambiano, e i vostri algoritmi devono adattarsi con loro.
Buon trading, e che il vostro scalper sia sempre redditizio!
Citazione
@software{soloviov2024scalpercppfastfix,
author = {Soloviov, Eugen},
title = {Developing a Simple C++ Scalper Using FAST/FIX: Step-by-Step Guide},
year = {2025},
url = {https://marketmaker.cc/it/blog/post/scalper-cpp-fast-fix},
version = {0.1.0},
description = {Una guida passo dopo passo per costruire uno scalper bot di trading in C++ utilizzando i protocolli FAST/FIX.}
}
Autori
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.