[TOC]
আর্থিক বাজারগুলির দ্রুত বিকাশ এবং পরিমাণগত ব্যবসায়ের জনপ্রিয়তার সাথে সাথে, আরও বেশি সংখ্যক ব্যবসায়ীরা ব্যবসায়ের জন্য স্বয়ংক্রিয় কৌশলগুলির উপর নির্ভর করতে শুরু করে। এই প্রক্রিয়ায়, কৌশলগুলির মধ্যে যোগাযোগ এবং সমন্বয় বিশেষভাবে গুরুত্বপূর্ণ। এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম ব্যবসায়ীদের কৌশল কৌশলগুলির মধ্যে একটি দক্ষ যোগাযোগ প্রোটোকল সরবরাহ করে বিরামবিহীন কৌশল ডকিং এবং রিয়েল-টাইম ডেটা শেয়ারিং অর্জন করতে সহায়তা করে।
এই নিবন্ধটি এফএমজেড প্ল্যাটফর্মে ট্রেডিং কৌশলগুলির লাইভ ট্রেডিং যোগাযোগ প্রোটোকলটি অন্বেষণ করবে, এর নকশা ধারণা, কার্যকরী বৈশিষ্ট্য এবং ব্যবহারিক অ্যাপ্লিকেশনগুলিতে সুবিধাগুলি পরিচয় করিয়ে দেবে। বিস্তারিত কেস বিশ্লেষণের মাধ্যমে, আমরা দক্ষ এবং স্থিতিশীল কৌশল যোগাযোগ অর্জনের জন্য এই প্রোটোকলটি কীভাবে ব্যবহার করব তা দেখাব এবং ট্রেডিং কৌশলগুলির কার্যকরকরণ এবং লাভের পারফরম্যান্স উন্নত করব।
আপনি যদি একটি পরিমাণগত ট্রেডিং উত্সাহী হন যা কেবলমাত্র এফএমজেড বা অভিজ্ঞ পেশাদার প্রোগ্রামার দিয়ে শুরু হয় তবে এই নিবন্ধটি আপনাকে মূল্যবান অন্তর্দৃষ্টি এবং ব্যবহারিক অপারেশন গাইড সরবরাহ করবে। আসুন আমরা এফএমজেড প্ল্যাটফর্মের শক্তিশালী ফাংশনগুলি অন্বেষণ করি এবং দক্ষ যোগাযোগ প্রোটোকলের মাধ্যমে কৌশলগুলির মধ্যে সহযোগিতা অর্জন, ট্রেডিং দক্ষতা উন্নত করা এবং বাজারের সুযোগগুলি ক্যাপচার করার উপায় শিখুন।
এই চাহিদা দৃশ্যকল্পগুলি বাস্তব অ্যাপ্লিকেশনগুলিতে এফএমজেড ট্রেডিং কৌশল লাইভ ট্রেডিং যোগাযোগ প্রোটোকলের বিভিন্ন সম্ভাবনা এবং সুবিধা প্রদর্শন করে। কার্যকর আন্তঃ-কৌশল যোগাযোগের মাধ্যমে, ব্যবসায়ীরা জটিল বাজারের পরিবেশের সাথে আরও ভালভাবে মোকাবিলা করতে, ট্রেডিং কৌশলগুলি অনুকূল করতে এবং ট্রেডিং দক্ষতা এবং মুনাফা উন্নত করতে পারে।
লাইভ ট্রেডিংয়ের মধ্যে যোগাযোগের প্রয়োজনীয়তাগুলি বোঝার পরে, আমাদের এই প্রয়োজনীয়তাগুলি কীভাবে বাস্তবায়ন করতে হবে তা বিবেচনা করতে হবে। এটি লাইভ ট্রেডিং এ এর সাথে লাইভ ট্রেডিং বি এর সাথে তথ্য বিনিময় করার আশায় লাইভ ট্রেডিং এর চেয়ে বেশি কিছু নয়। যদিও প্রয়োজনীয়তাগুলি সহজ বলে মনে হচ্ছে, যোগাযোগ প্রোটোকলগুলির একটি সেট ব্যবহার করার সময় বিভিন্ন বিবরণে সম্মত হওয়া দরকার। এফএমজেড বেশ কয়েকটি জনপ্রিয় যোগাযোগ প্রোটোকলকে ক্যাপসুল করেছে।
mqtt / nats / amqp / kafka
যোগাযোগ স্থাপত্য হলঃ
FMZ প্ল্যাটফর্মে এই প্রোটোকলগুলি প্রয়োগ করার সময় এটি সহজেই বোঝা যায় যে mqtt / nats / amqp / kafkapro-Dial()
ফাংশন, এবংDial()
ফাংশনটি বার্তা প্রকাশ এবং সাবস্ক্রাইব করার জন্য ব্যবহৃত হয়। এই প্রকাশিত বার্তাগুলি প্রোটোকল সার্ভারের মাধ্যমে সাবস্ক্রাইব করা লাইভ ট্রেডিংয়ে প্রক্সি (রিলে) করা হয়, তাই প্রথমে একটি প্রোটোকল সার্ভার চালানো আবশ্যক। প্রদর্শনের জন্য, আমরা নিম্নলিখিত উদাহরণগুলিতে বিভিন্ন প্রোটোকল সার্ভার ইমেজ স্থাপনার ব্যবহার করি।
এপিআই ডকুমেন্টেশন বিভাগে ডায়াল ফাংশনঃhttps://www.fmz.com/syntax-guide#fun_dial
ডকার ইমেজ স্থাপন করার আগে, প্রথমে ডকার সফটওয়্যার ইনস্টল করতে ভুলবেন না।
এরপরে, আসুন আমরা FMZ দ্বারা সমর্থিত যোগাযোগ প্রোটোকল অ্যাপ্লিকেশনগুলি অন্বেষণ এবং অনুশীলন করি।
এমকিউটিটি (মেসেজ ক্যুয়েজিং টেলিমেট্রি ট্রান্সপোর্ট) একটি হালকা ওজনের বার্তা সংক্রমণ প্রোটোকল যা নিম্ন ব্যান্ডউইথ, উচ্চ বিলম্ব বা অ-নির্ভরযোগ্য নেটওয়ার্ক পরিবেশের জন্য বিশেষভাবে উপযুক্ত। এটি 1999 সালে আইবিএমের অ্যান্ডি স্ট্যানফোর্ড-ক্লার্ক এবং আর্লেন নিপার দ্বারা প্রস্তাবিত হয়েছিল এবং পরে এটি একটি আইএসও স্ট্যান্ডার্ড (আইএসও / আইইসি পিআরএফ 20922) হয়ে ওঠে।
এমকিউটিটি প্রোটোকলের প্রধান বৈশিষ্ট্যঃ প্রকাশ / সাবস্ক্রাইব মোড
যেহেতু আমরা এমকিউটিটি প্রক্সি সার্ভার স্থাপন করতে এমকিউটিটি প্রোটোকল সমর্থন করে এমন সফ্টওয়্যারটির ডকার ইমেজ (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
তারপর deployment কমান্ডটি চালানঃ
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
.
উপরের কৌশলটি একই সময়ে একটি বিষয় প্রকাশ করে এবং সাবস্ক্রাইব করে। চলমান পরীক্ষাটি চিত্রটিতে দেখানো হয়েছেঃ
আমরা একে অপরের সাবস্ক্রাইব এবং বিষয় তথ্য প্রকাশ করতে দুটি লাইভ ট্রেডিং ব্যবহার করতে পারি। আমরা nats প্রোটোকল অনুশীলন বিভাগে যেমন একটি উদাহরণ ব্যবহার করি, এবং অন্যান্য প্রোটোকলগুলিতে এই পদ্ধতিটি পুনরাবৃত্তি করব না।
এনএটিএস প্রোটোকল একটি সহজ, পাঠ্য-ভিত্তিক প্রকাশ / সাবস্ক্রাইব স্টাইল প্রোটোকল। ক্লায়েন্ট gnatsd (NATS সার্ভার) এর সাথে সংযোগ স্থাপন করে এবং gnatsd এর সাথে যোগাযোগ করে। যোগাযোগটি সাধারণ টিসিপি / আইপি সকেটের উপর ভিত্তি করে এবং অপারেশনগুলির একটি খুব ছোট সেট সংজ্ঞায়িত করে। নিউলাইন সমাপ্তি নির্দেশ করে। বাইনারি বার্তা ফর্ম্যাট ব্যবহার করে traditionalতিহ্যবাহী বার্তা যোগাযোগ সিস্টেমের বিপরীতে, পাঠ্য-ভিত্তিক এনএটিএস প্রোটোকল ক্লায়েন্ট বাস্তবায়নকে খুব সহজ করে তোলে এবং বিভিন্ন প্রোগ্রামিং ভাষা বা স্ক্রিপ্টিং ভাষায় সহজেই বাস্তবায়ন করা যেতে পারে।
প্রতিটি প্রোটোকলের নিজস্ব বৈশিষ্ট্য রয়েছে। আপনি নির্দিষ্ট নথি এবং উপকরণগুলি উল্লেখ করতে পারেন, যা এখানে বিশদভাবে ব্যাখ্যা করা হবে না।
NATS প্রোটোকল সার্ভার স্থাপন করুনঃ
ডকার রান
name nats rm -p 4222:4222 -p 8222:8222 nats http_port 8222 auth admin
এই ডকার কমান্ডটি স্বয়ংক্রিয়ভাবে nats চিত্রটি ডাউনলোড করবে এবং চালাবে, এবং পোর্ট 4222 হল সেই পোর্ট যা ক্লায়েন্টকে অ্যাক্সেস করতে হবে। চিত্রটি স্থাপন করার পরে একটি http মনিটরও 8222 পোর্টে খোলা হবে।
Listening for client connections on 0.0.0.0:4222
Server is ready
Nats সার্ভার ইমেজ চালানো শুরু, পোর্ট 4222 উপর শুনতে.
আমাদের দুটি কৌশল (লাইভ ট্রেডিং) তৈরি করতে হবে, আসুন তাদের কৌশল A এবং কৌশল B নামকরণ করি। এই দুটি কৌশলগুলির কোডগুলি মূলত একই। এগুলি জাভাস্ক্রিপ্টে লেখা হয়েছে, যা এফএমজেড প্ল্যাটফর্মে ব্যবহারের জন্য সবচেয়ে সহজ ভাষা।
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 তথ্য পাঠায়।
কৌশল A-তে সাবস্ক্রিপশন এবং প্রকাশনার সংযোগ বস্তু তৈরি এবং ব্যবহার উপরে বর্ণিত হিসাবে একই।
এইভাবে, NATS প্রোটোকল অ্যাপ্লিকেশনের একটি সহজ উদাহরণ বাস্তবায়িত হয় যেখানে লাইভ ট্রেডিং এ এবং লাইভ ট্রেডিং বি একে অপরের সাথে যোগাযোগের জন্য বার্তাগুলি সাবস্ক্রাইব করে এবং প্রকাশ করে।
অ্যাসিনক্রোন যোগাযোগে, বার্তাটি অবিলম্বে রিসিভারে পৌঁছবে না, তবে এটি একটি কন্টেইনারে সংরক্ষণ করা হবে। যখন নির্দিষ্ট শর্ত পূরণ করা হবে, তখন বার্তাটি কন্টেইনার দ্বারা রিসিভারে প্রেরণ করা হবে। এই কন্টেইনারটি বার্তা সারি। এই ফাংশনটি সম্পূর্ণ করতে, উভয় পক্ষ এবং কন্টেইনার এবং এর উপাদানগুলিকে ইউনিফাইড চুক্তি এবং নিয়ম মেনে চলতে হবে। এএমকিউপি এমন একটি প্রোটোকল। বার্তা প্রেরক এবং রিসিভার উভয়ই এই প্রোটোকল মেনে চলার মাধ্যমে অ্যাসিনক্রোন যোগাযোগ বাস্তবায়ন করতে পারে। এই প্রোটোকলটি বার্তার বিন্যাস এবং কাজের পদ্ধতি নির্ধারণ করে।
প্রতিটি প্রোটোকলের নিজস্ব বৈশিষ্ট্য রয়েছে। আপনি নির্দিষ্ট নথি এবং উপকরণগুলি উল্লেখ করতে পারেন, যা এখানে বিশদভাবে ব্যাখ্যা করা হবে না।
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("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 টি বার্তা সারিতে লেখা হবে। তারপর যখন আমরা এটি দ্বিতীয়বার চালাই, আমরা দেখতে পাচ্ছি যে প্রথম লিখিত বার্তাটি পড়ার সময় আবার পড়া হবে। যেমন চিত্রটিতে দেখানো হয়েছেঃ
আমরা দেখতে পাচ্ছি যে স্ক্রিনশটে লাল তীর দ্বারা নির্দেশিত দুটি লগ বার্তাগুলির সময় অসঙ্গতিপূর্ণ। কারণ হল যে লাল বার্তাটি সেই বার্তা যা প্রথম কৌশল কোডটি চালানোর সময় সারিটিতে পড়া এবং লেখা হয়েছিল।
এই বৈশিষ্ট্যের উপর ভিত্তি করে, কিছু প্রয়োজনীয়তা পূরণ করা যেতে পারে। উদাহরণস্বরূপ, কৌশল পুনরায় চালু করার পরে, রেকর্ড করা বাজার তথ্য এখনও শুরু গণনা এবং অন্যান্য ক্রিয়াকলাপের জন্য কিউ থেকে প্রাপ্ত করা যেতে পারে।
অ্যাপাচি কাফকা একটি বিতরণকৃত ডেটা স্টোর যা রিয়েল টাইমে স্ট্রিমিং ডেটা গ্রহন এবং প্রক্রিয়া করার জন্য অনুকূলিত। স্ট্রিমিং ডেটা এমন ডেটা যা হাজার হাজার ডেটা উত্স দ্বারা অবিচ্ছিন্নভাবে উত্পন্ন হয়, প্রায়শই একযোগে ডেটা রেকর্ড প্রেরণ করে। স্ট্রিমিং প্ল্যাটফর্মের এই অবিচ্ছিন্ন প্রবাহকে পরিচালনা করতে হবে, এটি ধারাবাহিকভাবে এবং ধারাবাহিকভাবে প্রক্রিয়া করে।
কাফকা তার ব্যবহারকারীদের জন্য তিনটি প্রধান ফাংশন প্রদান করেঃ
কাফকা মূলত রিয়েল-টাইম স্ট্রিমিং ডেটা পাইপলাইন এবং অ্যাপ্লিকেশনগুলি তৈরি করতে ব্যবহৃত হয় যা ডেটা স্ট্রিমগুলিতে অভিযোজিত হয়। এটি বার্তা, স্টোরেজ এবং স্ট্রিম প্রসেসিংয়ের ক্ষমতা একত্রিত করে এবং 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("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
.
পরীক্ষার ফলাফল: