การพัฒนาสกัลเปอร์ 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) คือโปรโตคอลมาตรฐานสำหรับแลกเปลี่ยนข้อมูลทางการเงิน ลองนึกภาพโทรเลขแบบ "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();
}
สรุป
เท่านี้แหละ! เราได้สร้างสกัลเปอร์ C++ แบบง่ายแต่ใช้งานได้จริงโดยใช้โปรโตคอล FAST/FIX แน่นอนว่านี่เป็นเพียงจุดเริ่มต้นเท่านั้น ระบบ HFT จริงๆ มีความซับซ้อนและถูกปรับแต่งมากกว่านี้มาก แต่แม้แต่บอทแบบง่ายนี้ก็ยังมีประโยชน์สำหรับนักเทรดอัลกอริทึมมือใหม่
จำไว้ว่าการเทรดในตลาดการเงินมีความเสี่ยง และการเทรดเชิงอัลกอริทึมยังเพิ่มความเสี่ยงทางเทคนิคเข้ามาอีก ควรทดสอบกลยุทธ์ของคุณบนข้อมูลในอดีตและในโหมดจำลองเสมอก่อนที่จะใช้งานจริง
และที่สำคัญที่สุด – คงเรียนรู้และพัฒนาบอทของคุณต่อไป ตลาดเปลี่ยนแปลงอยู่เสมอ และอัลกอริทึมของคุณต้องปรับตัวตาม
ขอให้เทรดดีมีกำไร และขอให้สกัลเปอร์ของคุณทำกำไรได้เสมอ!
การอ้างอิง
@software{soloviov2024scalpercppfastfix,
author = {Soloviov, Eugen},
title = {Developing a Simple C++ Scalper Using FAST/FIX: Step-by-Step Guide},
year = {2025},
url = {https://marketmaker.cc/th/blog/post/scalper-cpp-fast-fix},
version = {0.1.0},
description = {คู่มือทีละขั้นตอนสำหรับการสร้างบอทสกัลเปอร์เทรดดิ้งด้วย C++ โดยใช้โปรโตคอล FAST/FIX}
}
ผู้เขียน
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.