[TOC]

Dengan perkembangan pesat pasaran kewangan dan populariti perdagangan kuantitatif, semakin ramai peniaga mula bergantung pada strategi automatik untuk perdagangan. Dalam proses ini, komunikasi dan penyelarasan antara strategi amat penting. FMZ (Platform Dagangan Kuantitatif) membantu pedagang mencapai penyepaduan strategi yang lancar dan perkongsian data masa nyata dengan menyediakan protokol komunikasi yang cekap antara strategi dagangan sebenar.
Artikel ini akan meneroka secara mendalam protokol komunikasi masa nyata strategi dagangan dalam platform FMZ, dan memperkenalkan konsep reka bentuk, ciri fungsi dan kelebihannya dalam aplikasi praktikal. Melalui analisis kes terperinci, kami akan menunjukkan cara menggunakan protokol ini untuk mencapai komunikasi strategi yang cekap dan stabil serta meningkatkan pelaksanaan dan keuntungan strategi dagangan.
Sama ada anda seorang peminat dagangan kuantitatif yang baru bermula dengan FMZ, atau pengaturcara profesional yang berpengalaman, artikel ini akan memberikan anda cerapan berharga dan panduan operasi praktikal. Marilah kita menerokai fungsi berkuasa FMZ dan belajar bagaimana untuk mencapai kerjasama antara strategi melalui protokol komunikasi yang cekap, meningkatkan kecekapan perdagangan dan menangkap peluang pasaran.
Senario permintaan ini menunjukkan pelbagai kemungkinan dan kelebihan protokol komunikasi masa nyata strategi dagangan FMZ dalam aplikasi praktikal. Melalui komunikasi yang berkesan antara strategi, pedagang boleh mengatasi persekitaran pasaran yang kompleks dengan lebih baik, mengoptimumkan strategi dagangan dan meningkatkan kecekapan dan keuntungan dagangan.
Selepas memahami keperluan komunikasi antara cakera sebenar, kita perlu mempertimbangkan bagaimana untuk merealisasikan keperluan ini. Ia tidak lebih daripada kes sebenar A berharap untuk bertukar maklumat dengan kes sebenar B, walaupun permintaannya kelihatan mudah. Walau bagaimanapun, pelbagai butiran perlu dipersetujui menggunakan satu set protokol komunikasi FMZ telah merangkum beberapa protokol komunikasi yang popular.
mqtt / nats / amqp / kafka
Seni bina komunikasi ialah:
Apabila menggunakan protokol ini pada platform FMZ, ia boleh difahami secara ringkas sebagai mqtt/nats/amqp/kafka Protokol ini disepadukan ke dalamDial()Dalam fungsi, gunakanDial()Fungsi digunakan untuk menerbitkan dan melanggan mesej. Mesej yang diterbitkan ini diproksikan (disampaikan) kepada cakera sebenar yang dilanggan melalui pelayan protokol, jadi pelayan protokol mesti dijalankan terlebih dahulu. Untuk memudahkan demonstrasi, kami menggunakan pelbagai penempatan imej pelayan protokol dalam contoh berikut.
Bahagian dokumentasi API fungsi dail: https://www.fmz.com/syntax-guide#fun_dial
Sebelum menggunakan imej docker, ingat untuk memasang perisian docker terlebih dahulu.

Seterusnya, mari kita meneroka dan mengamalkan aplikasi protokol komunikasi yang disokong oleh FMZ.
MQTT (Mesej Qeuing Telemetry Transport) ialah protokol penghantaran mesej ringan yang amat sesuai untuk persekitaran rangkaian jalur lebar rendah, kependaman tinggi atau tidak boleh dipercayai. Ia telah dicadangkan oleh Andy Stanford-Clark dan Arlen Nipper dari IBM pada tahun 1999 dan kemudiannya menjadi standard ISO (ISO/IEC PRF 20922).
Ciri utama protokol MQTT: mod terbitkan/langgan
Oleh kerana kami menggunakan imej docker (imej gerhana-nyamuk) perisian yang menyokong protokol MQTT untuk menggunakan pelayan proksi MQTT, kami telah memasang docker terlebih dahulu dan tidak akan membincangkan butiran kemudian.
Sebelum menjalankan arahan untuk menggunakan imej, kita perlu menulis fail konfigurasi pelayan proksimosquitto.conf。
# 配置端口号及远程访问IP
listener 1883 0.0.0.0
# 设置匿名访问
allow_anonymous true
Kemudian laksanakan arahan penempatan:
docker run --rm -p 1883:1883 -v ./mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto
Selepas imej pelayan proksi berjalan, paparan 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 mempraktikkannya.
var conn = null
function main() {
LogReset(1)
var robotId = _G()
Log("当前实盘robotId:", robotId)
conn = Dial("mqtt://127.0.0.1:1883?topic=test_topic")
if (!conn) {
Log("通信失败!")
return
}
for (var i = 0; i < 10; i++) {
// 写入
var msg = "i: " + i + ", testQueue, robotA, robotId: " + robotId + ", time:" + _D()
conn.write(msg)
Log("向testQueue写入消息:", msg)
// 读取
Log("read:", conn.read(1000), "#FF0000")
Sleep(1000)
}
}
function onexit() {
conn.close()
Log("关闭conn")
}
Penggunaan utama fungsi Dail dalam kod strategi ialah:
Dial("mqtt://127.0.0.1:1883?topic=test_topic")
Parameter rentetan bagi fungsi Dail bermula denganmqtt://Ia adalah nama protokol, diikuti dengan alamat pendengaran dan port. Simbol “?” diikuti dengan nama topik langganan/penerbitan Nama topik yang diuji di sini ialah:test_topic。
Strategi di atas menerbitkan dan melanggan topik pada masa yang sama Ujian berjalan adalah seperti yang ditunjukkan dalam rajah:

Anda juga boleh menggunakan dua cakera sebenar untuk melanggan satu sama lain dan menerbitkan maklumat topik Kami menggunakan contoh sedemikian dalam bahagian amalan protokol NATS, dan tidak akan mengulangi kaedah ini dalam protokol lain.
Protokol NATS ialah protokol gaya terbitan/langgan berasaskan teks yang ringkas. Pelanggan menyambung ke gnatsd (pelayan NATS) dan berkomunikasi dengan gnatsd Komunikasi adalah berdasarkan soket TCP/IP biasa dan mentakrifkan satu set operasi yang sangat kecil. Tidak seperti sistem pemesejan tradisional yang menggunakan format mesej binari, protokol NATS berasaskan teks menjadikan pelaksanaan klien mudah dan boleh dilaksanakan dengan mudah dalam pelbagai bahasa pengaturcaraan atau bahasa skrip.
Setiap protokol mempunyai ciri tersendiri Anda boleh merujuk kepada dokumen dan bahan tertentu, yang tidak akan dihuraikan di sini.
Sebarkan 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 Port 4222 ialah port yang ingin diakses oleh pelanggan. Selepas imej digunakan, monitor http akan dibuka pada port 8222.
Listening for client connections on 0.0.0.0:4222
Server is ready
Imej pelayan nats mula berjalan, mendengar pada port 4222.
Kita perlu mencipta dua strategi (perdagangan sebenar), mari kita namakan mereka Strategi A dan Strategi B buat masa ini Kod kedua-dua strategi ini pada asasnya sama. Ditulis dalam Javascript, bahasa paling mudah untuk digunakan pada platform FMZ.
var connPub = null
var connSub = null
function main() {
var robotId = _G()
Log("当前实盘robotId:", robotId)
connPub = Dial("nats://[email protected]:4222?topic=pubRobotA")
if (!connPub) {
Log("通信失败!")
return
}
connSub = Dial("nats://[email protected]:4222?topic=pubRobotB")
if (!connSub) {
Log("通信失败!")
return
}
while (true) {
connPub.write("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()
}
var connPub = null
var connSub = null
function main() {
var robotId = _G()
Log("当前实盘robotId:", robotId)
connPub = Dial("nats://[email protected]:4222?topic=pubRobotB")
if (!connPub) {
Log("通信失败!")
return
}
connSub = Dial("nats://[email protected]:4222?topic=pubRobotA")
if (!connSub) {
Log("通信失败!")
return
}
while (true) {
connPub.write("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 pada asasnya adalah sama, kecuali ia menerbitkan dan melanggan satu sama lain, dan topik yang dilanggan, topik yang diterbitkan dan maklumat yang diterbitkan adalah berbeza.
Ambil Strategi B sebagai contoh:
Dial()Fungsi mencipta objek pelayan sambungan pelangganconnPub, digunakan untuk penerbitan mesej topik:var connPub = Dial(“nats://[email protected]:4222?topic=pubRobotB”)
Rentetan parameter fungsi Dail bermula dengannats://Menunjukkan bahawa protokol NATS digunakan untuk komunikasi, kemudianadminIa ialah set maklumat pengesahan mudah apabila menggunakan imej dockerauth admin, gunakan aksara “@” untuk memisahkan kandungan berikut, dan kemudian alamat perkhidmatan dan port127.0.0.1:4222, dan akhirnya topik terbitkan/langgan:topic=pubRobotBPerhatikan bahawa terdapat simbol “?” antara alamat sebelumnya.
Dial()Fungsi mencipta objek pelayan sambungan pelangganconnSub, digunakan untuk langganan mesej topik:var connSub = Dial(“nats://[email protected]:4222?topic=pubRobotA”)
Satu-satunya perbezaantopic=pubRobotABerbeza, kerana anda perlu melanggan topik di mana strategi A menghantar maklumatpubRobotA。
Penciptaan dan penggunaan objek sambungan langganan dan penerbitan dalam strategi A adalah sama seperti yang diterangkan di atas.


Dengan cara ini, contoh mudah aplikasi protokol NATS dilaksanakan di mana cakera sebenar A dan cakera sebenar B melanggan dan menerbitkan mesej untuk berkomunikasi antara satu sama lain.
Dalam komunikasi tak segerak, mesej tidak akan sampai ke penerima dengan segera, tetapi akan disimpan dalam bekas Apabila syarat tertentu dipenuhi, mesej akan dihantar kepada penerima oleh bekas ini adalah baris gilir mesej , kedua-dua pihak perlu Bekas dan komponennya mematuhi konvensyen dan peraturan bersatu AMQP adalah protokol sedemikian Kedua-dua penghantar dan penerima mesej boleh mencapai komunikasi tak segerak dengan mematuhi protokol ini. Protokol ini menentukan format mesej dan cara ia berfungsi.
Setiap protokol mempunyai ciri tersendiri Anda boleh merujuk kepada dokumen dan bahan tertentu, yang tidak akan dihuraikan di sini.
Sebarkan 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 menggunakan imej docker, ia akan memuat turun dan menggunakan 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 ujian contoh ujian:
var conn = null
function main() {
LogReset(1)
var robotId = _G()
Log("当前实盘robotId:", robotId)
conn = Dial("amqp://q:[email protected]:5672/?queue=robotA_Queue")
if (!conn) {
Log("通信失败!")
return
}
for (var i = 0; i < 10; i++) {
// 读取
Log("read:", conn.read(1000), "#FF0000")
// 写入
var msg = "i: " + i + ", testQueue, robotA, robotId: " + robotId + ", time:" + _D()
conn.write(msg)
Log("向testQueue写入消息:", msg)
Sleep(1000)
}
}
function onexit() {
conn.close()
Log("关闭conn")
}
Apabila menggunakan baris gilir protokol AMQP, sila ambil perhatian bahawa mesej yang diterbitkan akan kekal dalam baris gilir Contohnya, mari jalankan kod contoh di atas sekali. 10 mesej akan ditulis ke baris gilir. Kemudian apabila kita menjalankannya untuk kali kedua, kita dapati bahawa apabila membaca, maklumat yang ditulis untuk kali pertama akan dibaca semula. Seperti yang ditunjukkan dalam rajah:

Anda boleh melihat bahawa dua mesej log yang ditunjuk oleh anak panah merah dalam tangkapan skrin mempunyai masa yang tidak konsisten Sebabnya ialah mesej merah adalah yang dibaca dan ditulis pada baris gilir semasa kod strategi mula dijalankan.
Berdasarkan ciri ini, beberapa keperluan boleh dipenuhi Contohnya, selepas strategi dimulakan semula, data pasaran yang direkodkan masih boleh diperoleh daripada baris gilir untuk pengiraan permulaan dan operasi lain.
Apache Kafka ialah stor data teragih yang dioptimumkan untuk menelan dan memproses data penstriman dalam masa nyata. Data penstriman merujuk kepada data yang dijana secara berterusan oleh beribu-ribu sumber data, selalunya menghantar rekod data secara serentak. Platform penstriman perlu memproses data yang mengalir secara berterusan ini dan memprosesnya langkah demi langkah dalam urutan.
Kafka menyediakan tiga fungsi utama kepada penggunanya:
Kafka digunakan terutamanya untuk membina saluran paip data penstriman masa nyata dan aplikasi yang menyesuaikan diri dengan aliran data. Ia menggabungkan pemesejan, penyimpanan dan keupayaan pemprosesan strim untuk menyimpan kedua-dua data sejarah dan masa nyata.
Gunakan 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
Uji menggunakan kod ujian:
var conn = null
function main() {
LogReset(1)
var robotId = _G()
Log("当前实盘robotId:", robotId)
conn = Dial("kafka://localhost:9092/test_topic")
if (!conn) {
Log("通信失败!")
return
}
for (var i = 0; i < 10; i++) {
// 写入
var msg = "i: " + i + ", testQueue, robotA, robotId: " + robotId + ", time:" + _D()
conn.write(msg)
Log("向testQueue写入消息:", msg)
// 读取
Log("read:", conn.read(1000), "#FF0000")
Sleep(1000)
}
}
function onexit() {
conn.close()
Log("关闭conn")
}
Mari kita lihat cara menggunakan protokol Kafka untuk menerbitkan dan melanggan mesej dalam fungsi Dail.
Dial("kafka://localhost:9092/test_topic")
Seperti beberapa protokol lain, bahagian pertama ialah nama protokol. Kemudian ikuti alamat pendengaran:localhost:9092. Kemudian gunakan simbol “/” sebagai pemisah, diikuti dengan topik langganan/penerbitan Di sini topik ujian ditetapkan kepadatest_topic。
Keputusan ujian:
