[TOC]
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 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.
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 adalah:
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.
Seterusnya, mari kita meneroka dan mengamalkan aplikasi protokol komunikasi yang disokong oleh FMZ.
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
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 test_topic
.
Strategi di atas menerbitkan dan melanggan topik pada masa yang sama.
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.
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.
Kita perlu membuat dua strategi (dagang langsung), mari kita namakan mereka Strategi A dan Strategi B. Kod kedua-dua strategi ini pada dasarnya sama.
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()
}
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:
Dial()
fungsi untuk mencipta objek pelayan sambungan pelangganconnPub
untuk 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.admin
adalah maklumat pengesahan mudahauth admin
set apabila menggunakan imej Docker. Karakter 127.0.0.1:4222
Akhirnya, ada topik menerbitkan / melanggan:topic=pubRobotB
Perhatikan bahawa simbol
Dial()
fungsi untuk mencipta objek pelayan sambungan pelangganconnSub
untuk langganan mesej topik:var connSub = Panggil127.0.0.1:4222?topic=pubRobotA”)
Satu-satunya perbezaan adalahtopic=pubRobotA
, kerana kita perlu melanggan topikpubRobotA
di mana strategi A menghantar maklumat.
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 perdagangan langsung A dan perdagangan langsung B melanggan dan menerbitkan mesej untuk berkomunikasi antara satu sama lain.
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:
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.
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:
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.
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 test_topic
.
Hasil ujian: