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

ایجاد کاروں کی طرف سے نئی خصوصیات کو مقدار میں بڑھانا: _Serve فنکشن کا استعمال کرتے ہوئے آسانی سے HTTP سروسز بنائیں

مصنف:ایجاد کاروں کی مقدار - خواب, تخلیق: 2024-11-12 22:10:49, تازہ کاری: 2024-11-15 09:27:20

[TOC]

img

بعض اوقات مقدار کی تجارت اور خودکار حکمت عملی کی ترقی میں HTTP سروس کا استعمال کیا جاتا ہے۔_Serve()ایک فنکشن جو صارفین کو HTTP، HTTPS اور TCP سروسز تخلیق کرنے کی لچکدار صلاحیت فراہم کرتا ہے۔ اس فنکشن کے ذریعہ ، ڈویلپرز خدمات کی تشکیل کے عمل کو آسان بنا سکتے ہیں اور مقدار کے ماحول میں زیادہ سے زیادہ اپنی مرضی کے مطابق خدمات کو لاگو کرسکتے ہیں ، جس سے حکمت عملی ڈیزائن کو زیادہ ہموار اور آسان بنایا جاسکتا ہے۔_Serve()فنکشن کے استعمال کے منظرنامے اور بنیادی آپریشنز آپ کو تیزی سے اس نئے فنکشن کو مقدار میں لانے میں مدد کرتے ہیں۔

کے بارے میں_Serve()اس ویب سائٹ پر ایک نیا صفحہ شائع کیا گیا ہے۔

https://www.fmz.com/syntax-guide/fun/global/__serve


ضرورت

پلیٹ فارم اپ گریڈ_Serve()فنکشن (جیسے کہ اس سے پہلے جاوا اسکرپٹ زبان میں کوئی سروس بنانے کا فنکشن نہیں تھا ، لہذا یہ فنکشن صرف جاوا اسکرپٹ زبان کی پالیسیوں کی حمایت کرتا تھا) ، اس کا مطلب یہ ہے کہ پالیسیوں کو نیٹ ورک سروسز بنانے کی صلاحیت حاصل ہے۔ اس کی بنیاد پر ، ہم بہت ساری خصوصیات تیار کرسکتے ہیں ، بہت سی ضروریات کو حل کرسکتے ہیں۔ مثال کے طور پر ، پالیسیوں کو بیرونی انٹرفیس ، ڈیٹا کی منتقلی ، عام پروٹوکول کی خصوصیات کے ساتھ پلیٹ فارم کی حمایت کرنے کے ل.

اس مضمون میں ہم نے ایک مثال کے طور پر اس کی ضرورت کو پورا کیا ہے: "پلیٹ فارم کے ساتھ کام کرنے والے جنرل پروٹوکول کی فعالیت کو بغیر کسی رکاوٹ کے ایف ایم زیڈ پلیٹ فارم کی حمایت نہیں کرنے والے تبادلے کو پیک کریں۔"جنرل پروٹوکول گائیڈمیں ہم نے او کے ایکس کے لئے پیتھون زبان کا استعمال کیا ہے لہذا فوری طور پر ماڈل کو پیکیج کیا گیا ہے اے پی پی ((کیونکہ ایف ایم زیڈ خود او کے ایکس کی حمایت کرتا ہے ، یہاں او کے ایکس کا استعمال صرف ایک مثال ہے ، جو دوسرے ایف ایم زیڈ پلیٹ فارم تک رسائی حاصل نہیں کرنے والے تبادلے کے لئے لاگو ہوتا ہے) ؛ متن میں پیتھون کے عمومی پروٹوکول پروگرام کو الگ الگ چلانے کی ضرورت ہوتی ہے ، جب جاوا اسکرپٹ کی زبان کی حمایت کی جاتی ہے۔_Serve()افعال کے بعد، جاوا اسکرپٹ زبان کی حکمت عملی عام پروٹوکول تک رسائی حاصل کرنے کے لئے آسان ہے.

ہم نے جنرل پروٹوکول انٹرفیس کو "ٹیمپلیٹ لائبریری" کے طور پر براہ راست پالیسی میں ضم کر دیا ہے، تاکہ یہ پالیسی ایف ایم زیڈ پر غیر تعاون یافتہ تبادلے تک رسائی حاصل کرسکے۔

https://www.fmz.com/digest-topic/10518

  • اس پلیٹ فارم پر جنرل پروٹوکول ایکسچینج کی تشکیل اس طرح ہے:

    img

    اس کے علاوہ، آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے./OKXجنرل پروٹوکول ایکسچینج کے آئٹم کی شناخت کرنے کے لئے کون سا تبادلہ ہے۔


جنرل پروٹوکول ٹیمپلیٹ کا نفاذ

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

ٹیمپلیٹ پیرامیٹر ڈیزائن

ایک اچھی حکمت عملی ٹیمپلیٹ بنانے کے لئے تین پیرامیٹرز شامل کریں:

img

اس کے بعد آپ جنرل پروٹوکول ٹیمپلیٹ کے لئے کوڈ ڈیزائن اور لکھنے شروع کر سکتے ہیں۔

کوڈ کا نفاذ

اس کے علاوہ ، یہ ایک بہت ہی دلچسپ اور دلچسپ سائٹ ہے ، جس میں آپ کو بہت ساری چیزیں مل سکتی ہیں۔$.startService()فنکشن ایک ٹیمپلیٹ کا انٹرفیس فنکشن ہے جو یو پی پی سروسز کو شروع کرنے کے لئے استعمال ہوتا ہے۔

// @ts-check

$.startService = function (address, port, proxyConfig) {
    __Serve(`http://${address}:${port}`, function (ctx, proxyConfig) {
        // interface
        interface IData {
            data: object
            raw: object
        }
        
        interface IError {
            error: any
        }
        
        // custom protocol for OKX
        class CustomProtocolOKX {
            apiBase: string = "https://www.okx.com"
            accessKey: string
            secretKey: string
            passphrase: string
            proxyConfig: string = ""
            simulate: boolean = false
            
            constructor(accessKey: string, secretKey: string, passphrase: string, simulate?: boolean, proxyConfig?: string) {
                this.accessKey = accessKey
                this.secretKey = secretKey
                this.passphrase = passphrase
                if (typeof(simulate) == "boolean") {
                    this.simulate = simulate
                }
                this.proxyConfig = proxyConfig
            }
            
            httpReq(method: string, path: string, query: string = "", params: {[key: string]: any} = {}, headers: {key: string, value: string | ArrayBuffer}[] = []): {[key: string]: any} {
                let ret = null
                let options = {
                    method: method,                    
                    headers: {
                        'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6', 
                        'Content-Type': 'application/json; charset=UTF-8',
                        'x-simulated-trading': this.simulate ? "1" : "0"
                    },
                }
                
                // headers
                if (Array.isArray(headers) && headers.length > 0) {
                    for (var pair of headers) {
                        options.headers[pair.key] = pair.value
                    }
                }
                
                let url = ""
                if (method == "GET") {
                    if (typeof(query) == "string" && query.length > 0) {
                        url = `${this.apiBase}${path}?${query}`
                    } else {
                        url = `${this.apiBase}${path}`
                    }
                } else {
                    url = `${this.apiBase}${path}`
                    options.body = JSON.stringify(params)
                }

                // request
                try {
                    if (this.proxyConfig != "") {
                        url = `${this.proxyConfig}${url}`
                    }
                    ret = JSON.parse(HttpQuery(url, options))
                } catch(e) {
                    return null
                }
    
                return ret
            }

            callSignedAPI(method: string, path: string, query: string = "", params: {[key: string]: any} = {}): {[key: string]: any} {
                const strTime = new Date().toISOString().slice(0, -5) + 'Z'
                let jsonStr = ""
                if (method == "GET") {
                    jsonStr = Object.keys(params).length > 0 ? JSON.stringify(params) : ""
                } else {
                    jsonStr = Object.keys(params).length > 0 ? JSON.stringify(params) : "{}"
                }                
                let message = `${strTime}${method}${path}${jsonStr}`
                if (method === "GET" && query !== "") {
                    message = `${strTime}${method}${path}?${query}${jsonStr}`
                }

                const signature = Encode("sha256", "string", "base64", message, "string", this.secretKey)
                let headers = []
                headers.push({key: "OK-ACCESS-KEY", value: this.accessKey})
                headers.push({key: "OK-ACCESS-PASSPHRASE", value: this.passphrase})
                headers.push({key: "OK-ACCESS-TIMESTAMP", value: strTime})
                headers.push({key: "OK-ACCESS-SIGN", value: signature})                

                return this.httpReq(method, path, query, params, headers)
            }
            
            urlEncode(params: {[key: string]: string | number}): string {
                let encodeParams: string[] = []
                for (const [key, value] of Object.entries(params)) {
                    encodeParams.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`)
                }

                return encodeParams.join("&")
            }

            symbol2Inst(symbol: string): string {
                let arr = symbol.split("_")
                if (arr.length >= 2) {
                    return `${arr[0]}-${arr[1]}`.toUpperCase()
                } else {
                    return `${arr[0]}-USDT`.toUpperCase()
                }
            }

            getSymbol(inst: string): string {
                let arr = inst.split("-")
                if (arr.length >= 2) {
                    return `${arr[0]}_${arr[1]}`.toUpperCase()
                } else {
                    return `${arr[0]}-USDT`.toUpperCase()
                }
            }
            
            // The following code encapsulates OKX's interface
            GetTicker(symbol: string): IData | IError {
                // GET /api/v5/market/ticker , param: instId 

                let inst = this.symbol2Inst(symbol)
                let ret = this.httpReq("GET", "/api/v5/market/ticker", `instId=${inst}`)

                let retData = {}
                for (var ele of ret["data"]) {
                    retData["symbol"] = this.getSymbol(ele["instId"])
                    retData["buy"] = ele["bidPx"]
                    retData["sell"] = ele["askPx"]
                    retData["high"] = ele["high24h"]
                    retData["low"] = ele["low24h"]
                    retData["open"] = ele["open24h"]
                    retData["last"] = ele["last"]
                    retData["vol"] = ele["vol24h"]
                    retData["time"] = ele["ts"]
                }

                return {data: retData, raw: ret}
            }
            
            GetAccount(): IData | IError {
                // GET /api/v5/account/balance
                
                let ret = this.callSignedAPI("GET", "/api/v5/account/balance")

                let retData = []
                for (var ele of ret["data"]) {
                    for (var detail of ele["details"]) {
                        let asset = {"currency": detail["ccy"], "free": detail["availEq"], "frozen": detail["ordFrozen"]}
                        if (detail["availEq"] == "") {
                            asset["free"] = detail["availBal"]
                        }
                        retData.push(asset)
                    }
                }
                
                return {data: retData, raw: ret}
            }

            IO(method: string, path: string, params: {[key: string]: any}): {[key: string]: any} {
                let ret = null 
                if (method == "GET") {
                    ret = this.callSignedAPI(method, path, this.urlEncode(params))
                } else {
                    ret = this.callSignedAPI(method, path, "", params)
                }

                return {data: ret}
            }
        }
        
        // protocol factory
        class ProtocolFactory {
            static createExWrapper(accessKey: string, secretKey: string, exName: string): any {
                let protocol = null
                if (exName == "/OKX") {
                    try {
                        let passphrase = ""
                        let simulate = false
                        let arrSecretKey = secretKey.split(",")

                        if (arrSecretKey.length == 2) {
                            secretKey = arrSecretKey[0]
                            passphrase = arrSecretKey[1]
                        } else if (arrSecretKey.length == 3) {
                            secretKey = arrSecretKey[0]
                            passphrase = arrSecretKey[1]
                            simulate = arrSecretKey[2] == "simulate" ? true : false 
                        } else {
                            return null
                        }
                        protocol = new CustomProtocolOKX(accessKey, secretKey, passphrase, simulate, proxyConfig)
                    } catch(e) {
                        Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
                        return null
                    }
                }
                return protocol
            }
        }
        
        // http service
        let resp = {}
        let reqMethod = ctx.method()
        let reqPath = ctx.path()
        let httpMethod = ctx.header("Http-Method")
        let reqBody = null

        try {
            reqBody = JSON.parse(ctx.body())
        } catch(e) {
            resp = {error: {name: e.name, stack: e.stack, message: e.message, errDesc: "JSON parse error."}}
        }

        // onPost
        if (reqMethod == "POST") {
            if (!["access_key", "secret_key", "method", "params"].every(key=> key in reqBody)) {
                resp = {error: {reqBody: reqBody, errDesc: "reqBody error."}}
            }

            if ("error" in resp) {
                ctx.write(JSON.stringify(resp))
                return 
            }

            let accessKey = reqBody["access_key"]
            let secretKey = reqBody["secret_key"]
            let method = reqBody["method"]
            let params = reqBody["params"]

            let protocol = ProtocolFactory.createExWrapper(accessKey, secretKey, reqPath)
            if (!protocol) {
                ctx.write(JSON.stringify({error: {errDesc: "createExWrapper error."}}))
                return 
            }

            // process GetTicker / GetAccount ...
            if (method == "ticker") {
                if (!["symbol"].every(key=> key in params)) {
                    resp = {error: {params: params, errDesc: "params error."}}
                } else {
                    let symbol = params["symbol"]
                    resp = protocol.GetTicker(symbol)
                }
            } else if (method == "accounts") {
                resp = protocol.GetAccount()
            } else if (method.slice(0, 6) == "__api_") {
                resp = protocol.IO(httpMethod, method.slice(6), params)
            } else {
                ctx.write(JSON.stringify({error: {method: method, errDesc: "method not support."}}))
                return 
            }

            ctx.write(JSON.stringify(resp))
        }
    }, proxyConfig)
}

function init() {
    $.startService(address, port, proxyConfig)
    Log("启动通用协议服务,address:", address, ",port:", port, "#FF0000")
    if (proxyConfig != "") {
        Log("设置代理:", proxyConfig, "#FF0000")
    }
}

اس کے علاوہ، ہم نے اس کے بارے میں بہت کچھ سیکھا ہے، لیکن اس کے بارے میں بہت کچھ سیکھا ہے۔تحقیقاتاثاثوں کی تلاشآئی او کال، دلچسپی رکھنے والے طلباء تمام انٹرفیس کو نافذ کرسکتے ہیں۔ ڈیزائن مکمل ، ٹیمپلیٹ کوڈ کو محفوظ کریں ، ٹیمپلیٹ کا نام محفوظ کریں: ٹائپ اسکرپٹ ورژن جنرل پروٹوکول مثال .


ٹیسٹ کی حکمت عملی

ایک بار جب ہم OKX تبادلے کے APKEY، SECRETKEY، PASSPHrase وغیرہ کی تشکیل کرلیں تو ہم ٹیسٹ کرنے کے لئے ایک ٹیسٹ پالیسی لکھ سکتے ہیں۔

اس کی حکمت عملی یہ ہے کہ ہمارے ڈیزائن کردہ ٹیمپلیٹس کی فہرست کو منتخب کریں:

img

ٹیسٹ کی حکمت عملی کا کوڈ:

function main() {
    // 测试GetTicker
    Log(`exchange.GetTicker():`, exchange.GetTicker())

    // 测试GetAccount
    Log(`exchange.GetAccount():`, exchange.GetAccount())

    // 测试exchange.IO
    Log(`exchange.IO("api", "POST", "/api/v5/trade/cancel-all-after", "timeOut=0"):`, exchange.IO("api", "POST", "/api/v5/trade/cancel-all-after", "timeOut=0"))

    // 输出通用协议添加的交易所名称
    Log(`exchange.GetName():`, exchange.GetName())

    // 输出通用协议添加的交易所标签
    Log(`exchange.GetLabel():`, exchange.GetLabel())
}

ٹیسٹ چلائیں

img

جیسا کہ آپ دیکھ سکتے ہیں، حکمت عملی صرف ایک ٹیمپلیٹ کو منتخب کرنے کے لئے ہے اور OKX تبادلے (اگرچہ OKX تبادلے پہلے سے ہی حمایت کر رہے ہیں، مثال کے طور پر یہاں OKX ایک ایف ایم زیڈ تبادلے کے لئے تبدیل کر دیا گیا ہے جو ابھی تک نہیں ہے) کے لئے ہموار رسائی حاصل کرنے کے لئے.


مزید