Sumber dimuat naik... memuat...

Menjelajah FMZ: Amalan Protokol Komunikasi Antara Strategi Dagangan Langsung

Penulis:FMZ~Lydia, Dicipta: 2024-08-08 10:09:21, Dikemas kini: 2024-09-12 09:46:18

img

Dengan perkembangan pesat pasaran kewangan dan populariti perdagangan kuantitatif, semakin ramai peniaga mula bergantung pada strategi automatik untuk berdagang. Dalam proses ini, komunikasi dan penyelarasan antara strategi sangat penting. FMZ Quant Trading Platform membantu peniaga mencapai dok strategi yang lancar dan perkongsian data masa nyata dengan menyediakan protokol komunikasi yang cekap antara strategi perdagangan.

Artikel ini akan meneroka protokol komunikasi perdagangan langsung strategi perdagangan di platform FMZ, memperkenalkan konsep reka bentuknya, ciri-ciri fungsional dan kelebihan dalam aplikasi praktikal. Melalui analisis kes terperinci, kami akan menunjukkan bagaimana menggunakan protokol ini untuk mencapai komunikasi strategi yang cekap dan stabil dan meningkatkan pelaksanaan dan prestasi keuntungan strategi perdagangan.

Sama ada anda seorang peminat perdagangan kuantitatif yang baru bermula dengan FMZ atau pengaturcara profesional yang berpengalaman, artikel ini akan memberi anda wawasan berharga dan panduan operasi praktikal. Mari kita meneroka fungsi kuat platform FMZ dan belajar bagaimana mencapai kerjasama antara strategi melalui protokol komunikasi yang cekap, meningkatkan kecekapan perdagangan, dan menangkap peluang pasaran.

Senario Permintaan

    1. Perdagangan kolaboratif pelbagai strategi Senario permintaan: Dalam persekitaran pasaran yang kompleks, satu strategi mungkin tidak dapat mengatasi pelbagai kecemasan dan perubahan pasaran. Pedagang ingin menjalankan pelbagai strategi pada masa yang sama, seperti strategi penjejakan trend, strategi pembalikan purata, dan strategi arbitraj, dan biarkan strategi ini berkomunikasi dalam masa nyata untuk berkongsi maklumat pasaran dan isyarat perdagangan, dengan itu meningkatkan kecekapan dan kestabilan perdagangan secara keseluruhan.
    1. Arbitraj rentas pasaran Senario permintaan: Peniaga ingin menjalankan urus niaga arbitraj antara pasaran perdagangan yang berbeza. Sebagai contoh, arbitraj menggunakan perbezaan harga antara pasaran saham A dan pasaran saham Hong Kong. Apabila anomali harga berlaku di pasaran tertentu, strategi perlu segera memaklumkan strategi di pasaran lain untuk melakukan operasi pembelian dan penjualan yang sepadan untuk menangkap peluang arbitraj.
    1. Pengurusan risiko dan lindung nilai Senario permintaan: Satu strategi bertanggungjawab untuk mencari dan melaksanakan urus niaga berisiko tinggi dan tinggi dalam pasaran, manakala strategi lain memberi tumpuan kepada pemantauan risiko keseluruhan dan menjalankan operasi lindung nilai. Untuk memastikan bahawa tidak ada kerugian yang berlebihan semasa urus niaga berisiko tinggi, kedua-dua strategi ini perlu berkomunikasi dan berkongsi data dalam masa nyata untuk menyesuaikan kedudukan dan lindung nilai risiko dengan tepat pada masanya.
    1. Sistem dagangan yang diedarkan Senario permintaan: Institusi dagangan besar ingin menjalankan sistem dagangan yang diedarkan di beberapa pelayan fizikal untuk meningkatkan toleransi kesalahan dan prestasi sistem dagangan. Strategi pada pelayan ini perlu menyegerakkan data dan menyelaras operasi melalui protokol komunikasi untuk memastikan kestabilan dan operasi yang cekap keseluruhan sistem dagangan.
    1. Pemantauan pasaran dan amaran awal Senario permintaan: Strategi bertanggungjawab untuk pemantauan dinamik pasaran dalam masa nyata. Apabila terdapat perubahan besar di pasaran (seperti kejatuhan harga tiba-tiba atau lonjakan), strategi perlu segera memaklumkan strategi lain untuk mengambil tindakan tindak balas yang sesuai, seperti menutup kedudukan, menyesuaikan kedudukan, atau menambah kedudukan, untuk mengurangkan risiko atau merebut peluang perdagangan.
    1. Pengurusan strategi portfolio Senario permintaan: Pedagang menggunakan portfolio strategi untuk menguruskan pelaburan dalam kelas aset yang berbeza, dengan setiap strategi memberi tumpuan kepada kelas aset tertentu (seperti saham, bon, niaga hadapan, dll.).

Senario permintaan ini menunjukkan pelbagai kemungkinan dan kelebihan protokol komunikasi perdagangan langsung strategi perdagangan FMZ dalam aplikasi praktikal. Melalui komunikasi antara strategi yang berkesan, peniaga dapat mengatasi persekitaran pasaran yang kompleks, mengoptimumkan strategi perdagangan, dan meningkatkan kecekapan perdagangan dan keuntungan.

FMZ Protokol Komunikasi Terkapsul dan Fungsi Panggilan

Selepas memahami keperluan komunikasi antara perdagangan langsung, kita perlu mempertimbangkan bagaimana untuk melaksanakan keperluan ini. Ia tidak lebih daripada perdagangan langsung A yang berharap untuk bertukar maklumat dengan perdagangan langsung B. Walaupun keperluan kelihatan mudah, terdapat pelbagai butiran yang perlu dipersetujui menggunakan satu set protokol komunikasi. FMZ telah merangkumi beberapa protokol komunikasi yang popular.

mqtt / nats / amqp / kafka

Senibina Komunikasi

Senibina komunikasi adalah:

  • Pelayan (Proxy). Pelayan yang menjalankan protokol komunikasi diperlukan untuk menghantar mesej antara pelanggan dan penerbit. Pelayan ini boleh digunakan secara tempatan pada sistem dockers (untuk komunikasi perdagangan langsung tempatan) atau sebagai perkhidmatan jauh (untuk komunikasi perdagangan langsung lintas pelayan).
  • Pelanggan (penerima, penerbit). Program perdagangan langsung strategi di FMZ boleh difahami sebagai klien protokol komunikasi. Program masa nyata strategi boleh menjadi penerbit (pub) atau pelanggan (sub).

Fungsi Dail

Apabila menggunakan protokol ini pada platform FMZ, ia boleh dengan mudah difahami bahawa mqtt / nats / amqp / kafkaprotokol disatukan ke dalamDial()fungsi, danDial()fungsi ini digunakan untuk menerbitkan dan melanggan mesej. mesej yang diterbitkan ini diproksi (dikirim semula) kepada perdagangan langsung yang melanggan melalui pelayan protokol, jadi pelayan protokol mesti dijalankan terlebih dahulu. demi demonstrasi, kita menggunakan pelbagai penggunaan imej pelayan protokol dalam contoh berikut.

Fungsi dial dalam bahagian dokumentasi API:https://www.fmz.com/syntax-guide#fun_dial

Sebelum menyebarkan imej docker, ingat untuk memasang perisian docker terlebih dahulu.

img

Seterusnya, mari kita meneroka dan mengamalkan aplikasi protokol komunikasi yang disokong oleh FMZ.

Platform FMZ Praktik Protokol Komunikasi Dagangan Langsung

Protokol mqtt

MQTT (Message Queuing Telemetry Transport) adalah protokol penghantaran mesej ringan yang sangat sesuai untuk persekitaran rangkaian lebar jalur rendah, latensi tinggi atau tidak boleh dipercayai. Ia dicadangkan oleh Andy Stanford-Clark dan Arlen Nipper dari IBM pada tahun 1999 dan kemudian menjadi standard ISO (ISO / IEC PRF 20922).

Ciri-ciri utama protokol MQTT: mode penerbitan/langganan

  • Penerbitan: Pengeluar mesej menghantar mesej ke topik.
  • Langganan: Pengguna mesej melanggan topik yang menarik minat, dengan itu menerima mesej yang diterbitkan untuk topik itu.
  • Broker: MQTT menggunakan broker mesej sebagai perantara untuk meneruskan mesej, memastikan pemisahan antara penerbit dan pelanggan.

Penerbitan Pesan dan Langganan

Kerana kami menggunakan imej docker (gambar gergaji gergaji) perisian yang menyokong protokol MQTT untuk menyebarkan pelayan proksi MQTT, kami telah memasang docker terlebih dahulu dan tidak akan masuk ke dalam butiran kemudian.

Sebelum menjalankan perintah untuk menyebarkan imej, kita perlu menulis fail konfigurasi pelayan proksimosquitto.conf.

# Configure port number and remote access IP
listener 1883 0.0.0.0
# Setting up anonymous access
allow_anonymous true

Kemudian jalankan perintah penyebaran:

docker run --rm -p 1883:1883 -v ./mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto

Selepas imej pelayan proksi berjalan, berikut dipaparkan:

1723012640: mosquitto version 2.0.18 starting
1723012640: Config loaded from /mosquitto/config/mosquitto.conf.
1723012640: Opening ipv4 listen socket on port 1883.
1723012640: mosquitto version 2.0.18 running

Kemudian kita boleh menguji strategi untuk meletakkannya dalam amalan.

var conn = null

function main() {
    LogReset(1)
    var robotId = _G()
    Log("Current live trading robotId:", robotId)

    conn = Dial("mqtt://127.0.0.1:1883?topic=test_topic")
    if (!conn) {
        Log("Communication failure!")
        return 
    }

    for (var i = 0; i < 10; i++) {
        // Write
        var msg = "i: " + i + ", testQueue, robotA, robotId: " + robotId + ", time:" + _D()        
        conn.write(msg)
        Log("Write a message to testQueue:", msg)

        // Read
        Log("read:", conn.read(1000), "#FF0000")

        Sleep(1000)
    }    
}

function onexit() {
    conn.close()
    Log("close conn")
}

Penggunaan utama fungsi Dial dalam kod strategi adalah:

Dial("mqtt://127.0.0.1:1883?topic=test_topic")

Parameter rentetan fungsi Dial bermula denganmqtt://, yang merupakan nama protokol, diikuti dengan alamat dan port mendengar. Simbol ? diikuti dengan nama topik langganan/publikasi. Nama topik yang diuji di sini adalah:test_topic.

Strategi di atas menerbitkan dan melanggan topik pada masa yang sama.

img

Kami juga boleh menggunakan dua perdagangan langsung untuk melanggan satu sama lain dan menerbitkan maklumat topik. Kami menggunakan contoh seperti dalam seksyen amalan protokol nats, dan tidak akan mengulangi kaedah ini dalam protokol lain.

Nats Protokol

Protokol NATS adalah protokol gaya publish/subscribe berasaskan teks yang mudah. Klien menyambung ke gnatsd (server NATS) dan berkomunikasi dengan gnatsd. Komunikasi berdasarkan soket TCP/IP biasa dan menentukan satu set operasi yang sangat kecil. Newline menunjukkan penamatan. Tidak seperti sistem komunikasi mesej tradisional yang menggunakan format mesej binari, protokol NATS berasaskan teks menjadikan pelaksanaan klien sangat mudah dan boleh dengan mudah dilaksanakan dalam pelbagai bahasa pengaturcaraan atau bahasa skrip.

Setiap protokol mempunyai ciri-ciri tersendiri. anda boleh merujuk kepada dokumen dan bahan khusus, yang tidak akan diterangkan di sini.

Menerbitkan pelayan protokol NATS:

Docker run name nats rm -p 4222:4222 -p 8222:8222 nats http_port 8222 auth admin

Perintah docker ini akan memuat turun dan menjalankan imej nats secara automatik, dan port 4222 adalah port yang perlu diakses oleh pelanggan.

Listening for client connections on 0.0.0.0:4222
Server is ready

Imej pelayan Nats mula berjalan, mendengar pada port 4222.

Komunikasi Antara Strategi Dagangan Langsung Peranti Tempatan

Kita perlu membuat dua strategi (dagang langsung), mari kita namakan mereka Strategi A dan Strategi B. Kod kedua-dua strategi ini pada dasarnya sama.

  • Strategi A
var connPub = null 
var connSub = null

function main() {
    var robotId = _G()
    Log("Current live trading robotId:", robotId)

    connPub = Dial("nats://admin@127.0.0.1:4222?topic=pubRobotA")
    if (!connPub) {
        Log("Communication failure!")
        return 
    }

    connSub = Dial("nats://admin@127.0.0.1:4222?topic=pubRobotB")
    if (!connSub) {
        Log("Communication failure!")
        return 
    }

    while (true) {
        connPub.write("Message posted by robotA, robotId: " + robotId + ", time:" + _D())
        var msgRead = connSub.read(10000)
        if (msgRead) {
            Log("msgRead:", msgRead)
        }

        LogStatus(_D())
        Sleep(10000)
    }
}

function onexit() {
    connPub.close()
    connSub.close()
}
  • Strategi B
var connPub = null 
var connSub = null

function main() {
    var robotId = _G()
    Log("Current live trading robotId:", robotId)

    connPub = Dial("nats://admin@127.0.0.1:4222?topic=pubRobotB")
    if (!connPub) {
        Log("Communication failure!")
        return 
    }

    connSub = Dial("nats://admin@127.0.0.1:4222?topic=pubRobotA")
    if (!connSub) {
        Log("Communication failure!")
        return 
    }

    while (true) {
        connPub.write("Message posted by robotB, robotId: " + robotId + ", time:" + _D())
        var msgRead = connSub.read(10000)
        if (msgRead) {
            Log("msgRead:", msgRead)
        }

        LogStatus(_D())
        Sleep(10000)
    }
}

function onexit() {
    connPub.close()
    connSub.close()
}

Kedua-dua strategi ini hampir sama, kecuali mereka menerbitkan dan melanggan satu sama lain, dan topik yang dilabel, topik yang diterbitkan, dan maklumat yang diterbitkan adalah berbeza.

Ambil Strategi B sebagai contoh:

    1. GunakanDial()fungsi untuk mencipta objek pelayan sambungan pelangganconnPubuntuk penerbitan mesej topik:

var connPub = Panggil127.0.0.1:4222?topic=pubRobotB”)

Senar parameter fungsi Dial bermula dengannats://menunjukkan bahawa protokol NATS digunakan untuk komunikasi.adminadalah maklumat pengesahan mudahauth adminset apabila menggunakan imej Docker. Karakter @ digunakan untuk memisahkan kandungan berikut. Kemudian terdapat alamat perkhidmatan dan port127.0.0.1:4222Akhirnya, ada topik menerbitkan / melanggan:topic=pubRobotBPerhatikan bahawa simbol ? digunakan untuk memisahkannya dari alamat sebelumnya.

    1. GunakanDial()fungsi untuk mencipta objek pelayan sambungan pelangganconnSubuntuk langganan mesej topik:

var connSub = Panggil127.0.0.1:4222?topic=pubRobotA”)

Satu-satunya perbezaan adalahtopic=pubRobotA, kerana kita perlu melanggan topikpubRobotAdi mana strategi A menghantar maklumat.

Penciptaan dan penggunaan objek sambungan langganan dan penerbitan dalam strategi A adalah sama seperti yang diterangkan di atas.

  • Strategi A berjalan

img

  • Strategi B berjalan

img

Dengan cara ini, contoh mudah aplikasi protokol NATS dilaksanakan di mana perdagangan langsung A dan perdagangan langsung B melanggan dan menerbitkan mesej untuk berkomunikasi antara satu sama lain.

Protokol amqp

amqp Antrian Protokol

Dalam komunikasi asynchronous, mesej tidak akan sampai kepada penerima dengan segera, tetapi ia akan disimpan dalam bekas. Apabila syarat-syarat tertentu dipenuhi, mesej akan dihantar kepada penerima oleh bekas. bekas ini adalah barisan mesej. Untuk menyelesaikan fungsi ini, kedua-dua pihak dan bekas dan komponennya mesti mematuhi perjanjian dan peraturan yang dipersempit. AMQP adalah protokol seperti itu. Kedua-dua penghantar dan penerima mesej boleh melaksanakan komunikasi asynchronous dengan mematuhi protokol ini. Protokol ini menetapkan format dan kaedah kerja mesej.

Setiap protokol mempunyai ciri-ciri tersendiri. anda boleh merujuk kepada dokumen dan bahan khusus, yang tidak akan diterangkan di sini.

Menerbitkan pelayan protokol amqp:

docker run rm hostname my-rabbit name rabbit -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=q -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3-management

Apabila menyebarkan imej docker, ia akan memuat turun dan menyebarkan secara automatik, dan apabila ia selesai ia akan memaparkan:

2024-08-06 09:02:46.248936+00:00 [info] <0.9.0> Time to start RabbitMQ: 15569 ms

Selepas imej pelayan digunakan, tulis contoh ujian:

var conn = null

function main() {
    LogReset(1)
    var robotId = _G()
    Log("Current live trading robotId:", robotId)

    conn = Dial("amqp://q:admin@127.0.0.1:5672/?queue=robotA_Queue")
    if (!conn) {
        Log("Communication failure!")
        return 
    }

    for (var i = 0; i < 10; i++) {
        // Read
        Log("read:", conn.read(1000), "#FF0000")
        
        // Write
        var msg = "i: " + i + ", testQueue, robotA, robotId: " + robotId + ", time:" + _D()        
        conn.write(msg)
        Log("Write a message to testQueue:", msg)

        Sleep(1000)
    }    
}

function onexit() {
    conn.close()
    Log("close conn")
}

Apabila menggunakan antrian protokol AMQP, sila ambil perhatian bahawa mesej yang diterbitkan akan berterusan dalam antrian. Sebagai contoh, jika kita menjalankan kod contoh di atas, 10 mesej akan ditulis ke antrian. Kemudian apabila kita menjalankannya buat kali kedua, kita dapat mendapati bahawa mesej bertulis pertama akan dibaca semula semasa membaca. Seperti yang ditunjukkan dalam gambar:

img

Kita dapat melihat bahawa dua mesej log yang ditunjukkan oleh anak panah merah dalam tangkapan skrin mempunyai masa yang tidak konsisten. Sebabnya adalah bahawa mesej merah adalah yang dibaca dan ditulis ke barisan ketika kod strategi pertama kali dijalankan.

Berdasarkan ciri ini, beberapa keperluan dapat dipenuhi. Sebagai contoh, selepas strategi dimulakan semula, data pasaran yang direkodkan masih boleh diperoleh dari antrian untuk pengiraan inisialisasi dan operasi lain.

Protokol Kafka

Apache Kafka adalah kedai data terdistribusi yang dioptimumkan untuk menelan dan memproses data streaming dalam masa nyata. Data streaming adalah data yang terus dihasilkan oleh beribu-ribu sumber data, sering menghantar rekod data secara serentak. Platform streaming perlu mengendalikan kemasukan data yang berterusan ini, memprosesnya secara berurutan dan tambahan.

Kafka menyediakan tiga fungsi utama kepada penggunanya:

  • Penerbitan dan langganan aliran rekod
  • Menyimpan aliran rekod dengan cekap mengikut susunan yang dihasilkan
  • Menganalisis aliran rekod dalam masa nyata

Kafka digunakan terutamanya untuk membina paip data streaming masa nyata dan aplikasi yang menyesuaikan diri dengan aliran data. Ia menggabungkan kemampuan pesanan, penyimpanan, dan pemprosesan aliran, dan boleh menyimpan data sejarah dan masa nyata.

Penerbitan Pesan dan Langganan

Menerbitkan imej docker proksi Kafka:

docker run --rm --name kafka-server --hostname kafka-server -p 9092:9092 -p 9093:9093 \
        -e KAFKA_CFG_NODE_ID=0 \
        -e KAFKA_CFG_PROCESS_ROLES=controller,broker \
        -e KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093 \
        -e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
        -e KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \
        -e KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka-server:9093 \
        -e KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \
        bitnami/kafka:latest

Ujian menggunakan kod ujian:

var conn = null

function main() {
    LogReset(1)
    var robotId = _G()
    Log("Current live trading robotId:", robotId)

    conn = Dial("kafka://localhost:9092/test_topic")
    if (!conn) {
        Log("Communication failure!")
        return 
    }

    for (var i = 0; i < 10; i++) {
        // Write
        var msg = "i: " + i + ", testQueue, robotA, robotId: " + robotId + ", time:" + _D()        
        conn.write(msg)
        Log("Write a message to testQueue:", msg)

        // Read
        Log("read:", conn.read(1000), "#FF0000")

        Sleep(1000)
    }    
}

function onexit() {
    conn.close()
    Log("close conn")
}

Mari kita lihat bagaimana menggunakan protokol Kafka untuk menerbitkan dan melanggan mesej dalam fungsi Dial.

Dial("kafka://localhost:9092/test_topic")

Seperti protokol lain, bahagian pertama adalah nama protokol. Kemudian diikuti dengan alamat mendengar:localhost:9092. Kemudian gunakan simbol / sebagai pemisah, diikuti dengan topik langganan / penerbitan.test_topic.

Hasil ujian:

img


Lebih lanjut