রিসোর্স লোড হচ্ছে... লোডিং...

এফএমজেড ক্রিপ্টোকারেন্সি পরিমাণগত প্ল্যাটফর্ম ওয়েবসকেট ব্যবহার গাইড (আপগ্রেড করা ডায়াল ফাংশনের বিস্তারিত ব্যাখ্যা)

লেখক:এফএমজেড-লিডিয়া, সৃষ্টিঃ ২০২৩-০৭-১৩ ১৪ঃ০৩ঃ৩২, আপডেটঃ ২০২৪-০১-০৩ ২১ঃ০৫ঃ৩৬

img

এফএমজেড ক্রিপ্টোকারেন্সি পরিমাণগত প্ল্যাটফর্ম ওয়েবসকেট ব্যবহার গাইড (আপগ্রেড করা ডায়াল ফাংশনের বিস্তারিত ব্যাখ্যা)

বেশিরভাগ ক্রিপ্টোকারেন্সি এক্সচেঞ্জ ওয়েবসকেট এর মাধ্যমে মার্কেট ডেটা পাঠাতে সমর্থন করে এবং কিছু এক্সচেঞ্জ ওয়েবসকেট এর মাধ্যমে অ্যাকাউন্টের তথ্য আপডেট করতেও সমর্থন করে। REST API এর তুলনায়, ওয়েবসকেটের সাধারণত কম লেটেন্সি, উচ্চতর ফ্রিকোয়েন্সি থাকে এবং প্ল্যাটফর্মের বিশ্রাম API হারের সীমা সাপেক্ষে নয়। তবে, এটিতে সম্ভাব্য বাধা এবং কম স্বজ্ঞাত হ্যান্ডলিংয়ের অসুবিধা রয়েছে।

এই নিবন্ধটি প্রধানত ডায়াল ফাংশনের ব্যবহারের পরিচয় করিয়ে দেবে, যা জাভাস্ক্রিপ্ট ভাষা ব্যবহার করে এফএমজেড কোয়ান্ট প্ল্যাটফর্মে ক্যাপসুল করা হয়েছে। ডায়াল অনুসন্ধান করে নির্দিষ্ট নির্দেশাবলী এবং পরামিতিগুলি ডকুমেন্টেশনে পাওয়া যাবে। বিভিন্ন কার্যকারিতা অর্জনের জন্য, ডায়াল ফাংশনটি বেশ কয়েকটি আপডেটের মধ্য দিয়ে গেছে, যা এই নিবন্ধে অন্তর্ভুক্ত করা হবে। অতিরিক্তভাবে, এটি ওয়েবসকেট সিকিউর (ডাব্লুএসএস) ভিত্তিক ইভেন্ট-চালিত কৌশল এবং একাধিক এক্সচেঞ্জের সাথে সংযোগ স্থাপনের বিষয়টি নিয়েও আলোচনা করবে।

১. ওয়েবসকেট সংযোগঃ

একটি সরাসরি সংযোগ সাধারণত যথেষ্ট, যেমন একটি মুদ্রা নিরাপত্তা টিকার চাপ পেতেঃ

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr")

যখন ফিরে আসা ডেটা সংকুচিত বিন্যাসে থাকে, তখন সংযোগের সময় এটি নির্দিষ্ট করা প্রয়োজন। সংকোচনের বিন্যাস নির্দিষ্ট করতে compress ব্যবহার করা হয়, এবং mode তথ্যের কোন অংশ (বা পাঠানো বা ফেরত) সংকুচিত করা প্রয়োজন তা উপস্থাপন করে। উদাহরণস্বরূপ, OKEX এর সাথে সংযোগ করার সময়, নিম্নলিখিতটি ব্যবহার করা যেতে পারেঃ

var client = Dial("wss://real.okex.com:10441/websocket?compress=true|compress=gzip_raw&mode=recv")

ডায়াল ফাংশন পুনরায় সংযোগ সমর্থন করে, যা অন্তর্নিহিত গো ভাষা দ্বারা পরিচালিত হয়। সংযোগটি সংযোগ বিচ্ছিন্ন হওয়ার জন্য সনাক্ত করা হলে এটি স্বয়ংক্রিয়ভাবে পুনরায় সংযোগ স্থাপন করে। যেখানে অনুরোধের ডেটা ইতিমধ্যে ইউআরএলে অন্তর্ভুক্ত রয়েছে, যেমন বাইনারেন্সের সাথে পূর্ববর্তী উদাহরণে, এটি ব্যবহার করা খুব সুবিধাজনক এবং প্রস্তাবিত। তবে, যেখানে সাবস্ক্রিপশন বার্তা প্রেরণের প্রয়োজন হয় সেই ক্ষেত্রে, পুনরায় সংযোগ প্রক্রিয়াটি ম্যানুয়ালি বজায় রাখার পরামর্শ দেওয়া হয়।

var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true")

wss বার্তাগুলিতে সাবস্ক্রাইব করুন, কিছু এক্সচেঞ্জের ইউআরএলে অনুরোধ রয়েছে, এবং এমন চ্যানেলও রয়েছে যেখানে আপনাকে আপনার নিজস্ব সাবস্ক্রিপশন পাঠাতে হবে, যেমন coinbase:

client = Dial("wss://ws-feed.pro.coinbase.com", 60)
client.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')

২. ওয়েবসকেট পড়া

সাধারণভাবে, এটি একটি অসীম লুপে অবিচ্ছিন্নভাবে পড়তে পারে। কোডটি নিম্নরূপঃ

function main() {
    var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
    while (true) {
        var msg = client.read()
        var data = JSON.parse(msg) // Parse json strings into quotable objects 
// Process data 
    }
}

ডাব্লুএসএস ডেটা পুশ গতি খুব দ্রুত। গোলং এর আন্ডারলেয়ারটি সারিতে থাকা সমস্ত ডেটা ক্যাশে করবে, এবং যখন প্রোগ্রাম কলগুলি পড়বে, তখন ডেটা পাল্টা ফিরে আসবে। তবে, বটে অর্ডার দেওয়ার মতো ক্রিয়াকলাপগুলি বিলম্বের কারণ হবে, যার ফলে ডেটা জমা হতে পারে। ট্রেডিং এক্সিকিউশন পুশ, অ্যাকাউন্ট পুশ এবং গভীরতা অন্তর্ভুক্তি পুশের মতো তথ্যের জন্য, আমাদের ইতিহাসের ডেটা দরকার। কোট মার্কেট ডেটার জন্য, বেশিরভাগ ক্ষেত্রে, আমরা কেবলমাত্র সর্বশেষ ডেটা নিয়ে চিন্তা করি, ইতিহাসের ডেটা নয়।

যদি read() কোন প্যারামিটার যোগ না করে, এটি পুরোনো ডেটা ফেরত দেবে, এবং কোনও ডেটা না থাকলে ফেরত না আসা পর্যন্ত ব্লক করবে। যদি আপনি সর্বশেষ ডেটা চান, আপনি ক্লায়েন্ট.read(-2) ব্যবহার করে অবিলম্বে সর্বশেষ ডেটা ফেরত দিতে পারেন, কিন্তু যখন কোনও ডেটা নেই, এটি null ফেরত দেবে, যা রেফারেন্সের আগে বিচার করা দরকার।

পুরানো ক্যাশেড ডেটা কীভাবে মোকাবেলা করা যায় এবং কোনও ডেটা না থাকলে এটি ব্লক করা হয় কিনা তার উপর নির্ভর করে, read এর বিভিন্ন পরামিতি রয়েছে, যেমন নীচের টেবিলে দেখানো হয়েছে, যা জটিল দেখাচ্ছে, তবে প্রোগ্রামটিকে আরও নমনীয় করে তোলে।

img

3. ওয়েবসকেট দ্বারা একাধিক প্ল্যাটফর্মের সাথে সংযোগ স্থাপন

এই ক্ষেত্রে, এটি স্পষ্ট যে কেবলমাত্র read() ব্যবহার করে প্রোগ্রামটিতে কাজ করে না, কারণ একটি প্ল্যাটফর্ম অপেক্ষা করা বার্তাগুলি ব্লক করবে এবং অন্য প্ল্যাটফর্মটি নতুন বার্তা থাকলেও গ্রহণ করবে না। সাধারণ প্রক্রিয়াজাতকরণ পদ্ধতিটি হ'লঃ

    function main() {
        var binance = Dial("wss://stream.binance.com:9443/ws/!ticker@arr");
        var coinbase = Dial("wss://ws-feed.pro.coinbase.com", 60)
        coinbase.write('{"type": "subscribe","product_ids": ["BTC-USD"],"channels": ["ticker","heartbeat"]}')
        while (true) {
            var msgBinance = binance.read(-1) // Parameter -1 represents no data and return null immediately; it will not occur that being blocked before there is data to be returned 
            var msgCoinbase = coinbase.read(-1)
            if(msgBinance){
                // at this time, Binance has data to return 
            }
            if(msgCoinbase){
                // at this time, coinbase has data to return 
            }
            Sleep(1) // Sleep for 1 millisecond
        }
    }

৪. সংযোগ বিচ্ছিন্ন এবং পুনরায় সংযোগ সমস্যা

প্রসেসিংয়ের এই অংশটি আরও ঝামেলাজনক, কারণ পুশ ডেটা বাধাগ্রস্ত হতে পারে, বা পুশ বিলম্ব অত্যন্ত দীর্ঘ। এমনকি যদি হার্টবিটটি গ্রহণ করা যায় তবে এর অর্থ এই নয় যে ডেটা এখনও চাপানো হচ্ছে। আপনি একটি ইভেন্ট অন্তরাল সেট করতে পারেন; যদি অন্তরালের পরে কোনও আপডেট না পাওয়া যায় তবে পুনরায় সংযোগ করুন; ডেটা সঠিক কিনা তা দেখতে কিছু সময়ের পরে rest দ্বারা ফিরে আসা ফলাফলগুলি তুলনা করা ভাল। বিন্যান্সের বিশেষ ক্ষেত্রে, আপনি সরাসরি স্বয়ংক্রিয় পুনরায় সংযোগ সেট করতে পারেন।

৫. ওয়েবসকেটের সাধারণ প্রোগ্রাম ফ্রেমওয়ার্ক ব্যবহার করা

Push ডেটা ব্যবহার করা হয়েছে, প্রোগ্রামটি স্বাভাবিকভাবেই ইভেন্ট-ট্রিগার হিসাবে লেখা হবে; তথ্য চাপার ফ্রিকোয়েন্সিতে মনোযোগ দিন, কারণ উচ্চ-ফ্রিকোয়েন্সি অনুরোধগুলি ব্লক হওয়ার কারণ হবে; সাধারণত আপনি লিখতে পারেনঃ

    var tradeTime = Date.now()
    var accountTime = Date.now()
    function trade(data){
        if(Date.now() - tradeTime > 2000){//Here it limits only one trade in 2 seconds 
            tradeTime = Date.now()
            // Trading logic
        }
    }
    function GetAccount(){
        if(Date.now() - accountTime > 5000){//Here it limits GetAccount only once in 5 seconds 
            accountTime = Date.now()
            return exchange.GetAccount()
        }
    }
    function main() {
        var client = Dial("wss://stream.binance.com:9443/ws/!ticker@arr|reconnect=true");
        while (true) {
            var msg = client.read()
            var data = JSON.parse(msg)
            var account = GetAccount()
            trade(data)
        }
    }

৬. উপসংহার

সংযোগ পদ্ধতি, ডেটা ট্রান্সমিশন পদ্ধতি, সাবস্ক্রাইব করা সামগ্রী এবং প্রতিটি প্ল্যাটফর্মের ওয়েবসকেটের ডেটা ফর্ম্যাট প্রায়শই পৃথক হয়, তাই প্ল্যাটফর্মটি এটিকে ক্যাপসুল করে না এবং নিজের দ্বারা সংযোগ স্থাপনের জন্য ডায়াল ফাংশনটি ব্যবহার করতে হবে। এই নিবন্ধটি মূলত কিছু প্রাথমিক সতর্কতা কভার করে। আপনার যদি আরও প্রশ্ন থাকে তবে দয়া করে জিজ্ঞাসা করতে দ্বিধা করবেন না।

PS: যদিও কিছু প্ল্যাটফর্ম ওয়েবসকেট উদ্ধৃতি প্রদান করে না, আসলে, যখন আপনি ডিবাগিং ফাংশন ব্যবহার করার জন্য ওয়েবসাইটে লগ ইন করেন, তখন আপনি দেখতে পাবেন যে তারা সবাই ওয়েবসকেট ধাক্কা ব্যবহার করছে। অনুসন্ধানের পরে, আপনি দেখতে পাবেন যে কিছু সাবস্ক্রিপশন ফর্ম্যাট এবং রিটার্ন ফর্ম্যাটগুলি এনক্রিপ্ট করা বলে মনে হচ্ছে, যা বেস 64 দিয়ে ডিকোডিং এবং ডিকম্প্রেসিং দ্বারা দেখা যেতে পারে।


আরো