[TOC]
वित्तीय बाजारों के तेजी से विकास और मात्रात्मक व्यापार की लोकप्रियता के साथ, अधिक से अधिक व्यापारी व्यापार के लिए स्वचालित रणनीतियों पर भरोसा करना शुरू कर देते हैं। इस प्रक्रिया में, रणनीतियों के बीच संचार और समन्वय विशेष रूप से महत्वपूर्ण हैं। एफएमजेड क्वांट ट्रेडिंग प्लेटफॉर्म व्यापार रणनीतियों के बीच एक कुशल संचार प्रोटोकॉल प्रदान करके व्यापारियों को निर्बाध रणनीति डॉकिंग और वास्तविक समय डेटा साझा करने में मदद करता है।
इस लेख में एफएमजेड प्लेटफॉर्म में ट्रेडिंग रणनीतियों के लाइव ट्रेडिंग संचार प्रोटोकॉल का पता लगाया जाएगा, व्यावहारिक अनुप्रयोगों में इसकी डिजाइन अवधारणा, कार्यात्मक विशेषताओं और लाभों का परिचय दिया जाएगा। विस्तृत केस विश्लेषण के माध्यम से, हम दिखाएंगे कि कुशल और स्थिर रणनीति संचार प्राप्त करने और व्यापार रणनीतियों के निष्पादन और लाभ प्रदर्शन में सुधार के लिए इस प्रोटोकॉल का उपयोग कैसे किया जाए।
चाहे आप एक मात्रात्मक ट्रेडिंग उत्साही हैं जो अभी FMZ के साथ शुरुआत कर रहे हैं या एक अनुभवी पेशेवर प्रोग्रामर हैं, यह लेख आपको मूल्यवान अंतर्दृष्टि और व्यावहारिक संचालन गाइड प्रदान करेगा। आइए FMZ प्लेटफॉर्म के शक्तिशाली कार्यों का पता लगाएं और सीखें कि कुशल संचार प्रोटोकॉल के माध्यम से रणनीतियों के बीच सहयोग कैसे प्राप्त किया जाए, व्यापार दक्षता में सुधार करें, और बाजार के अवसरों को कैप्चर करें।
ये मांग परिदृश्य व्यावहारिक अनुप्रयोगों में एफएमजेड ट्रेडिंग रणनीति लाइव ट्रेडिंग संचार प्रोटोकॉल की विभिन्न संभावनाओं और लाभों को प्रदर्शित करते हैं। प्रभावी अंतर-रणनीति संचार के माध्यम से, व्यापारी जटिल बाजार वातावरण से बेहतर ढंग से निपट सकते हैं, व्यापार रणनीतियों को अनुकूलित कर सकते हैं, और व्यापार दक्षता और लाभ में सुधार कर सकते हैं।
लाइव ट्रेडिंग के बीच संचार आवश्यकताओं को समझने के बाद, हमें इन आवश्यकताओं को लागू करने के तरीके पर विचार करने की आवश्यकता है। यह लाइव ट्रेडिंग ए से अधिक कुछ नहीं है जो लाइव ट्रेडिंग बी के साथ जानकारी का आदान-प्रदान करने की उम्मीद करता है। हालांकि आवश्यकताएं सरल लगती हैं, संचार प्रोटोकॉल के एक सेट का उपयोग करने पर विभिन्न विवरणों पर सहमति बनाने की आवश्यकता है। एफएमजेड ने कई लोकप्रिय संचार प्रोटोकॉल को शामिल किया है।
mqtt / nats / amqp / kafka
संचार वास्तुकला हैः
FMZ प्लेटफॉर्म पर इन प्रोटोकॉल को लागू करते समय यह आसानी से समझा जा सकता है कि mqtt / nats / amqp / kafkaprotocolsDial()
कार्य, औरDial()
फ़ंक्शन का उपयोग संदेशों को प्रकाशित करने और सदस्यता लेने के लिए किया जाता है। ये प्रकाशित संदेश प्रोटोकॉल सर्वर के माध्यम से सदस्यता प्राप्त लाइव ट्रेडिंग के लिए प्रॉक्सी (रिले) किए जाते हैं, इसलिए पहले एक प्रोटोकॉल सर्वर चलाना आवश्यक है। प्रदर्शन के लिए, हम निम्नलिखित उदाहरणों में विभिन्न प्रोटोकॉल सर्वर छवि तैनाती का उपयोग करते हैं।
एपीआई प्रलेखन अनुभाग में डायल फ़ंक्शनःhttps://www.fmz.com/syntax-guide#fun_dial
डॉकर छवि को तैनात करने से पहले, डॉकर सॉफ़्टवेयर को पहले स्थापित करना याद रखें.
इसके बाद, आइए FMZ द्वारा समर्थित संचार प्रोटोकॉल अनुप्रयोगों का अन्वेषण और अभ्यास करें।
MQTT (Message Queuing Telemetry Transport) एक हल्का संदेश संचरण प्रोटोकॉल है जो विशेष रूप से कम बैंडविड्थ, उच्च विलंबता या अविश्वसनीय नेटवर्क वातावरण के लिए उपयुक्त है। इसे 1999 में आईबीएम के एंडी स्टैनफोर्ड-क्लार्क और अर्लेन निपर द्वारा प्रस्तावित किया गया था और बाद में एक आईएसओ मानक (आईएसओ / आईईसी पीआरएफ 20922) बन गया।
एमक्यूटीटी प्रोटोकॉल की मुख्य विशेषताएंः प्रकाशन/सदस्यता मोड
चूंकि हम MQTT प्रॉक्सी सर्वर को तैनात करने के लिए MQTT प्रोटोकॉल का समर्थन करने वाले सॉफ़्टवेयर की डॉकर छवि (eclipse-mosquitto image) का उपयोग करते हैं, इसलिए हमने पहले से डॉकर स्थापित किया है और बाद में विवरण में नहीं जाएंगे।
छवि को तैनात करने के लिए आदेश चलाने से पहले, हम एक प्रॉक्सी सर्वर विन्यास फ़ाइल लिखने की जरूरत हैmosquitto.conf
.
# Configure port number and remote access IP
listener 1883 0.0.0.0
# Setting up anonymous access
allow_anonymous true
फिर तैनाती कमांड निष्पादित करेंः
docker run --rm -p 1883:1883 -v ./mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto
प्रॉक्सी सर्वर छवि चलाने के बाद, निम्न प्रदर्शित होता हैः
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
फिर हम रणनीति का परीक्षण कर उसे व्यवहार में ला सकते हैं।
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")
}
रणनीति कोड में डायल फ़ंक्शन का मुख्य उपयोग हैः
Dial("mqtt://127.0.0.1:1883?topic=test_topic")
डायल फ़ंक्शन की स्ट्रिंग पैरामीटर के साथ शुरू होता हैmqtt://
, जो प्रोटोकॉल का नाम है, इसके बाद सुनने का पता और पोर्ट है। प्रतीक test_topic
.
उपरोक्त रणनीति एक ही समय में एक विषय को प्रकाशित करती है और सदस्यता लेती है। चल रहा परीक्षण चित्र में दिखाया गया हैः
हम दो लाइव ट्रेडिंग का उपयोग एक दूसरे को सब्सक्राइब करने और विषय जानकारी प्रकाशित करने के लिए भी कर सकते हैं। हम इस तरह के एक उदाहरण का उपयोग नट्स प्रोटोकॉल अभ्यास अनुभाग में करते हैं, और अन्य प्रोटोकॉल में इस विधि को नहीं दोहराएंगे।
एनएटीएस प्रोटोकॉल एक सरल, पाठ-आधारित प्रकाशित / सदस्यता शैली प्रोटोकॉल है। क्लाइंट gnatsd (एनएटीएस सर्वर) से जुड़ता है और gnatsd के साथ संवाद करता है। संचार साधारण टीसीपी / आईपी सॉकेट पर आधारित है और संचालन का एक बहुत छोटा सेट परिभाषित करता है। न्यूलाइन समाप्ति को इंगित करता है। पारंपरिक संदेश संचार प्रणालियों के विपरीत जो द्विआधारी संदेश प्रारूपों का उपयोग करते हैं, पाठ-आधारित एनएटीएस प्रोटोकॉल क्लाइंट कार्यान्वयन को बहुत सरल बनाता है और आसानी से विभिन्न प्रोग्रामिंग भाषाओं या स्क्रिप्टिंग भाषाओं में लागू किया जा सकता है।
प्रत्येक प्रोटोकॉल की अपनी विशेषताएं हैं। आप विशिष्ट दस्तावेजों और सामग्रियों का संदर्भ ले सकते हैं, जिन्हें यहां विस्तार से नहीं बताया जाएगा।
NATS प्रोटोकॉल सर्वर को तैनात करेंः
docker run
name nats rm -p 4222:4222 -p 8222:8222 nats http_port 8222 auth admin
यह डॉकर कमांड स्वचालित रूप से nats छवि को डाउनलोड और चलाएगा, और पोर्ट 4222 वह पोर्ट है जिसे क्लाइंट को एक्सेस करने की आवश्यकता है। छवि को तैनात करने के बाद पोर्ट 8222 पर एक http मॉनिटर भी खोला जाएगा।
Listening for client connections on 0.0.0.0:4222
Server is ready
Nats सर्वर छवि चलाने के लिए शुरू होता है, पोर्ट 4222 पर सुन रहा है।
हमें दो रणनीतियों (लाइव ट्रेडिंग) बनाने की आवश्यकता है, आइए उन्हें रणनीति ए और रणनीति बी नाम दें। इन दोनों रणनीतियों के कोड मूल रूप से समान हैं। वे जावास्क्रिप्ट में लिखे गए हैं, जो एफएमजेड प्लेटफॉर्म पर उपयोग करने के लिए सबसे आसान भाषा है।
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()
}
ये दो रणनीतियाँ लगभग समान हैं, सिवाय इसके कि वे एक दूसरे को प्रकाशित और सदस्यता लेते हैं, और सदस्यता प्राप्त विषय, प्रकाशित विषय और प्रकाशित जानकारी अलग हैं।
उदाहरण के तौर पर रणनीति बी लीजिए:
Dial()
क्लाइंट कनेक्शन सर्वर ऑब्जेक्ट बनाने के लिए फ़ंक्शनconnPub
विषय संदेश प्रकाशन के लिएःvar connPub = डायल करें127.0.0.1:4222?topic=pubRobotB”)
डायल फ़ंक्शन की पैरामीटर स्ट्रिंग के साथ शुरू होता हैnats://
यह दर्शाता है कि संचार के लिए NATS प्रोटोकॉल का उपयोग किया जाता है।admin
सरल सत्यापन जानकारी हैauth admin
जब डॉकर छवि को तैनात किया जाता है। निम्नलिखित सामग्री को अलग करने के लिए 127.0.0.1:4222
अंत में, प्रकाशित/सब्सक्राइब विषय हैःtopic=pubRobotB
ध्यान दें कि
Dial()
क्लाइंट कनेक्शन सर्वर ऑब्जेक्ट बनाने के लिए फ़ंक्शनconnSub
विषय संदेश सदस्यता के लिएःvar connSub = डायल करें127.0.0.1:4222?topic=pubRobotA”)
एकमात्र अंतर यह हैtopic=pubRobotA
, क्योंकि हम विषय के लिए सदस्यता की जरूरत हैpubRobotA
जहां रणनीति ए सूचना भेजती है।
रणनीति A में सदस्यता और प्रकाशन कनेक्शन वस्तुओं का निर्माण और उपयोग ऊपर वर्णित के समान है।
इस प्रकार, NATS प्रोटोकॉल एप्लिकेशन का एक सरल उदाहरण लागू किया जाता है जिसमें लाइव ट्रेडिंग A और लाइव ट्रेडिंग B एक दूसरे के साथ संवाद करने के लिए संदेशों की सदस्यता लेते हैं और प्रकाशित करते हैं।
एसिंक्रोनस संचार में, संदेश प्राप्तकर्ता तक तुरंत नहीं पहुंचेगा, लेकिन इसे कंटेनर में संग्रहीत किया जाएगा। जब कुछ शर्तें पूरी हो जाती हैं, तो संदेश कंटेनर द्वारा प्राप्तकर्ता को भेजा जाएगा। यह कंटेनर संदेश कतार है। इस कार्य को पूरा करने के लिए, दोनों पक्षों और कंटेनर और इसके घटकों को एकीकृत समझौतों और नियमों का पालन करना चाहिए। एएमक्यूपी एक ऐसा प्रोटोकॉल है। संदेश के प्रेषक और प्राप्तकर्ता दोनों इस प्रोटोकॉल का पालन करके एसिंक्रोनस संचार को लागू कर सकते हैं। यह प्रोटोकॉल संदेश के प्रारूप और काम करने की विधि को निर्धारित करता है।
प्रत्येक प्रोटोकॉल की अपनी विशेषताएं हैं। आप विशिष्ट दस्तावेजों और सामग्रियों का संदर्भ ले सकते हैं, जिन्हें यहां विस्तार से नहीं बताया जाएगा।
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-प्रबंधन
डॉकर छवि को तैनात करते समय, यह स्वचालित रूप से डाउनलोड और तैनात करेगा, और जब यह पूरा हो जाएगा तो यह प्रदर्शित करेगाः
2024-08-06 09:02:46.248936+00:00 [info] <0.9.0> Time to start RabbitMQ: 15569 ms
सर्वर छवि को तैनात करने के बाद, एक परीक्षण उदाहरण लिखेंः
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")
}
एएमक्यूपी प्रोटोकॉल कतार का उपयोग करते समय, कृपया ध्यान दें कि प्रकाशित संदेश कतार में बने रहेंगे। उदाहरण के लिए, यदि हम उपरोक्त उदाहरण कोड चलाते हैं, तो कतार में 10 संदेश लिखे जाएंगे। फिर जब हम इसे दूसरी बार चलाते हैं, तो हम पा सकते हैं कि पहले लिखित संदेश को पढ़ने पर फिर से पढ़ा जाएगा। जैसा कि चित्र में दिखाया गया हैः
हम देख सकते हैं कि स्क्रीनशॉट में लाल तीरों द्वारा इंगित किए गए दो लॉग संदेशों में असंगत समय हैं। इसका कारण यह है कि लाल संदेश वह है जिसे रणनीति कोड पहली बार चलाए जाने पर कतार में पढ़ा और लिखा गया था।
इस विशेषता के आधार पर, कुछ आवश्यकताओं को पूरा किया जा सकता है। उदाहरण के लिए, रणनीति को फिर से शुरू करने के बाद, आरंभिक गणना और अन्य संचालन के लिए कतार से रिकॉर्ड किए गए बाजार डेटा को अभी भी प्राप्त किया जा सकता है।
अपाचे काफ्का एक वितरित डेटा स्टोर है जिसे वास्तविक समय में स्ट्रीमिंग डेटा को निगलने और संसाधित करने के लिए अनुकूलित किया गया है। स्ट्रीमिंग डेटा डेटा है जो लगातार हजारों डेटा स्रोतों द्वारा उत्पन्न किया जाता है, अक्सर एक साथ डेटा रिकॉर्ड भेजते हैं। एक स्ट्रीमिंग प्लेटफॉर्म को डेटा के इस निरंतर प्रवाह को संभालने की आवश्यकता होती है, इसे क्रमिक और वृद्धिशील रूप से संसाधित करते हुए।
काफ्का अपने उपयोगकर्ताओं को तीन मुख्य कार्य प्रदान करता हैः
काफ्का का उपयोग मुख्य रूप से वास्तविक समय स्ट्रीमिंग डेटा पाइपलाइन और एप्लिकेशन बनाने के लिए किया जाता है जो डेटा स्ट्रीम के अनुकूल होते हैं। यह मैसेजिंग, स्टोरेज और स्ट्रीम प्रोसेसिंग क्षमताओं को जोड़ती है, और ऐतिहासिक और वास्तविक समय डेटा स्टोर कर सकती है।
काफ्का प्रॉक्सी के डॉकर छवि को तैनात करेंः
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
परीक्षण कोड का प्रयोग करके परीक्षणः
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")
}
चलिए एक नज़र डालते हैं कि डायल फ़ंक्शन में संदेश प्रकाशित करने और सदस्यता लेने के लिए काफ्का प्रोटोकॉल का उपयोग कैसे करें।
Dial("kafka://localhost:9092/test_topic")
अन्य प्रोटोकॉल की तरह, पहला भाग प्रोटोकॉल का नाम है. फिर इसके बाद सुनने का पता हैःlocalhost:9092
. फिर एक विभाजक के रूप में प्रतीक test_topic
.
परीक्षण परिणाम: