وسائل لوڈ ہو رہے ہیں... لوڈنگ...

ایف ایم زیڈ کوانٹ: کریپٹوکرنسی مارکیٹ میں مشترکہ تقاضوں کے ڈیزائن مثالوں کا تجزیہ (I)

مصنف:FMZ~Lydia, تخلیق: 2023-12-19 16:02:58, تازہ کاری: 2024-11-06 21:19:16

img

کریپٹوکرنسی اثاثہ جات کی تجارت کی جگہ میں ، مارکیٹ کے اعداد و شمار کو حاصل کرنا اور تجزیہ کرنا ، استفسار کی شرح ، اور اکاؤنٹ اثاثوں کی نقل و حرکت کی نگرانی کرنا تمام اہم آپریشن ہیں۔ ذیل میں کچھ عام تقاضوں کے لئے نفاذ کی کوڈ مثالیں ہیں۔

میں بائننس اسپاٹ پر 4 گھنٹوں میں سب سے زیادہ اضافے کے ساتھ کرنسی حاصل کرنے کے بارے میں کوڈ کیسے لکھوں؟

ایف ایم زیڈ پلیٹ فارم پر مقداری تجارتی حکمت عملی کا پروگرام لکھتے وقت ، جب آپ کو کسی ضرورت کا سامنا کرنا پڑتا ہے تو آپ کو سب سے پہلے اس کا تجزیہ کرنے کی ضرورت ہوتی ہے۔ لہذا ضروریات کی بنیاد پر ، ہم نے مندرجہ ذیل مواد کا تجزیہ کیا:

  • کون سی پروگرامنگ زبان استعمال کریں؟ منصوبہ اس کو لاگو کرنے کے لئے جاوا اسکرپٹ کا استعمال کرنا ہے.
  • تمام کرنسیوں میں فوری حقیقی وقت کی قیمتوں کا تعین کی ضرورت ہے پہلی چیز جو ہم نے کی جب ہم نے ضرورت دیکھی تو یہ معلوم کرنے کے لئے بائننس 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. اہم فنکشن 2.1 لامحدود لوپ
while (true) {
    // ...
}

یہ پروگرام ایک لامحدود لوپ کے ذریعے بائننس API ٹریڈنگ جوڑی کی قیمتوں کی مسلسل نگرانی کرتا ہے۔ ۲.۲ قیمتوں کی معلومات حاصل کریں

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

بائننس 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 سیکنڈ انتظار کریں.

یہ پروگرام بائننس API کے ذریعے ٹریڈنگ جوڑی کی ریئل ٹائم قیمت کی معلومات حاصل کرتا ہے ، پھر قیمت کی اتار چڑھاؤ کا حساب لگاتا ہے ، اور اسے ٹیبل کی شکل میں لاگ ان کرتا ہے۔ یہ پروگرام ٹریڈنگ جوڑوں کی قیمتوں کی ریئل ٹائم مانیٹرنگ کے فنکشن کو سمجھنے کے لئے مسلسل لوپ میں چلتا ہے۔ نوٹ کریں کہ اس پروگرام میں استثناء پروسیسنگ شامل ہے تاکہ اس بات کو یقینی بنایا جاسکے کہ قیمت کی معلومات حاصل کرتے وقت استثناء کی وجہ سے عملدرآمد میں خلل نہیں پڑتا ہے۔

لائیو ٹریڈنگ رننگ ٹیسٹ

img

چونکہ اعداد و شمار کو شروع میں صرف تھوڑا سا جمع کیا جاسکتا ہے ، لہذا 4 گھنٹے کی ونڈو کے لئے کافی اعداد و شمار جمع کیے بغیر قیمتوں میں اتار چڑھاؤ کا حساب لگانا ممکن نہیں ہے۔ لہذا ، ابتدائی قیمت کو حساب کتاب کے لئے بنیاد کے طور پر استعمال کیا جاتا ہے ، اور 4 گھنٹوں کے لئے کافی اعداد و شمار جمع کرنے کے بعد ، قیمتوں میں اتار چڑھاؤ کے حساب کتاب کے لئے 4 گھنٹے کی ونڈو کو برقرار رکھنے کے لئے سب سے پرانے اعداد و شمار کو ختم کردیا جائے گا۔

2۔ بائننس کے یو میں درج معاہدوں کے لیے فنڈنگ کی شرحوں کی پوری قسم چیک کریں

فنڈنگ کی شرح کی جانچ کرنا مذکورہ کوڈ کی طرح ہے ، سب سے پہلے ، ہمیں فنڈنگ کی شرح سے متعلق انٹرفیس تلاش کرنے کے لئے بائننس API دستاویزات کی جانچ پڑتال کرنے کی ضرورت ہے۔ بائننس کے پاس متعدد انٹرفیس ہیں جو ہمیں فنڈز کی شرح سے استفسار کرنے کی اجازت دیتے ہیں ، یہاں ہم مثال کے طور پر یو میں درج معاہدے کے انٹرفیس کو لیتے ہیں:

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

کوڈ کا نفاذ

چونکہ بہت سارے معاہدے ہیں، ہم یہاں سب سے اوپر 10 سب سے بڑی فنڈنگ کی شرح برآمد کر رہے ہیں.

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)
    }
}

واپسی کے اعداد و شمار کی ساخت مندرجہ ذیل ہے، اور بائننس دستاویزات کو چیک کریں، یہ ظاہر کرتا ہے کہ آخری فنڈنگ کی شرح فنڈنگ کی شرح ہے جو ہم چاہتے ہیں.

{
    "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

اختتام

یہ مثالیں بنیادی ڈیزائن کے خیالات اور کال کرنے کے طریقوں کو فراہم کرتی ہیں ، اصل منصوبے کو مخصوص ضروریات کی بنیاد پر مناسب تبدیلیاں اور توسیع کرنے کی ضرورت پڑسکتی ہے۔ امید ہے کہ ، یہ کوڈز آپ کو کریپٹوکرنسی ڈیجیٹل اثاثوں کی تجارت میں مختلف ضروریات کو بہتر طور پر پورا کرنے میں مدد کرسکتے ہیں۔


مزید