[TOC]

আর্থিক বাজারের দ্রুত বিকাশ এবং পরিমাণগত ট্রেডিংয়ের জনপ্রিয়তার সাথে, আরও বেশি সংখ্যক ব্যবসায়ী ট্রেডিংয়ের জন্য স্বয়ংক্রিয় কৌশলগুলির উপর নির্ভর করতে শুরু করেছে। এই প্রক্রিয়ায়, কৌশলগুলির মধ্যে যোগাযোগ এবং সমন্বয় বিশেষভাবে গুরুত্বপূর্ণ। FMZ (পরিমাণগত ট্রেডিং প্ল্যাটফর্ম) প্রকৃত ট্রেডিং কৌশলগুলির মধ্যে একটি দক্ষ যোগাযোগ প্রোটোকল প্রদান করে ব্যবসায়ীদের কৌশলগুলির নিরবিচ্ছিন্ন ডকিং এবং রিয়েল-টাইম ডেটা শেয়ারিং অর্জনে সহায়তা করে।
এই নিবন্ধটি এফএমজেড প্ল্যাটফর্মে ট্রেডিং কৌশল এবং বাস্তব অর্ডারগুলির মধ্যে যোগাযোগের প্রোটোকলের মধ্যে অনুসন্ধান করবে এবং এর নকশা ধারণা, কার্যকরী বৈশিষ্ট্য এবং ব্যবহারিক অ্যাপ্লিকেশনগুলিতে সুবিধাগুলি উপস্থাপন করবে। বিস্তারিত কেস বিশ্লেষণের মাধ্যমে, আমরা প্রদর্শন করব কিভাবে এই প্রোটোকলটি ব্যবহার করে দক্ষ এবং স্থিতিশীল কৌশল যোগাযোগ অর্জন করতে হয় এবং ট্রেডিং কৌশলগুলির কার্য সম্পাদন এবং রিটার্ন কর্মক্ষমতা উন্নত করতে হয়।
আপনি একজন পরিমাণগত ট্রেডিং উত্সাহী যিনি সবেমাত্র FMZ এর সাথে শুরু করছেন, বা একজন অভিজ্ঞ পেশাদার প্রোগ্রামার, এই নিবন্ধটি আপনাকে মূল্যবান অন্তর্দৃষ্টি এবং ব্যবহারিক অপারেশন গাইড প্রদান করবে। আসুন আমরা একসাথে FMZ এর শক্তিশালী ফাংশনগুলি অন্বেষণ করি এবং বুঝতে পারি কীভাবে কৌশলগুলির মধ্যে সহযোগিতা অর্জন করা যায়, লেনদেনের দক্ষতা উন্নত করা যায় এবং দক্ষ যোগাযোগ প্রোটোকলের মাধ্যমে বাজারের সুযোগগুলি ক্যাপচার করা যায়।
এই চাহিদার পরিস্থিতিগুলি বাস্তব অ্যাপ্লিকেশনগুলিতে FMZ ট্রেডিং কৌশল আন্তঃ-রিয়েল-টাইম যোগাযোগ প্রোটোকলের একাধিক সম্ভাবনা এবং সুবিধাগুলি প্রদর্শন করে। কার্যকর আন্তঃকৌশল যোগাযোগের মাধ্যমে, ব্যবসায়ীরা জটিল বাজার পরিবেশের সাথে আরও ভালভাবে মোকাবিলা করতে পারে, ট্রেডিং কৌশলগুলিকে অপ্টিমাইজ করতে পারে এবং ট্রেডিং দক্ষতা এবং লাভ উন্নত করতে পারে।
বাস্তব ডিস্কের মধ্যে যোগাযোগের প্রয়োজনীয়তা বোঝার পরে, এই প্রয়োজনীয়তাগুলি কীভাবে বাস্তবায়ন করা যায় তা বিবেচনা করার সময় এসেছে। এটি বাস্তব অফার ছাড়া আর কিছুই নয় A বাস্তব অফার B এর সাথে তথ্য বিনিময় করার আশা করছে, যদিও প্রয়োজনটি খুব সহজ বলে মনে হচ্ছে। যাইহোক, এফএমজেড বেশ কয়েকটি জনপ্রিয় যোগাযোগ প্রোটোকলের একটি সেট ব্যবহার করার বিষয়ে একমত হওয়া প্রয়োজন।
mqtt / nats / amqp / kafka
যোগাযোগের স্থাপত্য হল:
FMZ প্ল্যাটফর্মে এই প্রোটোকলগুলি প্রয়োগ করার সময়, এটিকে সহজভাবে বোঝা যায় mqtt/nats/amqp/kafka হিসাবেDial()ফাংশনে, ব্যবহার করুনDial()ফাংশনগুলি বার্তা প্রকাশ এবং সদস্যতার মতো ক্রিয়াকলাপগুলি সম্পাদন করে। এই প্রকাশিত বার্তাগুলি প্রোটোকলের সার্ভারের মাধ্যমে সাবস্ক্রাইব করা ক্লায়েন্টদের কাছে প্রক্সিড (রিলেড) হয়, তাই প্রথমে প্রোটোকলের একটি সার্ভার চালাতে হবে। প্রদর্শনের সুবিধার জন্য, নিম্নলিখিত উদাহরণগুলিতে আমরা বিভিন্ন প্রোটোকল সার্ভার ইমেজ স্থাপনা ব্যবহার করি।
API ডকুমেন্টেশন অধ্যায় যেখানে ডায়াল ফাংশন অবস্থিত: https://www.fmz.com/syntax-guide#fun_dial
ডকার ইমেজ স্থাপন করার আগে, প্রথমে ডকার সফ্টওয়্যার ইনস্টল করতে মনে রাখবেন।

এরপর, আসুন আমরা FMZ দ্বারা সমর্থিত যোগাযোগ প্রোটোকল অ্যাপ্লিকেশনগুলি অন্বেষণ এবং অনুশীলন করি।
MQTT (মেসেজ কিউইং টেলিমেট্রি ট্রান্সপোর্ট) হল একটি লাইটওয়েট মেসেজ ট্রান্সমিশন প্রোটোকল, বিশেষত কম-ব্যান্ডউইথ, উচ্চ-লেটেন্সি বা অবিশ্বস্ত নেটওয়ার্ক পরিবেশের জন্য উপযুক্ত। এটি 1999 সালে আইবিএম-এর অ্যান্ডি স্ট্যানফোর্ড-ক্লার্ক এবং আর্লেন নিপার দ্বারা প্রস্তাবিত হয়েছিল এবং পরে এটি একটি ISO স্ট্যান্ডার্ড (ISO/IEC PRF 20922) হয়ে ওঠে।
MQTT প্রোটোকলের প্রধান বৈশিষ্ট্য: প্রকাশ/সাবস্ক্রাইব মডেল
যেহেতু আমরা এমকিউটিটি প্রক্সি সার্ভার স্থাপনের জন্য এমকিউটিটি প্রোটোকল সমর্থন করে এমন সফ্টওয়্যারটির ডকার ইমেজ (ইক্লিপস-মস্কিটো ইমেজ) ব্যবহার করি, তাই আমাদের আগে থেকে ডকার ইনস্টল করতে হবে এবং পরে বিস্তারিত জানা যাবে না।
ইমেজ স্থাপন করার কমান্ড চালানোর আগে, আমাদের একটি প্রক্সি সার্ভার কনফিগারেশন ফাইল লিখতে হবে।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 প্রোটোকল হল একটি সহজ, পাঠ্য-ভিত্তিক প্রকাশ/সাবস্ক্রাইব স্টাইল প্রোটোকল। ক্লায়েন্ট gnatsd (NATS সার্ভার) এর সাথে যোগাযোগ করে এবং যোগাযোগটি সাধারণ TCP/IP সকেটের উপর ভিত্তি করে এবং নিউলাইন পরিসমাপ্তি নির্দেশ করে। বাইনারি বার্তা ফর্ম্যাট ব্যবহার করে এমন ঐতিহ্যবাহী বার্তা যোগাযোগ ব্যবস্থা থেকে ভিন্ন, পাঠ্য-ভিত্তিক 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 এই দুটি কৌশলের কোডগুলি মূলত একই। 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-তে সাবস্ক্রিপশন এবং প্রকাশনা সংযোগ বস্তু তৈরি এবং ব্যবহার উপরে বর্ণিত হিসাবে একই।


এইভাবে, একটি সাধারণ ন্যাট প্রোটোকল অ্যাপ্লিকেশন উদাহরণ বাস্তবায়িত হয় যেখানে বাস্তব অফার A এবং বাস্তব অফার B একে অপরের সাথে সাবস্ক্রাইব করে এবং যোগাযোগের জন্য বার্তা প্রকাশ করে।
অ্যাসিঙ্ক্রোনাস কমিউনিকেশনে, বার্তাটি রিসিভারের কাছে পৌঁছাবে না, তবে কিছু শর্ত পূরণ হলে, বার্তাটি রিসিভারের কাছে পাঠানো হবে এবং এটি সম্পূর্ণ করে ফাংশনের জন্য উভয় পক্ষের প্রয়োজন হয় একীভূত কনভেনশন এবং নিয়মগুলি মেনে চলে AMQP এই প্রোটোকলের সাথে বার্তা পাঠানো এবং গ্রহণ করে। এই প্রোটোকল বার্তাগুলির বিন্যাস এবং কাজের মোড নির্ধারণ করে।
প্রতিটি প্রোটোকলের নিজস্ব বৈশিষ্ট্য রয়েছে আপনি নির্দিষ্ট নথি এবং তথ্য এখানে দেখতে পাবেন না।
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 প্রোটোকল কিউ ব্যবহার করার সময়, অনুগ্রহ করে মনে রাখবেন যে প্রকাশিত বার্তাগুলি কিউতে থাকবে। উদাহরণস্বরূপ, উপরের উদাহরণ কোডটি একবার রান করা যাক। সারিতে ১০টি বার্তা লেখা হবে। তারপর যখন আমরা এটি দ্বিতীয়বার চালাই, তখন আমরা দেখতে পাই যে পড়ার সময়, প্রথমবার লেখা তথ্য আবার পড়া হবে। চিত্রে দেখানো হয়েছে:

আপনি দেখতে পাচ্ছেন যে স্ক্রিনশটে লাল তীর দ্বারা নির্দেশিত দুটি লগ মেসেজ সময়ের সাথে সামঞ্জস্যপূর্ণ নয় কারণ হল যে পলিসি কোডটি প্রথমবার চালানো হলে লাল বার্তাটি সারিতে লেখা হয়৷
এই বৈশিষ্ট্যের উপর ভিত্তি করে, কিছু প্রয়োজনীয়তা উপলব্ধি করা যেতে পারে, উদাহরণস্বরূপ, কৌশলটি পুনরায় চালু করার পরে, রেকর্ড করা বাজারের ডেটা এখনও শুরুর গণনা এবং অন্যান্য ক্রিয়াকলাপের জন্য প্রাপ্ত করা যেতে পারে।
অ্যাপাচি কাফকা হল একটি বিতরণকৃত ডেটা স্টোর যা রিয়েল টাইমে স্ট্রিমিং ডেটা গ্রহণ এবং প্রক্রিয়াকরণের জন্য অপ্টিমাইজ করা হয়েছে। স্ট্রিমিং ডেটা বলতে এমন ডেটা বোঝায় যা হাজার হাজার ডেটা উৎস দ্বারা ক্রমাগত তৈরি হয়, প্রায়শই একই সাথে ডেটা রেকর্ড প্রেরণ করে। স্ট্রিমিং প্ল্যাটফর্মটিকে এই ধারাবাহিকভাবে প্রবাহিত ডেটা প্রক্রিয়া করতে হবে এবং ধাপে ধাপে ক্রমানুসারে এটি প্রক্রিয়া করতে হবে।
কাফকা তার ব্যবহারকারীদের তিনটি প্রধান ক্ষমতা প্রদান করে:
কাফকা প্রাথমিকভাবে রিয়েল-টাইম স্ট্রিমিং ডেটা পাইপলাইন এবং ডেটা প্রবাহের সাথে খাপ খাইয়ে নেওয়া অ্যাপ্লিকেশন তৈরির জন্য ব্যবহৃত হয়। এটি ঐতিহাসিক এবং রিয়েল-টাইম ডেটা সঞ্চয় করতে মেসেজিং, স্টোরেজ এবং স্ট্রিম প্রসেসিং ক্ষমতাকে একত্রিত করে।
কাফকা প্রক্সির ডকার ইমেজ স্থাপন করুন:
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。
পরীক্ষার ফলাফল:
