← العودة إلى قائمة المقالات
May 19, 2025
5 دقائق للقراءة

تطوير سكالبر C++ بسيط باستخدام FAST/FIX: دليل خطوة بخطوة

تطوير سكالبر C++ بسيط باستخدام FAST/FIX: دليل خطوة بخطوة
#C++
#algorithmic trading
#scalping
#FIX
#FAST
#bot
#finance

بوت سكالبر C++ بنية التداول عالي التردد: تصور لبوت خوارزمي بلغة C++ يعالج تدفقات بيانات شبكة FIX/FAST عالية السرعة.

مرحبًا يا أصدقاء! اليوم سأريكم كيفية بناء أول بوت سكالبر تداول بلغة C++ باستخدام بروتوكولات FAST/FIX. يعتقد كثيرون أن التداول الخوارزمي شيء بالغ التعقيد، لا يمكن الوصول إليه إلا للمبرمجين النخبة ذوي خبرة في صناديق التحوط. لكن لنكن صادقين: يمكنك البدء بالأشياء الصغيرة، خاصة إذا كان لديك بالفعل وصول إلى بورصة عبر FAST/FIX.

ماذا نحتاج؟

قبل الغوص في الكود، دعونا نجهز أدواتنا:

  • مترجم C++ (GCC أو Clang أو MSVC)
  • مكتبة للعمل مع FIX/FAST (مثل OnixS C++ FIX Engine)
  • بيئة تطوير مريحة (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 هو البريد الهوائي المعزز.

بنية سكالبر عالي التردد من خمس وحدات

بنية السكالبر

أي سكالبر يحترم نفسه يجب أن يحتوي على المكونات التالية:

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

الخلاصة

هذا كل شيء! لقد بنينا سكالبر C++ بسيطًا لكنه وظيفي باستخدام بروتوكولات FAST/FIX. بالطبع، هذه مجرد البداية. أنظمة 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

البحوث والاستراتيجيات الكمية

ناقش في تلغرام
Newsletter

ابقَ متقدماً على السوق

اشترك في نشرتنا الإخبارية للحصول على رؤى حصرية حول تداول الذكاء الاصطناعي وتحليلات السوق وتحديثات المنصة.

نحترم خصوصيتك. يمكنك إلغاء الاشتراك في أي وقت.