[TOC]

مالیاتی منڈیوں کی تیز رفتار ترقی اور مقداری تجارت کی مقبولیت کے ساتھ، زیادہ سے زیادہ تاجر تجارت کے لیے خودکار حکمت عملیوں پر انحصار کرنے لگے ہیں۔ اس عمل میں، حکمت عملیوں کے درمیان رابطے اور ہم آہنگی خاص طور پر اہم ہے۔ FMZ (Quantitative Trading Platform) حقیقی تجارتی حکمت عملیوں کے درمیان ایک موثر مواصلاتی پروٹوکول فراہم کرکے تاجروں کو بغیر کسی رکاوٹ کے حکمت عملی کے انضمام اور حقیقی وقت میں ڈیٹا شیئرنگ حاصل کرنے میں مدد کرتا ہے۔
یہ مضمون FMZ پلیٹ فارم میں تجارتی حکمت عملیوں کے ریئل ٹائم کمیونیکیشن پروٹوکول کو گہرائی میں تلاش کرے گا، اور اس کے ڈیزائن کا تصور، عملی خصوصیات اور عملی ایپلی کیشنز میں فوائد کو متعارف کرائے گا۔ کیس کے تفصیلی تجزیہ کے ذریعے، ہم یہ دکھائیں گے کہ اس پروٹوکول کو کس طرح موثر اور مستحکم حکمت عملی مواصلات کے حصول اور تجارتی حکمت عملیوں کے نفاذ اور منافع کو بہتر بنانے کے لیے استعمال کیا جائے۔
چاہے آپ ایک مقداری تجارت کے شوقین ہیں جو ابھی FMZ کے ساتھ شروعات کر رہے ہیں، یا ایک تجربہ کار پیشہ ور پروگرامر، یہ مضمون آپ کو قیمتی بصیرتیں اور عملی آپریشن گائیڈ فراہم کرے گا۔ آئیے FMZ کے طاقتور افعال کو دریافت کریں اور سیکھیں کہ کس طرح موثر مواصلاتی پروٹوکولز کے ذریعے حکمت عملیوں کے درمیان تعاون حاصل کیا جائے، تجارتی کارکردگی کو بہتر بنایا جائے اور مارکیٹ کے مواقع کو حاصل کیا جائے۔
یہ مطالبہ منظرنامے عملی ایپلی کیشنز میں FMZ تجارتی حکمت عملی ریئل ٹائم کمیونیکیشن پروٹوکول کے مختلف امکانات اور فوائد کو ظاہر کرتے ہیں۔ حکمت عملیوں کے درمیان موثر مواصلت کے ذریعے، تاجر مارکیٹ کے پیچیدہ ماحول سے بہتر طور پر نمٹ سکتے ہیں، تجارتی حکمت عملیوں کو بہتر بنا سکتے ہیں، اور تجارتی کارکردگی اور منافع کو بہتر بنا سکتے ہیں۔
حقیقی ڈسکوں کے درمیان مواصلات کی ضروریات کو سمجھنے کے بعد، ہمیں ان ضروریات کو کیسے پورا کرنے پر غور کرنے کی ضرورت ہے۔ یہ اس سے زیادہ کچھ نہیں ہے کہ حقیقی کیس A کو حقیقی کیس B کے ساتھ معلومات کا تبادلہ کرنے کی امید ہے، حالانکہ مطالبہ آسان لگتا ہے۔ تاہم، مواصلاتی پروٹوکول کے ایک سیٹ کے استعمال پر مختلف تفصیلات پر اتفاق کرنے کی ضرورت ہے FMZ نے متعدد مقبول مواصلاتی پروٹوکول کو شامل کیا ہے۔
mqtt / nats / amqp / kafka
مواصلاتی فن تعمیر ہے:
FMZ پلیٹ فارم پر ان پروٹوکولز کو لاگو کرتے وقت، اسے آسانی سے mqtt/nats/amqp/kafka کے طور پر سمجھا جا سکتا ہے۔Dial()فنکشن میں، استعمال کریں۔Dial()فنکشنز پیغامات کو شائع کرنے اور سبسکرائب کرنے کے لیے استعمال ہوتے ہیں۔ یہ شائع شدہ پیغامات پروٹوکول سرور کے ذریعے سبسکرائب شدہ اصلی ڈسک پر پراکسیڈ (ریلے کیے گئے) ہیں، اس لیے پہلے پروٹوکول سرور کو چلایا جانا چاہیے۔ مظاہرے میں آسانی کے لیے، ہم مندرجہ ذیل مثالوں میں مختلف پروٹوکول سرور امیج کی تعیناتی کا استعمال کرتے ہیں۔
ڈائل فنکشن API دستاویزات سیکشن: https://www.fmz.com/syntax-guide#fun_dial
ڈوکر امیج کو تعینات کرنے سے پہلے، یاد رکھیں کہ پہلے ڈوکر سافٹ ویئر انسٹال کریں۔

اگلا، آئیے ایف ایم زیڈ کے ذریعے تعاون یافتہ کمیونیکیشن پروٹوکول ایپلی کیشنز کو دریافت کریں اور ان پر عمل کریں۔
MQTT (Message Quueing Telemetry Transport) ایک ہلکا پھلکا میسج ٹرانسمیشن پروٹوکول ہے جو خاص طور پر کم بینڈوتھ، زیادہ تاخیر یا غیر معتبر نیٹ ورک ماحول کے لیے موزوں ہے۔ اسے اینڈی اسٹینفورڈ کلارک اور آئی بی ایم کے آرلن نپر نے 1999 میں تجویز کیا تھا اور بعد میں آئی ایس او اسٹینڈرڈ (ISO/IEC PRF 20922) بن گیا۔
MQTT پروٹوکول کی اہم خصوصیات: شائع/سبسکرائب موڈ
چونکہ ہم سافٹ ویئر کی docker امیج (eclipse-mosquitto image) استعمال کرتے ہیں جو MQTT پراکسی سرور کو تعینات کرنے کے لیے MQTT پروٹوکول کو سپورٹ کرتا ہے، ہم نے پہلے سے docker انسٹال کر لیا ہے اور بعد میں تفصیلات میں نہیں جائیں گے۔
تصویر کو تعینات کرنے کے لیے کمانڈ چلانے سے پہلے، ہمیں ایک پراکسی سرور کنفیگریشن فائل لکھنی ہوگی۔mosquitto.conf。
# 配置端口号及远程访问IP
listener 1883 0.0.0.0
# 设置匿名访问
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("当前实盘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")
}
حکمت عملی کوڈ میں ڈائل فنکشن کا بنیادی استعمال یہ ہے:
Dial("mqtt://127.0.0.1:1883?topic=test_topic")
ڈائل فنکشن کا سٹرنگ پیرامیٹر شروع ہوتا ہے۔mqtt://یہ پروٹوکول کا نام ہے، اس کے بعد سننے کا پتہ اور بندرگاہ ہے۔ “؟” علامت کے بعد سبسکرپشن/پبلشنگ موضوع کا نام ہے:test_topic。
مندرجہ بالا حکمت عملی ایک ہی وقت میں ایک موضوع کو شائع کرتی ہے اور اسے سبسکرائب کرتی ہے جیسا کہ تصویر میں دکھایا گیا ہے:

آپ ایک دوسرے کو سبسکرائب کرنے اور موضوع کی معلومات شائع کرنے کے لیے دو اصلی ڈسکوں کا استعمال بھی کر سکتے ہیں، ہم NATS پروٹوکول پریکٹس سیکشن میں اس طرح کی مثال استعمال کرتے ہیں، اور دوسرے پروٹوکولز میں اس طریقہ کو نہیں دہرائیں گے۔
NATS پروٹوکول ایک سادہ، متن پر مبنی اشاعت/سبسکرائب طرز کا پروٹوکول ہے۔ کلائنٹ gnatsd (NATS سرور) سے رابطہ کرتا ہے اور مواصلات عام TCP/IP ساکٹ پر مبنی ہوتا ہے اور نیو لائن ختم ہونے کی نشاندہی کرتا ہے۔ روایتی پیغام رسانی کے نظام کے برعکس جو بائنری میسج فارمیٹس استعمال کرتے ہیں، ٹیکسٹ پر مبنی NATS پروٹوکول کلائنٹ کے نفاذ کو آسان بناتا ہے اور اسے مختلف پروگرامنگ زبانوں یا اسکرپٹنگ زبانوں میں آسانی سے لاگو کیا جا سکتا ہے۔
ہر پروٹوکول کی اپنی خصوصیات ہیں آپ مخصوص دستاویزات اور مواد کا حوالہ دے سکتے ہیں، جن کی وضاحت یہاں نہیں کی جائے گی۔
NATS پروٹوکول سرور کو تعینات کریں:
docker run –name nats –rm -p 4222:4222 -p 8222:8222 nats –http_port 8222 –auth admin
یہ ڈوکر کمانڈ خود بخود نٹ امیج کو ڈاؤن لوڈ اور چلائے گا پورٹ 4222 وہ پورٹ ہے جس تک کلائنٹ رسائی حاصل کرنا چاہتا ہے۔ تصویر کے تعینات ہونے کے بعد، پورٹ 8222 پر ایک HTTP مانیٹر کھل جائے گا۔
Listening for client connections on 0.0.0.0:4222
Server is ready
پورٹ 4222 پر سنتے ہوئے، نیٹ سرور کی تصویر چلنا شروع ہو جاتی ہے۔
ہمیں دو حکمت عملی (حقیقی تجارت) بنانے کی ضرورت ہے، آئیے ان کو ابھی کے لیے حکمت عملی A اور حکمت عملی B کا نام دیں ان دونوں حکمت عملیوں کے کوڈ بنیادی طور پر ایک جیسے ہیں۔ Javascript میں لکھی گئی، 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()
}
یہ دونوں حکمت عملی بنیادی طور پر ایک جیسی ہیں، سوائے اس کے کہ وہ ایک دوسرے کو شائع اور سبسکرائب کرتے ہیں، اور سبسکرائب کیے گئے عنوانات، شائع شدہ عنوانات، اور شائع شدہ معلومات مختلف ہیں۔
حکمت عملی B کو مثال کے طور پر لیں:
Dial()فنکشن کلائنٹ کنکشن سرور آبجیکٹ بناتا ہے۔connPub, موضوع کے پیغام کی اشاعت کے لیے استعمال کیا جاتا ہے:var connPub = Dial(“nats://[email protected]:4222?topic=pubRobotB”)
ڈائل فنکشن کا پیرامیٹر سٹرنگ شروع ہوتا ہے۔nats://اشارہ کرتا ہے کہ NATS پروٹوکول مواصلات کے لئے استعمال ہوتا ہے، پھرadminڈاکر امیج کو تعینات کرتے وقت یہ ایک سادہ تصدیقی معلومات سیٹ ہوتی ہے۔auth admin، درج ذیل مواد کو الگ کرنے کے لیے “@” حرف استعمال کریں، اور پھر سروس کا پتہ اور پورٹ127.0.0.1:4222، اور آخر میں شائع/سبسکرائب موضوع:topic=pubRobotBنوٹ کریں کہ پچھلے پتے کے درمیان “؟” کی علامت ہے۔
Dial()فنکشن کلائنٹ کنکشن سرور آبجیکٹ بناتا ہے۔connSub, موضوع کے پیغام کی رکنیت کے لیے استعمال کیا جاتا ہے:var connSub = Dial(“nats://[email protected]:4222?topic=pubRobotA”)
فرق صرف اتنا ہے۔topic=pubRobotAمختلف، کیونکہ آپ کو اس موضوع کو سبسکرائب کرنے کی ضرورت ہے جہاں حکمت عملی A معلومات بھیجتی ہے۔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-management
ڈاکر امیج کو تعینات کرتے وقت، یہ خود بخود ڈاؤن لوڈ اور تعینات ہو جائے گا، اور جب یہ مکمل ہو جائے گا تو یہ ظاہر ہو گا:
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("当前实盘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")
}
AMQP پروٹوکول کی قطار کا استعمال کرتے وقت، براہ کرم نوٹ کریں کہ شائع شدہ پیغامات قطار میں برقرار رہیں گے، مثال کے طور پر، آئیے اوپر دیے گئے کوڈ کو ایک بار چلائیں۔ قطار میں 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("当前实盘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")
}
آئیے اس پر ایک نظر ڈالتے ہیں کہ ڈائل فنکشن میں پیغامات کو شائع کرنے اور سبسکرائب کرنے کے لیے کافکا پروٹوکول کا استعمال کیسے کریں۔
Dial("kafka://localhost:9092/test_topic")
کئی دوسرے پروٹوکولز کی طرح، پہلا حصہ پروٹوکول کا نام ہے۔ پھر سننے کے ایڈریس پر عمل کریں:localhost:9092. پھر علامت “/” کو الگ کرنے والے کے طور پر استعمال کریں، اس کے بعد سبسکرپشن/پبلشنگ کا موضوع یہاں پر سیٹ کیا گیا ہے۔test_topic。
ٹیسٹ کے نتائج:
