[TOC]
আর্থিক বাজারের দ্রুত বিকাশ এবং পরিমাণগত লেনদেনের প্রচলনের সাথে সাথে, আরও বেশি সংখ্যক ব্যবসায়ীরা স্বয়ংক্রিয় কৌশলগুলির উপর নির্ভর করতে শুরু করেছেন। এই প্রক্রিয়ায়, কৌশলগুলির মধ্যে যোগাযোগ এবং সমন্বয় বিশেষভাবে গুরুত্বপূর্ণ হয়ে উঠেছে। FMZ (Quantitative Trading Platform) দক্ষ ট্রেডিং কৌশলগুলিকে বাস্তব ডিশের মধ্যে যোগাযোগের প্রোটোকল সরবরাহ করে ব্যবসায়ীদের কৌশলগুলিকে নির্বিঘ্নে জুড়ে এবং রিয়েল-টাইম ডেটা ভাগ করে নিতে সহায়তা করে।
এই নিবন্ধটি এফএমজেড প্ল্যাটফর্মের মধ্যে ট্রেডিং কৌশল বাস্তব ডিশের মধ্যে যোগাযোগের প্রোটোকল সম্পর্কে গভীরভাবে অধ্যয়ন করবে, এর নকশা ধারণা, কার্যকারিতা বৈশিষ্ট্য এবং বাস্তব অ্যাপ্লিকেশনগুলির মধ্যে সুবিধাগুলি সম্পর্কে আলোচনা করবে। আমরা বিস্তারিত কেস বিশ্লেষণের মাধ্যমে দেখাব যে কীভাবে এই প্রোটোকলটি কার্যকর, স্থিতিশীল কৌশলগত যোগাযোগের জন্য ব্যবহার করা যায়, ট্রেডিং কৌশলগুলির কার্যকরতা এবং উপার্জন কর্মক্ষমতা উন্নত করে।
আপনি FMZ-তে নতুন quantity trading hobbyist বা অভিজ্ঞ professional programmer, এই নিবন্ধটি আপনাকে মূল্যবান অন্তর্দৃষ্টি এবং ব্যবহারিক গাইড প্রদান করবে। আসুন আমরা একসাথে FMZ-এর শক্তিশালী বৈশিষ্ট্যগুলি আবিষ্কার করি এবং কীভাবে দক্ষ যোগাযোগ প্রোটোকলের মাধ্যমে কৌশলগত সহযোগিতা অর্জন করতে, ট্রেডিং দক্ষতা বাড়াতে এবং বাজারের সুযোগগুলি ক্যাপচার করতে পারি তা শিখুন।
এই চাহিদা দৃশ্যগুলি বাস্তব অ্যাপ্লিকেশনগুলিতে FMZ ট্রেডিং কৌশলগুলির বাস্তব ডিস্ক যোগাযোগ প্রোটোকলের বিভিন্ন সম্ভাবনা এবং সুবিধাগুলি দেখায়। কার্যকর কৌশলগত যোগাযোগের মাধ্যমে, ব্যবসায়ীরা জটিল বাজারের পরিবেশকে আরও ভালভাবে মোকাবেলা করতে, ট্রেডিং কৌশলগুলি অনুকূল করতে, ট্রেডিং দক্ষতা এবং উপার্জন বাড়াতে পারে।
ডিস্কের মধ্যে যোগাযোগের চাহিদা বোঝার পর, কিভাবে এই চাহিদা পূরণ করা যায় তা বিবেচনা করা হয়। ডিস্ক A কেবল ডিস্ক B এর সাথে যোগাযোগ করতে চায়, যদিও চাহিদাটি সহজ বলে মনে হয়। তবে এর মধ্যে বিভিন্ন বিবরণ রয়েছে যা একটি যোগাযোগ প্রোটোকল ব্যবহার করে চুক্তি করা প্রয়োজন। FMZ বেশ কয়েকটি জনপ্রিয় যোগাযোগ প্রোটোকল প্যাকেজ করেছে।
mqtt / nats / amqp / kafka
যোগাযোগের কাঠামোঃ
এফএমজেড প্ল্যাটফর্মে এই প্রোটোকলগুলি প্রয়োগ করার সময়, সহজভাবে বোঝা যায় mqtt / nats / amqp / kafka।Dial()
ফাংশন ব্যবহার করেDial()
ফাংশনগুলি বার্তা প্রেরণ, সাবস্ক্রিপশন ইত্যাদি পরিচালনা করে। এই বার্তাগুলি প্রোটোকলের সার্ভার টার্ম এজেন্টের মাধ্যমে (রিল্যাক্স) সাবস্ক্রিপশনের ভার্চুয়াল ডিস্কে প্রেরণ করা হয়, তাই প্রথমে একটি প্রোটোকলের সার্ভার চালানো দরকার। সহজ উপস্থাপনের জন্য, নীচের উদাহরণগুলিতে আমরা বিভিন্ন প্রোটোকল সার্ভার টার্ম মিরর স্থাপনার ব্যবহার করি।
ডায়াল ফাংশনটির জন্য API ডকুমেন্টেশন বিভাগঃhttps://www.fmz.com/syntax-guide#fun_dial
ডকার মিরর স্থাপন করার আগে, ডকার সফটওয়্যার ইনস্টল করতে ভুলবেন না।
এখন আসুন আমরা একসাথে এক্সপ্লোর করি এবং FMZ দ্বারা সমর্থিত যোগাযোগ প্রোটোকল ব্যবহারের অনুশীলন করি।
এমকিউটিটি (Message Queuing Telemetry Transport) হল একটি হালকা ওজনের মেসেজ ট্রান্সপোর্ট প্রোটোকল, যা বিশেষ করে কম ব্যান্ডউইথ, উচ্চ বিলম্ব বা অনিশ্চিত নেটওয়ার্ক পরিবেশে কাজ করে। এটি 1999 সালে আইবিএম এর অ্যান্ডি স্ট্যানফোর্ড-ক্লার্ক এবং আর্লেন নিপার দ্বারা প্রস্তাবিত হয়েছিল, যা পরে আইএসও স্ট্যান্ডার্ড (আইএসও/আইইসি PRF 20922) হয়ে ওঠে।
এমকিউটিটি প্রোটোকলের প্রধান বৈশিষ্ট্যঃ প্রকাশ / সাবস্ক্রিপশন মোড
যেহেতু আমরা এমকিউটিটি প্রোটোকল সমর্থনকারী সফ্টওয়্যার (eclipse-mosquitto mirror) ব্যবহার করে ডকার মিরর (docker mirror) ব্যবহার করে এমকিউটিটি প্রজেক্ট সার্ভার স্থাপন করি, তাই ডকারটি আগে থেকে ইনস্টল করা উচিত এবং পরবর্তী বিবরণ নেই।
মিরর স্থাপন করার জন্য একটি কমান্ড চালানোর আগে, আমাদের একটি এজেন্ট সার্ভারের প্রোফাইল লিখতে হবে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 সার্ভার) এর সাথে সংযুক্ত হয় এবং gnatsd এর সাথে যোগাযোগ করে, সাধারণ TCP/IP সংমিশ্রণের উপর ভিত্তি করে যোগাযোগ করে এবং খুব ছোট অপারেশন সেট সংজ্ঞায়িত করে, লাইন পরিবর্তন করে। ঐতিহ্যগত, দ্বিপদী বার্তা ফর্ম্যাট ব্যবহার করে বার্তা যোগাযোগ ব্যবস্থার বিপরীতে, পাঠ্য-ভিত্তিক NATS প্রোটোকল ব্যবহার করা হয়, যা ক্লায়েন্টের বাস্তবায়নকে সহজ করে তোলে এবং এটি বাস্তবায়নের জন্য একাধিক প্রোগ্রামিং ভাষা বা স্ক্রিপ্ট ভাষা নির্বাচন করতে পারে।
প্রতিটি চুক্তির নিজস্ব বৈশিষ্ট্য রয়েছে, এবং এখানে বিস্তারিত বিবরণ নেই।
Nats প্রোটোকল সার্ভার স্থাপন করুনঃ
ডকার রান
name nats rm -p 4222:4222 -p 8222:8222 nats http_port 8222 auth admin
এই ডকার কমান্ডটি স্বয়ংক্রিয়ভাবে nats মিরর ডাউনলোড করে এবং চালায়। ৪২২২ পোর্ট হল সেই পোর্ট যেখানে ক্লায়েন্টটি অ্যাক্সেস করতে চায়। মিররটি মোতায়েন করার পরে, একটি HTTP মনিটর ৮২২২ পোর্টে খোলা থাকবে।
Listening for client connections on 0.0.0.0:4222
Server is ready
nats সার্ভার টার্মিনাল মিরর কাজ শুরু করে, পোর্ট 42222 এ নজরদারি করে।
আমাদের দুটি নীতি তৈরি করতে হবে (রিয়াল ডিস্ক) যা আমরা এখন পর্যন্ত নীতি A এবং নীতি B নামে নামকরণ করেছি, যা মূলত একই কোড। এটি FMZ প্ল্যাটফর্মের সবচেয়ে সহজ জাভাস্ক্রিপ্ট ভাষা ব্যবহার করে লেখা।
কৌশল এ
var connPub = null
var connSub = null
function main() {
var robotId = _G()
Log("当前实盘robotId:", robotId)
connPub = Dial("nats://admin@127.0.0.1:4222?topic=pubRobotA")
if (!connPub) {
Log("通信失败!")
return
}
connSub = Dial("nats://admin@127.0.0.1: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://admin@127.0.0.1:4222?topic=pubRobotB")
if (!connPub) {
Log("通信失败!")
return
}
connSub = Dial("nats://admin@127.0.0.1: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()
}
এই দুইটি কৌশল মূলত একই, কিন্তু একে অপরের সাথে পোস্ট, সাবস্ক্রাইব, সাবস্ক্রাইব, পোস্ট, পোস্ট, পোস্ট করা বিষয়বস্তু ভিন্ন।
উদাহরণস্বরূপ, কৌশল বিঃ
১, ব্যবহার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
এই বিষয়বস্তুতে, আপনি একটি সাবস্ক্রিপশন প্রয়োজন কারণ কৌশল A.pubRobotA
。
নীতি A-তে সাবস্ক্রিপশন, প্রকাশ এবং সংযোগের বস্তু তৈরি এবং ব্যবহারের জন্য উপরের বর্ণনার সাথে সমার্থক।
কৌশল 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:admin@127.0.0.1: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 টি বার্তা লিখেছে। তারপর আমরা দ্বিতীয়বার চালানোর সময় এটি খুঁজে পেয়েছি যে এটি প্রথমবারের মতো লেখা বার্তাটি আবার পড়বে। যেমন চিত্রটি দেখানো হয়েছেঃ
আপনি দেখতে পাচ্ছেন যে স্ক্রিনশটটিতে লাল তীরগুলি দুটি লগ বার্তাগুলি নির্দেশ করে, সময়গুলি এক নয়, কারণ লাল রঙের এই পাঠ্য বার্তাটি পলিসি কোডটি প্রথমবারের মতো চালানোর সময় কিউতে লেখা হয়েছিল।
এই বৈশিষ্ট্যটির উপর ভিত্তি করে কিছু চাহিদা পূরণ করা যেতে পারে, যেমনঃ নীতি ডিস্ক পুনরায় চালু হওয়ার পরেও, ক্যু থেকে রেকর্ড করা বাজারের ডেটা প্রাপ্ত করা যায়, যা প্রাথমিকীকরণ গণনার জন্য ব্যবহৃত হয়।
অ্যাপাচি কাফকা একটি বিতরণকৃত ডেটা সঞ্চয়স্থান যা স্ট্রিম ডেটাকে রিয়েল-টাইমে উত্তোলন এবং প্রক্রিয়া করার জন্য অনুকূলিত করা হয়েছে। স্ট্রিম ডেটা এমন ডেটা যা কয়েক হাজার ডেটা উত্স থেকে অবিচ্ছিন্নভাবে উত্পাদিত হয় এবং প্রায়শই একই সাথে ডেটা রেকর্ডগুলি প্রেরণ করা হয়। স্ট্রিম প্ল্যাটফর্মগুলিকে এই অবিচ্ছিন্ন প্রবাহিত ডেটা পরিচালনা করতে হবে, ধাপে ধাপে ক্রমে প্রক্রিয়াজাত করা হয়।
কাফকা তার ব্যবহারকারীদের জন্য তিনটি প্রধান বৈশিষ্ট্য প্রদান করেঃ
কাফকা মূলত ডেটা প্রবাহের সাথে সামঞ্জস্যপূর্ণ রিয়েল-টাইম স্ট্রিম ডেটা পাইপলাইন এবং অ্যাপ্লিকেশন তৈরির জন্য ব্যবহৃত হয়। এটি বার্তা রিসিভিং, স্টোরেজ এবং স্ট্রিম প্রসেসিংয়ের বৈশিষ্ট্যগুলিকে একত্রিত করে যা historicalতিহাসিক এবং রিয়েল-টাইম ডেটা সঞ্চয় করতে পারে।
কাফকা এজেন্টের ডকার চিত্রঃ
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
。
পরীক্ষার ফলাফলঃ