[TOC]
بعض اوقات مقدار کی تجارت اور خودکار حکمت عملی کی ترقی میں HTTP سروس کا استعمال کیا جاتا ہے۔_Serve()
ایک فنکشن جو صارفین کو HTTP، HTTPS اور TCP سروسز تخلیق کرنے کی لچکدار صلاحیت فراہم کرتا ہے۔ اس فنکشن کے ذریعہ ، ڈویلپرز خدمات کی تشکیل کے عمل کو آسان بنا سکتے ہیں اور مقدار کے ماحول میں زیادہ سے زیادہ اپنی مرضی کے مطابق خدمات کو لاگو کرسکتے ہیں ، جس سے حکمت عملی ڈیزائن کو زیادہ ہموار اور آسان بنایا جاسکتا ہے۔_Serve()
فنکشن کے استعمال کے منظرنامے اور بنیادی آپریشنز آپ کو تیزی سے اس نئے فنکشن کو مقدار میں لانے میں مدد کرتے ہیں۔
کے بارے میں_Serve()
اس ویب سائٹ پر ایک نیا صفحہ شائع کیا گیا ہے۔
پلیٹ فارم اپ گریڈ_Serve()
فنکشن (جیسے کہ اس سے پہلے جاوا اسکرپٹ زبان میں کوئی سروس بنانے کا فنکشن نہیں تھا ، لہذا یہ فنکشن صرف جاوا اسکرپٹ زبان کی پالیسیوں کی حمایت کرتا تھا) ، اس کا مطلب یہ ہے کہ پالیسیوں کو نیٹ ورک سروسز بنانے کی صلاحیت حاصل ہے۔ اس کی بنیاد پر ، ہم بہت ساری خصوصیات تیار کرسکتے ہیں ، بہت سی ضروریات کو حل کرسکتے ہیں۔ مثال کے طور پر ، پالیسیوں کو بیرونی انٹرفیس ، ڈیٹا کی منتقلی ، عام پروٹوکول کی خصوصیات کے ساتھ پلیٹ فارم کی حمایت کرنے کے ل.
اس مضمون میں ہم نے ایک مثال کے طور پر اس کی ضرورت کو پورا کیا ہے: "پلیٹ فارم کے ساتھ کام کرنے والے جنرل پروٹوکول کی فعالیت کو بغیر کسی رکاوٹ کے ایف ایم زیڈ پلیٹ فارم کی حمایت نہیں کرنے والے تبادلے کو پیک کریں۔"جنرل پروٹوکول گائیڈمیں ہم نے او کے ایکس کے لئے پیتھون زبان کا استعمال کیا ہے لہذا فوری طور پر ماڈل کو پیکیج کیا گیا ہے اے پی پی ((کیونکہ ایف ایم زیڈ خود او کے ایکس کی حمایت کرتا ہے ، یہاں او کے ایکس کا استعمال صرف ایک مثال ہے ، جو دوسرے ایف ایم زیڈ پلیٹ فارم تک رسائی حاصل نہیں کرنے والے تبادلے کے لئے لاگو ہوتا ہے) ؛ متن میں پیتھون کے عمومی پروٹوکول پروگرام کو الگ الگ چلانے کی ضرورت ہوتی ہے ، جب جاوا اسکرپٹ کی زبان کی حمایت کی جاتی ہے۔_Serve()
افعال کے بعد، جاوا اسکرپٹ زبان کی حکمت عملی عام پروٹوکول تک رسائی حاصل کرنے کے لئے آسان ہے.
ہم نے جنرل پروٹوکول انٹرفیس کو "ٹیمپلیٹ لائبریری" کے طور پر براہ راست پالیسی میں ضم کر دیا ہے، تاکہ یہ پالیسی ایف ایم زیڈ پر غیر تعاون یافتہ تبادلے تک رسائی حاصل کرسکے۔
اس پلیٹ فارم پر جنرل پروٹوکول ایکسچینج کی تشکیل اس طرح ہے:
اس کے علاوہ، آپ کو اس کے بارے میں مزید جاننے کی ضرورت ہے./OKX
جنرل پروٹوکول ایکسچینج کے آئٹم کی شناخت کرنے کے لئے کون سا تبادلہ ہے۔
سب سے پہلے، ایک نئی حکمت عملی تخلیق کی گئی ہے جس میں ایجاد کنندہ کوالٹی ٹریڈنگ پلیٹ فارم کی حکمت عملی کی قسم ٹیمپلیٹ لائبریری کے طور پر مقرر کی گئی ہے اور حکمت عملی زبان جاوا اسکرپٹ زبان ہے۔
ایک اچھی حکمت عملی ٹیمپلیٹ بنانے کے لئے تین پیرامیٹرز شامل کریں:
اس کے بعد آپ جنرل پروٹوکول ٹیمپلیٹ کے لئے کوڈ ڈیزائن اور لکھنے شروع کر سکتے ہیں۔
اس کے علاوہ ، یہ ایک بہت ہی دلچسپ اور دلچسپ سائٹ ہے ، جس میں آپ کو بہت ساری چیزیں مل سکتی ہیں۔$.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 وغیرہ کی تشکیل کرلیں تو ہم ٹیسٹ کرنے کے لئے ایک ٹیسٹ پالیسی لکھ سکتے ہیں۔
اس کی حکمت عملی یہ ہے کہ ہمارے ڈیزائن کردہ ٹیمپلیٹس کی فہرست کو منتخب کریں:
ٹیسٹ کی حکمت عملی کا کوڈ:
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())
}
جیسا کہ آپ دیکھ سکتے ہیں، حکمت عملی صرف ایک ٹیمپلیٹ کو منتخب کرنے کے لئے ہے اور OKX تبادلے (اگرچہ OKX تبادلے پہلے سے ہی حمایت کر رہے ہیں، مثال کے طور پر یہاں OKX ایک ایف ایم زیڈ تبادلے کے لئے تبدیل کر دیا گیا ہے جو ابھی تک نہیں ہے) کے لئے ہموار رسائی حاصل کرنے کے لئے.