এটি একটি ওয়েবসকেট মার্কেট টেমপ্লেট যা এফএমজেড কর্তৃক আনুষ্ঠানিকভাবে বিকাশ করা হয়েছে। সকল ব্যবহারকারীকে এটি অনুলিপি এবং ব্যবহার করার জন্য স্বাগতমঃhttps://www.fmz.com/strategy/470349
বর্তমানে, এফএমজেড কৌশলটি মূলত traditionalতিহ্যবাহী আরইএসটি এপিআই ইনক্যাপসুলেশনের উপর ভিত্তি করে। এপিআই অ্যাক্সেসের প্রতিটি পদক্ষেপে একটি নেটওয়ার্ক সংযোগ স্থাপন করা প্রয়োজন এবং মার্কেট ডেটা পোলিংয়ের মাধ্যমে প্রাপ্ত হয়। এই পদ্ধতিটি সহজ এবং ব্যবহার করা সহজ, এবং এটি বেশিরভাগ প্রয়োজনের জন্য সম্পূর্ণরূপে পর্যাপ্ত।
তবে, REST প্রোটোকলের একটি অন্তর্নিহিত বিলম্ব সমস্যা রয়েছে। যখন একাধিক ট্রেডিং জোড়া এবং একাধিক এক্সচেঞ্জ কৌশল প্রয়োজন হয়, তখন বিলম্ব সমস্যাটি প্রসারিত হবে। যদিও প্ল্যাটফর্মের গো ফাংশনটি সমান্তরালভাবে কার্যকর করা যেতে পারে, বিলম্ব সমস্যা এখনও বিদ্যমান রয়েছে, যা তুলনামূলকভাবে উচ্চ ফ্রিকোয়েন্সি কৌশল ব্যবসায়ের চাহিদা মেটাতে অসুবিধা করে তোলে। এছাড়াও, যদি খুব বেশি ট্রেডিং জোড়া থাকে এবং পোলিং ফ্রিকোয়েন্সি খুব দ্রুত হয় তবে এটি ট্রেডিং প্ল্যাটফর্মের অ্যাক্সেস ফ্রিকোয়েন্সি সীমাবদ্ধতার মুখোমুখি হবে।
বর্তমানে, এক্সচেঞ্জের সার্ভারগুলিও ভারী বোঝার অধীনে রয়েছে। তারা সকলেই একটি সম্পূর্ণ ওয়েবসকেট প্রোটোকল সরবরাহ করে এবং এপিআই ব্যবহারকারীদের কাছে এটি সুপারিশ করে। REST প্রোটোকলের তুলনায়, ওয়েবসকেট একটি স্থায়ী দ্বি-মুখী সংযোগ পদ্ধতি সরবরাহ করে, যা এক্সচেঞ্জগুলিকে ক্লায়েন্টে রিয়েল টাইমে ডেটা চাপতে সক্ষম করে, ঘন ঘন অনুরোধ এবং প্রতিক্রিয়া এড়ায়, যার ফলে বিলম্বকে ব্যাপকভাবে হ্রাস করে। সাধারণভাবে বলতে গেলে, যদি REST API অ্যাক্সেসের বিলম্বন প্রায় 20ms হয়, তবে ওয়েবসকেটের মাধ্যমে ডেটা চাপতে বিলম্ব প্রায় 2ms হয়। এছাড়াও, ওয়েবসকেট প্রোটোকলের লিঙ্কটি প্ল্যাটফর্ম অ্যাক্সেস ফ্রিকোয়েন্সি দ্বারা সীমাবদ্ধ নয় এবং একসাথে কয়েক ডজন ট্রেডিং জোড়ার সাবস্ক্রাইব করা সম্ভব।
এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্মটি দীর্ঘদিন ধরে ওয়েবসকেট প্রোটোকলকে সমর্থন করেছে এবং এটি কল করা তুলনামূলকভাবে সুবিধাজনক, তবে শিক্ষানবিস ব্যবহারকারীদের জন্য, একাধিক সাবস্ক্রিপশন পরিচালনা করা, একাধিক এক্সচেঞ্জ টিকার সাবস্ক্রাইব করা এবং এগুলিকে দক্ষতার সাথে এবং সুবিধাজনকভাবে পুরো কৌশল প্রক্রিয়ায় এম্বেড করা এখনও খুব জটিল। এই পাবলিক ওয়েবসকেট রিয়েল-টাইম টিকার ডেটা ত্বরণ টেমপ্লেট এই সমস্যাটি সমাধান করে। এটি ব্যবহার করা খুব সহজ এবং বর্তমান ইনক্যাপসুলার এপিআই কলের সাথে সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ। বেশিরভাগ মূল REST কৌশলগুলির জন্য, আপনি কেবলমাত্র এগুলি সংশোধন করতে পারেন এবং আপনার কৌশলটি ত্বরান্বিত করতে সরাসরি ব্যবহার করতে পারেন।
মূল বৈশিষ্ট্য:
মনে রাখবেন যে এই কৌশলটি টাইপস্ক্রিপ্ট ব্যবহার করে। আপনি যদি কেবল জাভাস্ক্রিপ্টের সাথে পরিচিত হন তবে এটি কিছুটা অদ্ভুত দেখা দিতে পারে। টাইপস্ক্রিপ্ট জাভাস্ক্রিপ্টের উপর ভিত্তি করে একটি টাইপ সিস্টেম এবং সমৃদ্ধ ভাষার বৈশিষ্ট্যগুলি প্রবর্তন করে। পরিমাণগত ব্যবসায়ের মতো অ্যাপ্লিকেশনগুলির জন্য যা জটিল লজিক পরিচালনা করতে হবে, টাইপস্ক্রিপ্ট ব্যবহার করে সম্ভাব্য ত্রুটিগুলি হ্রাস করতে পারে এবং কোডের পাঠযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা উন্নত করতে পারে। অতএব, এটি সংক্ষেপে শেখার পরামর্শ দেওয়া হয়।
এছাড়াও, কৌশলটি এফএমজেড প্ল্যাটফর্মের অ্যাসিনক্রোনস প্রক্রিয়া ব্যবহার করে। শিশু থ্রেডটি __threadPostMessage ফাংশনের মাধ্যমে প্রধান থ্রেডে বার্তা প্রেরণ করতে পারে। এই পদ্ধতিটি অ্যাসিনক্রোনস এবং শিশু থ্রেডে উত্পন্ন ডেটা আপডেটগুলির মূল থ্রেডকে জানানোর জন্য উপযুক্ত। প্রধান থ্রেড এবং শিশু থ্রেড __threadGetData এবং __threadSetData ফাংশনের মাধ্যমে ডেটা ভাগ করতে পারে। এই পদ্ধতিটি থ্রেডগুলিকে ভাগ করা অবস্থা অ্যাক্সেস এবং সংশোধন করতে দেয়। আপনি যদি প্ল্যাটফর্ম ডকুমেন্টেশনের সাথে মিলিয়ে মাল্টিথ্রেডিং সম্পর্কে শিখতে চান তবে এই কৌশলটিও একটি ভাল শেখার উদাহরণ।
এই কৌশলটির মূল নীতি হ'ল ওয়েব সকেটের মাধ্যমে মূলধারার ডিজিটাল মুদ্রা এক্সচেঞ্জগুলিতে সংযোগ স্থাপন করা এবং পরিমাণগত ট্রেডিং সিদ্ধান্তের জন্য ডেটা সমর্থন প্রদানের জন্য রিয়েল টাইমে বাজার ডেটা (যেমন গভীরতা তথ্য এবং লেনদেনের তথ্য) গ্রহণ করা। নির্দিষ্ট বাস্তবায়ন প্রক্রিয়াটি নিম্নরূপঃ
1. ওয়েবসকেট সংযোগ সেটিংসফাংশনsetupWebsocket
একটি ওয়েবসকেট সংযোগ আরম্ভ এবং বাজার তথ্য গ্রহণ করতে ব্যবহৃত হয়. এটি একটি পরামিতি গ্রহণmain_exchanges
, সংযোগ করার জন্য এক্সচেঞ্জ নির্দেশ করে।
MyDial
ফাংশন: একটি ওয়েবসকেট সংযোগ তৈরি করুন, সংযোগ সময় রেকর্ড করুন, এবং সংযোগ বন্ধ করার সময় বন্ধ সময় আউটপুট।updateSymbols
ফাংশন: নতুন সাবস্ক্রিপশন অনুরোধের জন্য নিয়মিত চেক করুন এবং প্রয়োজন হলে বর্তমান ট্রেডিং জোড়ার তালিকা আপডেট করুন।২. তথ্য প্রক্রিয়াকরণবস্তুsupports
সমর্থিত এক্সচেঞ্জ এবং তাদের প্রসেসিং ফাংশন (যেমনBinance
) প্রতিটি এক্সচেঞ্জের প্রসেসিং ফাংশন প্রাপ্ত বার্তা বিশ্লেষণ এবং প্রাসঙ্গিক তথ্য আহরণের জন্য দায়ী।
processMsg
ফাংশন: এক্সচেঞ্জ থেকে বার্তাগুলি প্রক্রিয়া করুন, বিভিন্ন ধরণের ডেটা সনাক্ত করুন (যেমন গভীরতা আপডেট, লেনদেন ইত্যাদি) এবং একটি ইউনিফাইড ইভেন্ট অবজেক্টে ফর্ম্যাট করুন।৩. সাবস্ক্রিপশন তথ্যপ্রতিটি সংযোগে, বর্তমান ট্রেডিং জোড়ার উপর ভিত্তি করে সিস্টেমটি সংশ্লিষ্ট বাজার ডেটা চ্যানেলগুলিতে সাবস্ক্রাইব করবে।
getFunction
ফাংশন: এক্সচেঞ্জ নাম অনুযায়ী সংশ্লিষ্ট প্রসেসিং ফাংশন পান।this.wssPublic
ফাংশন: ওয়েবসকেট সংযোগ শুরু করুন এবং তথ্য গ্রহণ শুরু করুন.৪. থ্রেড ম্যানেজমেন্টপ্রতিটি এক্সচেঞ্জের জন্য একটি থ্রেড শুরু করুন, রিয়েল টাইমে ডেটা গ্রহণ করুন এবং কলব্যাক ফাংশনগুলির মাধ্যমে ডেটা প্রক্রিয়া করুন।
threadMarket
ফাংশন: একটি শিশু থ্রেডে ডেটা গ্রহণ করুন, সর্বশেষ গভীরতা এবং লেনদেনের তথ্য বিশ্লেষণ করুন এবং সংরক্ষণ করুন।৫. তথ্য সংগ্রহ পদ্ধতি পুনরায় লিখুনপ্রতিটি এক্সচেঞ্জের জন্য গভীরতা এবং ট্রেডিং তথ্য পাওয়ার পদ্ধতিগুলি পুনরায় লিখুন, রিয়েল-টাইমে আপডেট হওয়া ডেটা ফেরত দেওয়ার অগ্রাধিকার দিন।
$.setupWebsocket()
লক্ষ্য এক্সচেঞ্জের ওয়েবসকেট সংযোগ শুরু করতে।GetDepth()
এবংGetTrades()
ফাংশন, বাজার গভীরতা এবং লেনদেন রেকর্ড স্বয়ংক্রিয়ভাবে WebSocket রিয়েল টাইম ডেটা ব্যবহার করে ফিরে আসে।যদি ইভেন্টলুপ () ফাংশনটি কৌশলটিতে যুক্ত করা হয়, তবে এটি একটি ট্রিগার প্রক্রিয়াতে পরিবর্তিত হবে। যখন wss ডেটা আপডেট হয়, এটি স্বয়ংক্রিয়ভাবে তা অবিলম্বে পাবেন, এবং সর্বশেষ ডেটা না থাকলে অপেক্ষা করুন। এটি একটি বুদ্ধিমান ঘুমের ফাংশনের সমতুল্য। অবশ্যই, আপনি সরাসরি ঘুমও ব্যবহার করতে পারেন।
function main() {
$.setupWebsocket()
while (true) {
exchanges.map(e=>{
Log(e.GetName(), e.GetDepth())
Log(e.GetName(), e.GetTrades())
})
EventLoop(100) // trigger by websocket
}
}
আমার পূর্ববর্তী মাল্টি-ভারেন্সি ট্রেডিং কৌশল গাইড দেখুনঃhttps://www.fmz.com/bbs-topic/10508, যা ওয়েবসকেট সমর্থন করার জন্য সহজেই সংশোধন করা যেতে পারেঃ
function MakeOrder() {
for (let i in Info.trade_symbols) {
let symbol = Info.trade_symbols[i];
let buy_price = exchange.GetDepth(symbol + '_USDT').Asks[0].Price;
let buy_amount = 50 / buy_price;
if (Info.position[symbol].value < 2000){
Trade(symbol, "buy", buy_price, buy_amount, symbol);
}
}
}
function OnTick() {
try {
UpdatePosition();
MakeOrder();
UpdateStatus();
} catch (error) {
Log("loop error: " + error);
}
}
function main() {
$.setupWebsocket()
InitInfo();
while (true) {
let loop_start_time = Date.now();
if (Date.now() - Info.time.last_loop_time > Info.interval * 1000) {
OnTick();
Info.time.last_loop_time = Date.now();
Info.time.loop_delay = Date.now() - loop_start_time;
}
Sleep(5);
}
}