avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Meneroka FMZ: Amalan protokol komunikasi antara strategi dagangan sebenar

Dicipta dalam: 2024-08-06 14:13:40, dikemas kini pada: 2024-11-05 17:50:35
comments   0
hits   1152

[TOC]

Meneroka FMZ: Amalan protokol komunikasi antara strategi dagangan sebenar

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

    1. Perdagangan kerjasama pelbagai strategi Senario permintaan: Dalam persekitaran pasaran yang kompleks, satu strategi mungkin tidak dapat menangani pelbagai kecemasan dan perubahan pasaran. Pedagang ingin menjalankan berbilang strategi pada masa yang sama, seperti strategi mengikut arah aliran, strategi pengembalian min dan strategi arbitraj, dan biarkan strategi ini berkomunikasi dalam masa nyata untuk berkongsi maklumat pasaran dan isyarat dagangan, dengan itu meningkatkan kecekapan dan kestabilan dagangan secara keseluruhan.
    1. Arbitraj merentas pasaran Senario permintaan: Pedagang ingin menjalankan transaksi arbitraj antara pasaran dagangan yang berbeza. Sebagai contoh, arbitraj boleh dijalankan dengan mengambil kesempatan daripada perbezaan harga antara pasaran A-share dan pasaran saham Hong Kong. Apabila harga tidak normal berlaku dalam pasaran tertentu, strategi perlu memaklumkan strategi dengan segera di pasaran lain untuk melaksanakan operasi jual beli yang sepadan bagi menangkap peluang arbitraj.
    1. Pengurusan Risiko dan Lindung Nilai Senario permintaan: Satu strategi bertanggungjawab untuk mencari dan melaksanakan dagangan berisiko tinggi, ganjaran tinggi dalam pasaran, manakala strategi lain memfokuskan pada memantau risiko keseluruhan dan melaksanakan operasi lindung nilai. Bagi memastikan kerugian yang berlebihan tidak ditanggung semasa urus niaga berisiko tinggi, kedua-dua strategi tersebut perlu berkomunikasi dan berkongsi data dalam masa nyata supaya kedudukan boleh diselaraskan dan risiko dilindung nilai tepat pada masanya.
    1. Sistem perdagangan teragih Senario permintaan: Institusi perdagangan besar berharap untuk menjalankan sistem perdagangan teragih pada berbilang pelayan fizikal untuk meningkatkan toleransi kesalahan dan prestasi sistem perdagangan. Strategi pada pelayan ini perlu menyegerakkan data dan menyelaraskan operasi melalui protokol komunikasi untuk memastikan operasi yang stabil dan cekap bagi keseluruhan sistem perdagangan.
    1. Pemantauan pasaran dan amaran awal Senario permintaan: Strategi bertanggungjawab untuk pemantauan masa nyata dinamik pasaran Apabila terdapat perubahan besar dalam pasaran (seperti kejatuhan atau lonjakan harga secara tiba-tiba), strategi perlu memberitahu strategi lain dengan cepat untuk mengambil tindakan yang sepadan, seperti kedudukan penutupan. melaraskan kedudukan, atau menambah kedudukan untuk mengurangkan risiko Atau memanfaatkan peluang dagangan.
    1. Pengurusan Strategi Portfolio Senario permintaan: Pedagang menggunakan portfolio strategi untuk mengurus pelaburan merentas kelas aset yang berbeza, dengan setiap strategi memfokuskan pada kelas aset tertentu (seperti saham, bon, niaga hadapan, dll.). Strategi ini perlu dikomunikasikan dan diselaraskan untuk mencapai pengoptimuman keseluruhan pelaburan portfolio dan memaksimumkan pulangan.

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.


Protokol komunikasi terkapsul FMZ dan fungsi Dail

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

Seni bina komunikasi ialah:

  • Pelayan (Proksi). Pelayan protokol komunikasi perlu dijalankan untuk menyampaikan mesej antara pelanggan dan penerbit. Pelayan ini boleh digunakan secara tempatan pada sistem hos (untuk komunikasi cakera sebenar setempat); ia juga boleh menjadi perkhidmatan jauh (untuk komunikasi cakera nyata silang pelayan).
  • Pelanggan (pelanggan, penerbit). Program strategi di FMZ boleh difahami sebagai pelanggan protokol komunikasi Program strategi boleh menjadi penerbit (pub) atau pelanggan (sub).

Fungsi Dail

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.

Meneroka FMZ: Amalan protokol komunikasi antara strategi dagangan sebenar

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


Amalan protokol komunikasi masa nyata platform FMZ

Protokol MQTT

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

  • Penerbitan: Pengeluar mesej menghantar mesej ke topik.
  • Langganan: Pengguna mesej melanggan topik yang diminati, dengan itu menerima mesej yang diterbitkan untuk topik tersebut.
  • Broker: MQTT menggunakan broker mesej sebagai perantara untuk memajukan mesej, memastikan penyahgandingan antara penerbit dan pelanggan.

Penerbitan dan langganan mesej

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:

Meneroka FMZ: Amalan protokol komunikasi antara strategi dagangan sebenar

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

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.

Komunikasi antara strategi masa nyata peranti tempatan

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.

  • Strategi A
  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()
  }
  • Strategi B
  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:

  • 1. PenggunaanDial()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.

  • 2. PenggunaanDial()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.

  • Strategi A berjalan

Meneroka FMZ: Amalan protokol komunikasi antara strategi dagangan sebenar

  • Strategi B berjalan

Meneroka FMZ: Amalan protokol komunikasi antara strategi dagangan sebenar

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.


protokol amqp

Barisan protokol AMQP

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:

Meneroka FMZ: Amalan protokol komunikasi antara strategi dagangan sebenar

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.


Protokol Kafka

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:

  • Menerbitkan dan melanggan aliran rekod
  • Simpan strim rekod dengan cekap mengikut susunan ia dijana
  • Memproses aliran rekod dalam masa nyata

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.

Penerbitan dan langganan mesej

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:

Meneroka FMZ: Amalan protokol komunikasi antara strategi dagangan sebenar