4
ফোকাস
1271
অনুসারী

এফএমজেড কোয়ান্টিফিকেশন: ক্রিপ্টোকারেন্সি মার্কেটে সাধারণ চাহিদা ডিজাইনের উদাহরণের বিশ্লেষণ (1)

তৈরি: 2023-12-17 18:43:46, আপডেট করা হয়েছে: 2024-11-06 21:18:36
comments   3
hits   1814

এফএমজেড কোয়ান্টিফিকেশন: ক্রিপ্টোকারেন্সি মার্কেটে সাধারণ চাহিদা ডিজাইনের উদাহরণের বিশ্লেষণ (1)

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

1. কিভাবে 4 ঘন্টার মধ্যে Binance স্পট সবচেয়ে বড় বৃদ্ধি সঙ্গে মুদ্রা পেতে?

FMZ-এ একটি পরিমাণগত ট্রেডিং কৌশল প্রোগ্রাম লেখার সময়, যখন আপনি তাদের সম্মুখীন হন তখন আপনাকে প্রথমে প্রয়োজনীয়তাগুলি বিশ্লেষণ করতে হবে। অতএব, আমরা প্রয়োজন অনুসারে নিম্নলিখিত পয়েন্টগুলি বিশ্লেষণ করি:

  • ডিজাইন লিখতে কোন প্রোগ্রামিং ভাষা ব্যবহার করতে হবে জাভাস্ক্রিপ্ট ব্যবহার করে পরিকল্পিত বাস্তবায়ন।
  • সমস্ত কারেন্সি স্পট মূল্যের রিয়েল-টাইম মার্কেট ডেটা প্রয়োজন যখন আমরা এই প্রয়োজনীয়তাটি দেখেছি, তখন আমরা প্রথম কাজটি করেছিলাম Binance এর API ডকুমেন্টেশনের মাধ্যমে তা খুঁজে বের করার জন্য যে সেখানে একত্রিত বাজারের ডেটা আছে কিনা (এটি একত্রিত বাজারের ডেটা থাকা সর্বোত্তম হবে, কারণ প্রতিটি বিভাগ পরীক্ষা করা শ্রমসাধ্য হবে)। সামগ্রিক বাজার মূল্য ইন্টারফেস জিজ্ঞাসা করুন:GET https://api.binance.com/api/v3/ticker/price。 এফএমজেডে, এক্সচেঞ্জ মার্কেট ইন্টারফেস (একটি সর্বজনীন ইন্টারফেস যার স্বাক্ষরের প্রয়োজন নেই) ব্যবহার করুনHttpQueryফাংশন
  • 4 ঘন্টার একটি রোলিং উইন্ডো পিরিয়ড সহ ডেটা গণনা করতে হবে এই পরিসংখ্যান প্রোগ্রাম গঠন কিভাবে সম্পর্কে চিন্তা করুন.
  • উত্থান-পতন গণনা করুন, সাজান উত্থান এবং পতন অ্যালগরিদম সম্পর্কে চিন্তা করুন, এটি কিনা:涨跌幅百分比 =(当前价格 - 初始价格)/ 初始价格 * 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)
        }
        
        // 计算涨跌幅
        var tbl = {
            type : "table",
            title : "涨跌幅",
            cols : ["交易对", "当前价格", "4小时前价格", "涨跌幅", "数据长度", "最早数据时间", "最新数据时间"],
            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. প্রধান ফাংশন প্রধান()
    • 2.1 অসীম লুপ
    while (true) {
        // ...
    }
    

    প্রোগ্রামটি অবিচ্ছিন্ন লুপের মাধ্যমে বিনান্স এপিআই ট্রেডিং পেয়ারের দাম নিরীক্ষণ করে।

    • 2.2 মূল্য তথ্য পান
    var arr = JSON.parse(HttpQuery("https://api.binance.com/api/v3/ticker/price"))
    

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

    • 2.3 মূল্য ডেটা আপডেট করুন
    for (var i = 0; i < arr.length; i++) {
        // ...
    }
    

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

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

    প্রোগ্রামটি কার্যকর করা চালিয়ে যেতে পারে তা নিশ্চিত করতে ব্যতিক্রম এবং লগ ব্যতিক্রম তথ্য ধরুন।

    • 2.5 বৃদ্ধি বা হ্রাস গণনা করুন
    for (var symbol in dictSymbolsPrice) {
        // ...
    }
    

    dictSymbolsPrice এর উপর পুনরাবৃত্তি করুন, প্রতিটি ট্রেডিং পেয়ারের উত্থান এবং পতন গণনা করুন, এবং যদি ডেটার দৈর্ঘ্য 4 ঘন্টা অতিক্রম করে তবে সবচেয়ে পুরানো ডেটা মুছে দিন।

    • 2.6. টেবিল সাজান এবং তৈরি করুন
    var entries = Object.entries(dictSymbolsPrice)
    entries.sort((a, b) => b[1].percentageChange - a[1].percentageChange)
    
    
    for (var i = 0; i < entries.length; i++) {
        // ...
    }
    

    বৃদ্ধি এবং হ্রাস অনুযায়ী ট্রেডিং পেয়ারগুলিকে উচ্চ থেকে নিম্ন পর্যন্ত সাজান এবং ট্রেডিং পেয়ারের তথ্য সম্বলিত একটি টেবিল তৈরি করুন।

    • 2.7 লগ আউটপুট এবং বিলম্ব
    LogStatus(_D(), "\n", "`" + JSON.stringify(tbl) + "`")
    Sleep(5000)
    

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

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

বাস্তব ডিস্ক চলমান পরীক্ষা

এফএমজেড কোয়ান্টিফিকেশন: ক্রিপ্টোকারেন্সি মার্কেটে সাধারণ চাহিদা ডিজাইনের উদাহরণের বিশ্লেষণ (1)

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

2. সব ধরনের Binance U-মার্জিন চুক্তির তহবিল হার জিজ্ঞাসা করুন

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

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: "U本位合约资金费率前十",
                cols: ["合约", "资金费率", "标记价格", "指数价格", "当期费率时间", "下期费率时间"],
                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)
    }
}

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

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

বাস্তব ডিস্ক চলমান পরীক্ষা:

এফএমজেড কোয়ান্টিফিকেশন: ক্রিপ্টোকারেন্সি মার্কেটে সাধারণ চাহিদা ডিজাইনের উদাহরণের বিশ্লেষণ (1)

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": "U本位合约资金费率前十",
                "cols": ["合约", "下期费率", "最小", "当期", "最大"],
                "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)

বাস্তব ডিস্ক চলমান পরীক্ষা:

এফএমজেড কোয়ান্টিফিকেশন: ক্রিপ্টোকারেন্সি মার্কেটে সাধারণ চাহিদা ডিজাইনের উদাহরণের বিশ্লেষণ (1)

END

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