FMZ Quant: ক্রিপ্টোকারেন্সি মার্কেটে সাধারণ প্রয়োজনীয়তা ডিজাইন উদাহরণগুলির বিশ্লেষণ (I)

লেখক:লিডিয়া, সৃষ্টিঃ ২০২৩-১২-১৯ ১৬ঃ০২ঃ৫৮, আপডেটঃ ২০২৪-০১-০২ ২১ঃ২১ঃ৫৮

img

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

1. আমি কিভাবে Binance স্পটে 4 ঘন্টার মধ্যে সর্বোচ্চ বৃদ্ধি সহ মুদ্রা পাওয়ার জন্য কোড লিখব?

FMZ প্ল্যাটফর্মে একটি পরিমাণগত ট্রেডিং কৌশল প্রোগ্রাম লেখার সময়, যখন আপনি একটি প্রয়োজনীয়তার মুখোমুখি হন তখন আপনাকে প্রথমে যা করতে হবে তা হ'ল এটি বিশ্লেষণ করা। সুতরাং প্রয়োজনীয়তার ভিত্তিতে, আমরা নিম্নলিখিত সামগ্রীগুলি বিশ্লেষণ করেছিঃ

  • কোন প্রোগ্রামিং ভাষা ব্যবহার করব? প্ল্যান হচ্ছে জাভাস্ক্রিপ্ট ব্যবহার করে এটি বাস্তবায়ন করা।
  • সকল মুদ্রায় স্পট রিয়েল-টাইম কোটেশন প্রয়োজন যখন আমরা এই প্রয়োজনীয়তাটি দেখলাম তখন আমরা প্রথমে Binance API ডকুমেন্ট খুজে বের করলাম যে কোন সমষ্টিগত কোট আছে কিনা (সমষ্টিগত কোট থাকলে ভালো, একের পর এক খোঁজা অনেক কাজ) । আমরা সমষ্টিগত উদ্ধৃতি ইন্টারফেস খুঁজে পেয়েছিঃGET https://api.binance.com/api/v3/ticker/price. FMZ প্ল্যাটফর্মে,HttpQueryএক্সচেঞ্জ টিকার ইন্টারফেস অ্যাক্সেস করার জন্য ফাংশন (পাবলিক ইন্টারফেস যা স্বাক্ষরের প্রয়োজন হয় না) ।
  • 4 ঘন্টা একটি রোলিং উইন্ডো সময়ের জন্য তথ্য গণনা করতে হবে পরিসংখ্যান প্রোগ্রামের কাঠামো কিভাবে ডিজাইন করবেন তা ধারণা করুন।
  • দামের ওঠানামা গণনা করুন এবং সেগুলি সাজান দামের ওঠানামা অ্যালগরিদম সম্পর্কে চিন্তা করা, এটাঃprice fluctuations (%) = (current price - initial price) / initial price * 100% এ।

সমস্যার সমাধান করার পর, এবং প্রোগ্রামের সংজ্ঞা দেওয়ার পর, আমরা প্রোগ্রাম ডিজাইনের কাজে লাগলাম।

কোড ডিজাইন

var dictSymbolsPrice = {}

function main() {
    while (true) {
        // GET https://api.binance.com/api/v3/ticker/price
        try {
            var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
            if (!Array.isArray(arr)) {
                Sleep(5000)
                continue 
            }
            
            var ts = new Date().getTime()
            for (var i = 0; i < arr.length; i++) {
                var symbolPriceInfo = arr[i]
                var symbol = symbolPriceInfo.symbol
                var price = symbolPriceInfo.price

                if (typeof(dictSymbolsPrice[symbol]) == "undefined") {
                    dictSymbolsPrice[symbol] = {name: symbol, data: []}
                }
                dictSymbolsPrice[symbol].data.push({ts: ts, price: price})
            }
        } catch(e) {
            Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
        }
        
        // Calculate price fluctuations
        var tbl = {
            type : "table",
            title : "Price fluctuations",
            cols : ["trading pair", "current price", "price 4 hours ago", "price fluctuations", "data length", "earliest data time", "latest data time"],
            rows : []
        }
        for (var symbol in dictSymbolsPrice) {
            var data = dictSymbolsPrice[symbol].data
            if (data[data.length - 1].ts - data[0].ts > 1000 * 60 * 60 * 4) {
                dictSymbolsPrice[symbol].data.shift()
            }

            data = dictSymbolsPrice[symbol].data
            dictSymbolsPrice[symbol].percentageChange = (data[data.length - 1].price - data[0].price) / data[0].price * 100
        }

        var entries = Object.entries(dictSymbolsPrice)
        entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)

        for (var i = 0; i < entries.length; i++) {
            if (i > 9) {
                break
            }   
            var name = entries[i][1].name
            var data = entries[i][1].data
            var percentageChange = entries[i][1].percentageChange
            var currPrice = data[data.length - 1].price
            var currTs = _D(data[data.length - 1].ts)
            var prePrice = data[0].price
            var preTs = _D(data[0].ts)
            var dataLen = data.length

            tbl.rows.push([name, currPrice, prePrice, percentageChange + "%", dataLen, preTs, currTs])
        }
        
        LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
        Sleep(5000)
    }
}

কোড বিশ্লেষণ

    1. তথ্য কাঠামোvar dictSymbolsPrice = {}: প্রতিটি ট্রেডিং জোড়ার জন্য মূল্যের তথ্য সংরক্ষণ করার জন্য একটি ফাঁকা বস্তু। কীটি ট্রেডিং জোড়ার প্রতীক এবং মানটি হ'ল ট্রেডিং জোড়ার নাম, দামের ডেটা এবং দামের ওঠানামা সম্পর্কিত তথ্য ধারণকারী একটি বস্তু।
    1. প্রধান ফাংশন প্রধান ((() ২.১. অসীম লুপ
while (true) {
    // ...
}

প্রোগ্রামটি অনন্ত লুপের মাধ্যমে বাইনান্স এপিআই ট্রেডিং জোড়ার দামগুলি ক্রমাগত পর্যবেক্ষণ করে। ২.২. মূল্য সংক্রান্ত তথ্য পান

var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))

Binance API এর মাধ্যমে ট্রেডিং জোড়ার বর্তমান মূল্যের তথ্য পান। যদি রিটার্ন একটি অ্যারে না হয়, 5 সেকেন্ড অপেক্ষা করুন এবং আবার চেষ্টা করুন। ২.৩. মূল্যের তথ্য আপডেট করুন

for (var i = 0; i < arr.length; i++) {
    // ...
}

প্রাপ্ত মূল্য তথ্য অ্যারে মাধ্যমে পুনরাবৃত্তি করুন এবং dictSymbolsPrice মধ্যে তথ্য আপডেট করুন। প্রতিটি ট্রেডিং জোড়া জন্য, সংশ্লিষ্ট তথ্য অ্যারে বর্তমান টাইমস্ট্যাম্প এবং মূল্য যোগ করুন। ২.৪ ব্যতিক্রমী প্রক্রিয়াকরণ

} catch(e) {
    Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
}

ব্যতিক্রমগুলি ধরুন এবং ব্যতিক্রমের তথ্য লগ করুন যাতে প্রোগ্রামটি চালিয়ে যেতে পারে। ২.৫. দামের ওঠানামা গণনা করুন

for (var symbol in dictSymbolsPrice) {
    // ...
}

dictSymbolsPrice এর মাধ্যমে পুনরাবৃত্তি করুন, প্রতিটি ট্রেডিং জোড়ার দামের ওঠানামা গণনা করুন এবং যদি এটি 4 ঘন্টার বেশি হয় তবে প্রাচীনতম ডেটা সরিয়ে ফেলুন। ২.৬. সোর্ট করুন এবং টেবিল তৈরি করুন

var entries = Object.entries(dictSymbolsPrice)
entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)

for (var i = 0; i < entries.length; i++) {
    // ...
}

ট্রেডিং জোড়াগুলির দামের ওঠানামা হ্রাসের ক্রমে সাজিয়ে নিন এবং ট্রেডিং জোড়াগুলি সম্পর্কে তথ্য সম্বলিত একটি টেবিল তৈরি করুন। ২.৭। লগ আউটপুট এবং বিলম্ব

LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
Sleep(5000)

টেবিল এবং বর্তমান সময়কে একটি লগ আকারে আউটপুট করুন এবং লুপের পরবর্তী রাউন্ড চালিয়ে যাওয়ার জন্য 5 সেকেন্ড অপেক্ষা করুন।

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

লাইভ ট্রেডিং চলমান পরীক্ষা

img

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

২. বিন্যান্স ইউ-ডেনোমিনেটেড চুক্তির জন্য অর্থায়ন হারগুলির সম্পূর্ণ বৈচিত্র্য পরীক্ষা করুন

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

GET https://fapi.binance.com/fapi/v1/premiumIndex

কোড বাস্তবায়ন

যেহেতু এখানে অনেক চুক্তি রয়েছে, তাই আমরা এখানে শীর্ষ ১০টি অর্থায়নের হার রপ্তানি করছি।

function main() {
    while (true) {
        // GET https://fapi.binance.com/fapi/v1/premiumIndex
        try {
            var arr = JSON.parse(HttpQuery("https://fapi.binance.com/fapi/v1/premiumIndex"))
            if (!Array.isArray(arr)) {
                Sleep(5000)
                continue 
            }
            
            arr.sort((a, b) => parseFloat(b.lastFundingRate) - parseFloat(a.lastFundingRate))
            var tbl = {
                type: "table",
                title: "Top 10 funding rates for U-denominated contracts",
                cols: ["contracts", "funding rate", "marked price", "index price", "current rate time", "next rate time"],
                rows: []
            }
            for (var i = 0; i < 9; i++) {
                var obj = arr[i]
                tbl.rows.push([obj.symbol, obj.lastFundingRate, obj.markPrice, obj.indexPrice, _D(obj.time), _D(obj.nextFundingTime)])
            }
            LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
        } catch(e) {
            Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
        }
        Sleep(1000 * 10)
    }
}

রিটার্ন করা ডাটা স্ট্রাকচার নিম্নরূপ, এবং বাইনারেন্স ডকুমেন্টেশন চেক করুন, এটি দেখায় যে lastFundingRate হল আমরা যে ফান্ডিং রেট চাই।

{
    "symbol":"STMXUSDT",
    "markPrice":"0.00883606",
    "indexPrice":"0.00883074",
    "estimatedSettlePrice":"0.00876933",
    "lastFundingRate":"0.00026573",
    "interestRate":"0.00005000",
    "nextFundingTime":1702828800000,
    "time":1702816229000
}

লাইভ ট্রেডিং রানিং টেস্টঃ

img

পাইথন সংস্করণের OKX বিনিময় চুক্তি অর্থায়ন হার পেতে

একজন ব্যবহারকারী উদাহরণটির একটি পাইথন সংস্করণ চেয়েছিলেন, এবং এটি OKX এক্সচেঞ্জের জন্য। এখানে একটি উদাহরণ রয়েছেঃ

ইন্টারফেস দ্বারা ফেরত দেওয়া তথ্যhttps://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1:

{
    "code":"0",
    "data":[
        {
            "fundingTime":1702828800000,
            "fundingList":[
                {
                    "instId":"BTC-USDT-SWAP",
                    "nextFundingRate":"0.0001102188733642",
                    "minFundingRate":"-0.00375",
                    "fundingRate":"0.0000821861465884",
                    "maxFundingRate":"0.00375"
                } ...

নির্দিষ্ট কোডঃ

import requests
import json
from time import sleep
from datetime import datetime

def main():
    while True:
        # https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1
        try:
            response = requests.get("https://www.okx.com/priapi/v5/public/funding-rate-all?currencyType=1")
            arr = response.json()["data"][0]["fundingList"]
            Log(arr) 
            if not isinstance(arr, list):
                sleep(5)
                continue

            arr.sort(key=lambda x: float(x["fundingRate"]), reverse=True)

            tbl = {
                "type": "table",
                "title": "Top 10 funding rates for U-denominated contracts",
                "cols": ["contracts", "next rate", "minimum", "current", "maximum"],
                "rows": []
            }

            for i in range(min(9, len(arr))):
                obj = arr[i]
                row = [
                    obj["instId"],
                    obj["nextFundingRate"],
                    obj["minFundingRate"],
                    obj["fundingRate"],
                    obj["maxFundingRate"]
                ]
                tbl["rows"].append(row)
            
            LogStatus(_D(), "\n", '`' + json.dumps(tbl) + '`')

        except Exception as e:
            Log(f"Error: {str(e)}")

        sleep(10)

লাইভ ট্রেডিং রানিং টেস্টঃ

img

END

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


আরো