@yuants/vendor-okx 0.23.24 → 0.23.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account.js +9 -8
- package/dist/account.js.map +1 -1
- package/dist/api.js +444 -402
- package/dist/api.js.map +1 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/loan-account.js +3 -2
- package/dist/loan-account.js.map +1 -1
- package/dist/market-order.js +1 -1
- package/dist/market-order.js.map +1 -1
- package/dist/order-actions.js +211 -0
- package/dist/order-actions.js.map +1 -0
- package/dist/order.js +3 -3
- package/dist/order.js.map +1 -1
- package/dist/public-api.js.map +1 -1
- package/dist/quote.js.map +1 -1
- package/dist/services.js +3 -2
- package/dist/services.js.map +1 -1
- package/dist/strategy-account.js +5 -4
- package/dist/strategy-account.js.map +1 -1
- package/dist/trade.js +6 -5
- package/dist/trade.js.map +1 -1
- package/dist/transfer.js +279 -0
- package/dist/transfer.js.map +1 -0
- package/dist/websocket.js.map +1 -1
- package/lib/account.d.ts +2 -2
- package/lib/account.d.ts.map +1 -1
- package/lib/account.js +8 -7
- package/lib/account.js.map +1 -1
- package/lib/api.d.ts +1252 -1264
- package/lib/api.d.ts.map +1 -1
- package/lib/api.js +477 -404
- package/lib/api.js.map +1 -1
- package/lib/index.d.ts +5 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +5 -4
- package/lib/index.js.map +1 -1
- package/lib/loan-account.js +2 -1
- package/lib/loan-account.js.map +1 -1
- package/lib/market-order.d.ts.map +1 -1
- package/lib/market-order.js +1 -1
- package/lib/market-order.js.map +1 -1
- package/lib/order-actions.d.ts +2 -0
- package/lib/order-actions.d.ts.map +1 -0
- package/lib/order-actions.js +213 -0
- package/lib/order-actions.js.map +1 -0
- package/lib/order.js +2 -2
- package/lib/order.js.map +1 -1
- package/lib/public-api.js.map +1 -1
- package/lib/quote.d.ts +1 -1
- package/lib/quote.d.ts.map +1 -1
- package/lib/quote.js.map +1 -1
- package/lib/services.js +2 -1
- package/lib/services.js.map +1 -1
- package/lib/strategy-account.d.ts +2 -2
- package/lib/strategy-account.d.ts.map +1 -1
- package/lib/strategy-account.js +4 -3
- package/lib/strategy-account.js.map +1 -1
- package/lib/trade.js +6 -5
- package/lib/trade.js.map +1 -1
- package/lib/transfer.d.ts +2 -0
- package/lib/transfer.d.ts.map +1 -0
- package/lib/transfer.js +281 -0
- package/lib/transfer.js.map +1 -0
- package/lib/websocket.js.map +1 -1
- package/package.json +13 -12
- package/temp/package-deps.json +30 -29
- package/dist/legacy_index.js +0 -563
- package/dist/legacy_index.js.map +0 -1
- package/dist/logger.js +0 -91
- package/dist/logger.js.map +0 -1
- package/lib/legacy_index.d.ts +0 -2
- package/lib/legacy_index.d.ts.map +0 -1
- package/lib/legacy_index.js +0 -565
- package/lib/legacy_index.js.map +0 -1
- package/lib/logger.d.ts +0 -21
- package/lib/logger.d.ts.map +0 -1
- package/lib/logger.js +0 -98
- package/lib/logger.js.map +0 -1
package/lib/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { encodeBase64, formatTime, HmacSHA256 } from '@yuants/utils';\n\n/**\n * API v5: https://www.okx.com/docs-v5/#overview\n */\nexport class OkxClient {\n noAuth = true;\n constructor(\n public config: {\n auth: {\n public_key: string;\n secret_key: string;\n passphrase: string;\n };\n },\n ) {\n if (config.auth.public_key && config.auth.secret_key && config.auth.passphrase) {\n this.noAuth = false;\n }\n }\n\n async request(method: string, path: string, params?: any) {\n const url = new URL('https://www.okx.com');\n url.pathname = path;\n if (method === 'GET') {\n for (const key in params) {\n url.searchParams.set(key, params[key]);\n }\n }\n if (this.noAuth) {\n console.info(formatTime(Date.now()), method, url.href);\n const res = await fetch(url.href, { method });\n return res.json();\n }\n const timestamp = formatTime(Date.now(), 'UTC').replace(' ', 'T');\n const secret_key = this.config.auth.secret_key;\n const body = method === 'GET' ? '' : JSON.stringify(params);\n const signData = timestamp + method + url.pathname + url.search + body;\n const str = encodeBase64(\n await HmacSHA256(\n //\n new TextEncoder().encode(signData),\n new TextEncoder().encode(secret_key),\n ),\n );\n\n const headers = {\n 'Content-Type': 'application/json',\n 'OK-ACCESS-KEY': this.config.auth.public_key!,\n 'OK-ACCESS-SIGN': str,\n 'OK-ACCESS-TIMESTAMP': timestamp,\n 'OK-ACCESS-PASSPHRASE': this.config.auth.passphrase,\n };\n\n console.info(formatTime(Date.now()), method, url.href, JSON.stringify(headers), body, signData);\n const res = await fetch(url.href, {\n method,\n headers,\n body: body || undefined,\n });\n return res.json();\n }\n\n /**\n * 获取账户资产估值\n *\n * 查看账户资产估值\n *\n * 限速:1次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-account-asset-valuation\n */\n getAssetValuation = (params?: {\n ccy?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: Array<{\n details: {\n classic: string;\n earn: string;\n funding: string;\n trading: string;\n };\n totalBal: string;\n ts: string;\n }>;\n }> => this.request('GET', '/api/v5/asset/asset-valuation', params);\n\n /**\n * 查看账户配置\n * 查看当前账户的配置信息。\n *\n * 限速:5次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-account-configuration\n */\n getAccountConfig = (): Promise<{\n code: string;\n data: Array<{\n acctLv: string;\n autoLoan: boolean;\n ctIsoMode: string;\n greeksType: string;\n level: string;\n levelTmp: string;\n mgnIsoMode: string;\n posMode: string;\n spotOffsetType: string;\n uid: string;\n label: string;\n roleType: string;\n traderInsts: any[];\n spotRoleType: string;\n spotTraderInsts: any[];\n opAuth: string;\n kycLv: string;\n ip: string;\n perm: string;\n mainUid: string;\n }>;\n msg: string;\n }> => this.request('GET', '/api/v5/account/config');\n\n /**\n * 获取余币宝余额\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#financial-product-savings-get-saving-balance\n */\n getFinanceSavingsBalance = (params: {\n ccy?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n earnings: string;\n redemptAmt: string;\n rate: string;\n ccy: string;\n amt: string;\n loanAmt: string;\n pendingAmt: string;\n }[];\n }> => this.request('GET', '/api/v5/finance/savings/balance', params);\n\n /**\n * 余币宝申购/赎回\n *\n * 仅资金账户中的资产支持余币宝申购。\n *\n * 限速:6次/s\n *\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#financial-product-savings-post-savings-purchase-redemption\n */\n postFinanceSavingsPurchaseRedempt = (params: {\n ccy: string;\n amt: string;\n side: string;\n rate: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n ccy: string;\n amt: string;\n side: string;\n rate: string;\n }[];\n }> => this.request('POST', '/api/v5/finance/savings/purchase-redempt', params);\n\n /**\n * 提币\n *\n * 用户提币。普通子账户不支持提币。\n *\n * API只能提币到免认证地址/账户上,通过 WEB/APP 可以设置免认证地址。\n *\n * 关于标签:某些币种如XRP充币时同时需要一个充值地址和标签(又名memo/payment_id),标签是一种保证您的充币地址唯一性的数字串,与充币地址成对出现并一一对应。请您务必遵守正确的充值步骤,在提币时输入完整信息,否则将面临丢失币的风险!\n * 对于有标签的币种,如果是OKX用户间的提币,请走内部转账不要走链上提币。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-withdrawal\n */\n postAssetWithdrawal = (params: {\n amt: string;\n fee: string;\n dest: string;\n ccy: string;\n chain?: string;\n toAddr: string;\n clientId?: string;\n rcvrInfo?: {\n walletType: string;\n exchId: string;\n rcvrFirstName: string;\n rcvrLastName: string;\n };\n }): Promise<{\n code: string;\n msg: string;\n data: Array<{\n amt: string;\n wdId: string;\n ccy: string;\n clientId: string;\n chain: string;\n }>;\n }> => this.request('POST', '/api/v5/asset/withdrawal', params);\n\n /**\n * 获取充值地址信息\n *\n * 获取各个币种的充值地址,包括曾使用过的老地址。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-deposit-address\n */\n getAssetDepositAddress = (params: {\n ccy: string;\n }): Promise<{\n code: string;\n data: {\n chain: string;\n ctAddr: string;\n ccy: string;\n to: string;\n addr: string;\n verifiedName: string;\n selected: boolean;\n }[];\n msg: string;\n }> => this.request('GET', '/api/v5/asset/deposit-address', params);\n\n /**\n * 获取提币记录\n *\n * 根据币种,提币状态,时间范围获取提币记录,按照时间倒序排列,默认返回100条数据。\n * 支持Websocket订阅,参考 提币信息频道。\n *\n * 限速:6 次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-withdrawal-history\n */\n getAssetWithdrawalHistory = (params: {\n ccy?: string;\n wdId?: string;\n clientId?: string;\n txId?: string;\n type?: string;\n state?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n chain: string;\n fee: string;\n feeCcy: string;\n ccy: string;\n clientId: string;\n amt: string;\n txId: string;\n from: string;\n areaCodeFrom: string;\n to: string;\n areaCodeTo: string;\n state: string;\n ts: string;\n nonTradableAsset: boolean;\n wdId: string;\n }[];\n }> => this.request('GET', '/api/v5/asset/withdrawal-history', params);\n\n /**\n * 获取充值记录\n *\n * 根据币种,充值状态,时间范围获取充值记录,按照时间倒序排列,默认返回 100 条数据。\n * 支持Websocket订阅,参考 充值信息频道。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-deposit-history\n */\n getAssetDepositHistory = (params: {\n ccy?: string;\n depId?: string;\n state?: string;\n fromWdId?: string;\n txId?: string;\n type?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n actualDepBlkConfirm: string;\n amt: string;\n areaCodeFrom: string;\n ccy: string;\n chain: string;\n depId: string;\n from: string;\n fromWdId: string;\n state: string;\n to: string;\n ts: string;\n txId: string;\n }[];\n }> => this.request('GET', '/api/v5/asset/deposit-history', params);\n\n /**\n * 获取资金账户余额\n *\n * 获取资金账户所有资产列表,查询各币种的余额、冻结和可用等信息。\n *\n * 只返回余额大于0的币资产信息。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-balance\n */\n getAssetBalances = (params: {\n ccy?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n availBal: string;\n bal: string;\n ccy: string;\n frozenBal: string;\n }[];\n }> => this.request('GET', '/api/v5/asset/balances', params);\n\n /**\n * 资金划转\n *\n * 调用时,API Key 需要有交易权限。\n *\n * 支持母账户的资金账户划转到交易账户,母账户到子账户的资金账户和交易账户划转。\n *\n * 子账户默认可转出至母账户,划转到同一母账户下的其他子账户,需要先调用 设置子账户主动转出权限 接口进行授权。\n *\n * 请求失败不代表划转失败,建议以获取资金划转状态接口返回的状态为准。\n *\n * 限速:2 次/s\n * 限速规则:UserID + Currency\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-funds-transfer\n */\n postAssetTransfer = (params: {\n ccy: string;\n type?: string;\n amt: string;\n from: string;\n to: string;\n subAcct?: string;\n loanTrans?: boolean;\n omitPosRisk?: string;\n clientId?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n transId: string;\n ccy: string;\n clientId: string;\n from: string;\n amt: string;\n to: string;\n }[];\n }> => this.request('POST', '/api/v5/asset/transfer', params);\n\n /**\n * 查看账户余额\n *\n * 获取交易账户中资金余额信息。\n *\n * 免息额度和折算率都是公共数据,不在账户接口内展示\n *\n * 限速:10次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-balance\n */\n getAccountBalance = (params: {\n ccy?: string;\n }): Promise<{\n code: string;\n data: {\n adjEq: string;\n borrowFroz: string;\n details: {\n availBal: string;\n availEq: string;\n borrowFroz: string;\n cashBal: string;\n ccy: string;\n crossLiab: string;\n disEq: string;\n eq: string;\n eqUsd: string;\n fixedBal: string;\n frozenBal: string;\n imr: string;\n interest: string;\n isoEq: string;\n isoLiab: string;\n isoUpl: string;\n liab: string;\n maxLoan: string;\n mgnRatio: string;\n mmr: string;\n notionalLever: string;\n ordFrozen: string;\n rewardBal: string;\n spotInUseAmt: string;\n spotIsoBal: string;\n stgyEq: string;\n twap: string;\n uTime: string;\n upl: string;\n uplLiab: string;\n openAvgPx: string;\n spotUpl: string;\n accAvgPx: string;\n totalPnl: string;\n spotBal: string;\n }[];\n imr: string;\n isoEq: string;\n mgnRatio: string;\n mmr: string;\n notionalUsd: string;\n ordFroz: string;\n totalEq: string;\n uTime: string;\n upl: string;\n }[];\n msg: string;\n }> => this.request('GET', '/api/v5/account/balance', params);\n\n /**\n * 查看持仓信息\n *\n * 获取该账户下拥有实际持仓的信息。账户为买卖模式会显示净持仓(net),账户为开平仓模式下会分别返回开多(long)或开空(short)的仓位。按照仓位创建时间倒序排列。\n *\n * 如果该 instId 拥有过仓位且当前持仓量为0,传 instId 时,如果当前存在有效的posId,会返回仓位信息,如果当前不存在有效的 posId 时,不会返回仓位信息;不传 instId 时,仓位信息不返回。\n *\n * 逐仓交易设置中,如果设置为自主划转模式,逐仓转入保证金后,会生成一个持仓量为0的仓位\n *\n * 限速:10次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-positions\n */\n getAccountPositions = (params: {\n instType?: string;\n instId?: string;\n posId?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n adl: string;\n availPos: string;\n avgPx: string;\n cTime: string;\n ccy: string;\n deltaBS: string;\n deltaPA: string;\n gammaBS: string;\n gammaPA: string;\n imr: string;\n instId: string;\n instType: string;\n interest: string;\n idxPx: string;\n last: string;\n usdPx: string;\n bePx: string;\n lever: string;\n liab: string;\n liabCcy: string;\n liqPx: string;\n markPx: string;\n margin: string;\n mgnMode: string;\n mgnRatio: string;\n mmr: string;\n notionalUsd: string;\n optVal: string;\n pTime: string;\n pos: string;\n posCcy: string;\n posId: string;\n posSide: string;\n spotInUseAmt: string;\n spotInUseCcy: string;\n thetaBS: string;\n thetaPA: string;\n tradeId: string;\n bizRefId: string;\n bizRefType: string;\n quoteBal: string;\n baseBal: string;\n baseBorrowed: string;\n baseInterest: string;\n quoteBorrowed: string;\n quoteInterest: string;\n uTime: string;\n upl: string;\n uplLastPx: string;\n uplRatio: string;\n uplRatioLastPx: string;\n vegaBS: string;\n vegaPA: string;\n realizedPnl: string;\n pnl: string;\n fee: string;\n fundingFee: string;\n liqPenalty: string;\n closeOrderAlgo: {\n algoId: string;\n slTriggerPx: string;\n slTriggerPxType: string;\n tpTriggerPx: string;\n tpTriggerPxType: string;\n closeFraction: string;\n }[];\n }[];\n }> => this.request('GET', '/api/v5/account/positions', params);\n\n /**\n * 获取最大可下单数量\n *\n * 获取最大可买卖/开仓数量,可对应下单时的 sz 字段\n *\n * 限速:20次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-maximum-tradable-size\n */\n getAccountMaxSize = (params: {\n instId: string;\n tdMode: string;\n ccy?: string;\n px?: string;\n leverage?: string;\n tradeQuoteCcy?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: Array<{\n instId: string;\n ccy: string;\n maxBuy: string;\n maxSell: string;\n }>;\n }> => this.request('GET', '/api/v5/account/max-size', params);\n\n /**\n * 赚币\n * GET / 查看项目\n *\n * 限速:3次/s\n * 限速规则:UserID\n */\n getFinanceStakingDeFiOffers = (params: {\n productId?: string;\n protocolType?: string;\n ccy?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n ccy: string;\n productId: string;\n protocol: string;\n protocolType: string;\n term: string;\n apy: string;\n earlyRedeem: boolean;\n investData: {\n ccy: string;\n bal: string;\n minAmt: string;\n maxAmt: string;\n }[];\n earningData: {\n ccy: string;\n earningType: string;\n }[];\n state: string;\n earningCcy?: string[];\n }[];\n }> => this.request('GET', '/api/v5/finance/staking-defi/offers', params);\n\n /**\n * 赚币\n * GET / 查看活跃订单\n *\n * 限速:3次/s\n * 限速规则:UserID\n */\n getFinanceStakingDeFiOrdersActive = (params: {\n productId?: string;\n protocolType?: string;\n ccy?: string;\n state?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n ordId: string;\n state: string;\n ccy: string;\n protocol: string;\n protocolType: string;\n term: string;\n apy: string;\n investData: {\n ccy: string;\n amt: string;\n minAmt?: string;\n maxAmt?: string;\n }[];\n earningData: {\n ccy: string;\n earningType: string;\n earnings: string;\n }[];\n purchasedTime: string;\n estSettlementTime: string;\n cancelRedemptionDeadline: string;\n tag: string;\n earningCcy?: string[];\n }[];\n }> => this.request('GET', '/api/v5/finance/staking-defi/orders-active', params);\n\n /**\n * 下单\n *\n * 只有当您的账户有足够的资金才能下单。\n *\n * 限速:60次/2s\n *\n * 跟单交易带单产品的限速:4次/2s\n *\n * 限速规则(期权以外):UserID + Instrument ID\n *\n * 限速规则(只限期权):UserID + Instrument Family\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-post-place-order\n */\n postTradeOrder = (params: {\n instId: string;\n tdMode: string;\n ccy?: string;\n clOrdId?: string;\n tag?: string;\n side: string;\n posSide?: string;\n ordType: string;\n sz: string;\n px?: string;\n pxUsd?: string;\n pxVol?: string;\n reduceOnly?: string;\n tgtCcy?: string;\n banAmend?: string;\n quickMgnType?: string;\n stpId?: string;\n stpMode?: string;\n attachAlgoOrds?: Array<{\n attachAlgoClOrdId?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n tpOrdKind?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n tpTriggerPxType?: string;\n slTriggerPxType?: string;\n sz?: string;\n amendPxOnTriggerType?: string;\n }>;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n clOrdId: string;\n ordId: string;\n tag: string;\n sCode: string;\n sMsg: string;\n }[];\n inTime: string;\n outTime: string;\n }> => this.request('POST', '/api/v5/trade/order', params);\n\n /**\n * 修改订单\n *\n * 修改当前未成交的挂单\n *\n * 限速:60次/2s\n *\n * 跟单交易带单员带单产品的限速:4个/2s\n *\n * 限速规则:User ID + Instrument ID\n *\n * 权限:交易\n *\n * 该接口限速同时受到 子账户限速 及 基于成交比率的子账户限速 限速规则的影响。\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-post-amend-order\n */\n postTradeAmendOrder = (params: {\n instId: string;\n cxIOnFail?: boolean;\n ordId?: string;\n clOrdId?: string;\n reqId?: string;\n newSz?: string;\n newPx?: string;\n newPxUsd?: string;\n newPxVol?: string;\n attachAlgoOrds?: Array<{\n attachAlgoId?: string;\n attachAlgoClOrdId?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newTpOrdKind?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n newTpTriggerPxType?: string;\n newSlTriggerPxType?: string;\n sz?: string;\n amendPxOnTriggerType?: string;\n }>;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n clOrdId: string;\n ordId: string;\n ts: string;\n reqId: string;\n sCode: string;\n sMsg: string;\n }[];\n inTime: string;\n outTime: string;\n }> => this.request('POST', '/api/v5/trade/amend-order', params);\n\n /**\n * 获取未成交订单列表\n *\n * 获取当前账户下所有未成交订单信息\n *\n * 限速:60次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-get-order-list\n */\n getTradeOrdersPending = (params: {\n instType?: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n ordType?: string;\n state?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n accFillSz: string;\n avgPx: string;\n cTime: string;\n category: string;\n ccy: string;\n clOrdId: string;\n fee: string;\n feeCcy: string;\n fillPx: string;\n fillSz: string;\n fillTime: string;\n instId: string;\n instType: string;\n lever: string;\n ordId: string;\n ordType: string;\n pnl: string;\n posSide: string;\n px: string;\n pxUsd: string;\n pxVol: string;\n pxType: string;\n rebate: string;\n rebateCcy: string;\n side: string;\n attachAlgoClOrdId: string;\n slOrdPx: string;\n slTriggerPx: string;\n slTriggerPxType: string;\n attachAlgoOrds: any[];\n source: string;\n state: string;\n stpId: string;\n stpMode: string;\n sz: string;\n tag: string;\n tdMode: string;\n tgtCcy: string;\n tpOrdPx: string;\n tpTriggerPx: string;\n tpTriggerPxType: string;\n tradeId: string;\n reduceOnly: string;\n quickMgnType: string;\n algoClOrdId: string;\n algoId: string;\n isTpLimit: string;\n uTime: string;\n }[];\n }> => this.request('GET', '/api/v5/trade/orders-pending', params);\n\n /**\n * 获取历史订单记录(近七天)\n *\n * 获取最近7天挂单,且完成的订单数据,包括7天以前挂单,但近7天才成交的订单数据。按照订单创建时间倒序排序。\n *\n * 已经撤销的未成交单 只保留2小时\n * 限速:40次/2s\n * 限速规则:User ID\n */\n getTradeOrdersHistory = (params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n ordType?: string;\n state?: string;\n category?: string;\n after?: string;\n before?: string;\n begin?: string;\n end?: string;\n limit?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: Array<{\n instType: string;\n instId: string;\n tgtCcy: string;\n ccy: string;\n ordId: string;\n clOrdId: string;\n tag: string;\n px: string;\n pxUsd: string;\n pxVol: string;\n pxType: string;\n sz: string;\n ordType: string;\n side: string;\n posSide: string;\n tdMode: string;\n accFillSz: string;\n fillPx: string;\n tradeId: string;\n fillSz: string;\n fillTime: string;\n avgPx: string;\n state: string;\n lever: string;\n attachAlgoClOrdId: string;\n tpTriggerPx: string;\n tpTriggerPxType: string;\n tpOrdPx: string;\n slTriggerPx: string;\n slTriggerPxType: string;\n slOrdPx: string;\n attachAlgoOrds: any[];\n linkedAlgoOrd: any[];\n stpId: string;\n stpMode: string;\n feeCcy: string;\n fee: string;\n rebateCcy: string;\n source: string;\n rebate: string;\n pnl: string;\n category: string;\n reduceOnly: string;\n cancelSource: string;\n cancelSourceReason: string;\n algoClOrdId: string;\n algoId: string;\n isTpLimit: string;\n uTime: string;\n cTime: string;\n tradeQuoteCcy: string;\n }>;\n }> => this.request('GET', '/api/v5/trade/orders-history', params);\n\n /**\n * 撤单\n *\n * 撤销之前下的未完成订单。\n *\n * 限速:60次/2s\n *\n * 限速规则(期权以外):UserID + Instrument ID\n *\n * 限速规则(只限期权):UserID + Instrument Family\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-post-cancel-order\n */\n postTradeCancelOrder = (params: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n clOrdId: string;\n ordId: string;\n sCode: string;\n sMsg: string;\n }[];\n inTime: string;\n outTime: string;\n }> => this.request('POST', '/api/v5/trade/cancel-order', params);\n\n /**\n * 查看子账户列表\n *\n * 仅适用于母账户。\n *\n * 限速:2次/2s\n *\n * 限速规则:UserID\n */\n getSubAccountList = (params?: {\n enable?: string;\n subAct?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n data: {\n type: string;\n enable: string;\n subAcct: string;\n uid: string;\n label: string;\n mobile: string;\n gAuth: boolean;\n frozenFunc: string[];\n canTransOut: boolean;\n ts: string;\n }[];\n code: string;\n msg: string;\n }> => this.request('GET', '/api/v5/users/subaccount/list', params);\n\n /**\n * 设置子账户主动转出权限\n *\n * 设置子账户转出权限(仅适用于母账户),默认可转出至母账户。\n *\n * 限速:1次/s\n *\n * 限速规则:UserID\n */\n postSetSubAccountTransferOut = (params: {\n subAcct: string;\n canTransOut: boolean;\n }): Promise<{\n subAcct: string;\n canTransOut: boolean;\n }> => this.request('POST', '/api/v5/users/subaccount/set-transfer-out', params);\n\n /**\n * 获取资金划转状态\n *\n * 获取最近2个星期内的资金划转状态数据\n *\n * 限速:10 次/s\n *\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-funds-transfer-state\n */\n getAssetTransferState = (params: {\n transId?: string;\n clientId?: string;\n type?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n transId: string;\n clientId: string;\n ccy: string;\n amt: string;\n type: string;\n from: string;\n to: string;\n subAcct: string;\n // success | pending | failed\n state: string;\n }[];\n }> => this.request('GET', '/api/v5/asset/transfer-state', params);\n\n /**\n * 获取币种列表\n *\n * 获取当前用户KYC实体支持的币种列表。\n *\n * 限速:6 次/s\n *\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-currencies\n */\n getAssetCurrencies = (params?: {\n ccy?: string;\n }): Promise<{\n code: string;\n msg: string;\n data: {\n ccy: string;\n name: string;\n chain: string;\n canWd: boolean;\n canInternal: boolean;\n minWd: string;\n maxWd: string;\n wdTickSz: string;\n wdQuota: string;\n usedWdQuota: string;\n minFee: string;\n maxFee: string;\n }[];\n }> => this.request('GET', '/api/v5/asset/currencies', params);\n\n /**\n * GET / 借贷信息\n * 限速:5次/2s\n * 限速规则:User ID\n * 权限:读取\n * HTTP请求\n *\n * https://www.okx.com/docs-v5/zh/#financial-product-flexible-loan-get-loan-info\n */\n getFlexibleLoanInfo = (): Promise<{\n code: string;\n data: {\n collateralData: {\n amt: string;\n ccy: string;\n }[];\n collateralNotionalUsd: string;\n curLTV: string;\n liqLTV: string;\n loanData: {\n amt: string;\n ccy: string;\n }[];\n loanNotionalUsd: string;\n marginCallLTV: string;\n riskWarningData: {\n instId: string;\n liqPx: string;\n };\n }[];\n msg: string;\n }> => this.request('GET', '/api/v5/finance/flexible-loan/loan-info');\n\n /**\n * 账单流水查询(近七天)\n *\n *\n * 限速:5次/s\n *\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-bills-details-last-7-days\n */\n getAccountBills = (params?: {\n instType?: string;\n instId?: string;\n ccy?: string;\n mgnMode?: 'isolated' | 'cross';\n ctType?: 'linear' | 'inverse';\n type?: AccountBillType;\n subType?: string;\n after?: string; //请求此id之前(更旧的数据)的分页内容,传的值为对应接口的billId\n before?: string; //请求此id之后(更新的数据)的分页内容,传的值为对应接口的billId\n begin?: string; //筛选的开始时间戳 ts,Unix 时间戳为毫秒数格式,如 1597026383085\n end?: string;\n limit?: string; //分页返回的结果集数量,最大为100,不填默认返回100条\n }): Promise<{\n code: string;\n msg: string;\n data: {\n instType: string;\n billId: string;\n type: string;\n subType: string;\n ts: string;\n balChg: string;\n posBalChg: string;\n bal: string;\n posBal: string;\n sz: string;\n px: string;\n ccy: string;\n pnl: string;\n fee: string;\n mgnMode: 'isolated' | 'cross' | 'cash' | '';\n instId: string;\n ordId: string;\n execType: string;\n from: string;\n to: string;\n notes: string;\n interest: string;\n tag: string;\n fillTime: string;\n tradeId: string;\n clOrdId: string;\n fillIdxPx: string;\n fillMarkPx: string;\n fillPxVol: string;\n fillPxUsd: string;\n fillMarkVol: string;\n fillFwdPx: string;\n }[];\n }> => this.request('GET', '/api/v5/account/bills', params);\n\n /**\n * 账单流水查询(近三个月)\n *\n *\n * 限速:5次/2s\n *\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-bills-details-last-3-months\n */\n getAccountBillsArchive = (params?: {\n instType?: string;\n instId?: string;\n ccy?: string;\n mgnMode?: 'isolated' | 'cross';\n ctType?: 'linear' | 'inverse';\n type?: AccountBillType;\n subType?: string;\n after?: string; //请求此id之前(更旧的数据)的分页内容,传的值为对应接口的billId\n before?: string; //请求此id之后(更新的数据)的分页内容,传的值为对应接口的billId\n begin?: string; //筛选的开始时间戳 ts,Unix 时间戳为毫秒数格式,如 1597026383085\n end?: string;\n limit?: string; //分页返回的结果集数量,最大为100,不填默认返回100条\n }): Promise<{\n code: string;\n msg: string;\n data: {\n instType: string;\n billId: string;\n type: string;\n subType: string;\n ts: string;\n balChg: string;\n posBalChg: string;\n bal: string;\n posBal: string;\n sz: string;\n px: string;\n ccy: string;\n pnl: string;\n fee: string;\n mgnMode: 'isolated' | 'cross' | 'cash' | '';\n instId: string;\n ordId: string;\n execType: string;\n from: string;\n to: string;\n notes: string;\n interest: string;\n tag: string;\n fillTime: string;\n tradeId: string;\n clOrdId: string;\n fillIdxPx: string;\n fillMarkPx: string;\n fillPxVol: string;\n fillPxUsd: string;\n fillMarkVol: string;\n fillFwdPx: string;\n }[];\n }> => this.request('GET', '/api/v5/account/bills-archive', params);\n\n /**\n * POST / 网格策略委托下单\n * 限速:20次/2s\n * 限速规则:User ID + Instrument ID\n * 权限:交易\n * HTTP请求\n *\n * https://www.okx.com/docs-v5/zh/?language=shell#order-book-trading-grid-trading-post-place-grid-algo-order\n */\n postGridAlgoOrder = (\n params: {\n instId: string;\n algoOrdType: string;\n maxPx: string;\n minPx: string;\n gridNum: string;\n runType?: string;\n tpTriggerPx?: string;\n slTriggerPx?: string;\n algoClOrdId?: string;\n tag?: string;\n profitSharingRatio?: string;\n triggerParams?: {\n triggerAction: string;\n triggerStrategy: string;\n timeframe?: string;\n thold?: string;\n triggerCond?: string;\n timePeriod?: string;\n delaySeconds?: string;\n triggerPx?: string;\n stopType?: string;\n }[];\n } & Grid,\n ): Promise<{\n code: string;\n msg: string;\n data: {\n algoId: string;\n algoClOrdId: string;\n sCode: string;\n sMsg: string;\n tag: string;\n }[];\n }> => this.request('POST', '/api/v5/tradingBot/grid/order-algo', params);\n\n /**\n * GET / 获取未完成网格策略委托单列表\n * 限速:20次/2s\n * 限速规则:User ID\n * 权限:读取\n * HTTP请求\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-grid-trading-get-grid-algo-order-list\n */\n getGridOrdersAlgoPending = (param: {\n algoOrdType: 'grid' | 'contract_grid';\n algoId?: string;\n instId?: string;\n instType?: string;\n after?: string;\n before?: string;\n limit?: string;\n }): Promise<{\n code: string;\n data: {\n algoId: string;\n algoClOrdId: string;\n instType: string;\n instId: string;\n cTime: string;\n uTime: string;\n algoOrdType: 'grid' | 'contract_grid';\n state: 'starting' | 'running' | 'stopping' | 'pending_signal' | 'no_close_position';\n rebateTrans: {\n rebate: string;\n rebateCcy: string;\n }[];\n triggerParams: {\n triggerAction: string;\n triggerStrategy: string;\n delaySeconds: string;\n triggerTime: string;\n triggerType: string;\n timeframe: string;\n thold: string;\n triggerCond: 'cross_up' | 'cross_down' | 'above' | 'below' | 'cross';\n timePeriod: string;\n triggerPx: string;\n stopType: string;\n }[];\n maxPx: string;\n minPx: string;\n gridNum: string;\n runType: '1' | '2';\n tpTriggerPx: string;\n slTriggerPx: string;\n arbitrageNum: string;\n totalPnl: string;\n pnlRatio: string;\n investment: string;\n gridProfit: string;\n floatProfit: string;\n cancelType: '0' | '1' | '2' | '3' | '4' | '5' | '6';\n stopType: '1' | '2';\n quoteSz: string;\n baseSz: SpotGrid;\n direction: string;\n basePos: string;\n sz: string;\n lever: string;\n actualLever: string;\n liqPx: string;\n uly: string;\n instFamily: string;\n ordFrozen: string;\n availEq: string;\n tag: string;\n profitSharingRatio: string;\n copyType: string;\n fee: string;\n fundingFee: string;\n tradeQuoteCcy: string;\n }[];\n msg: string;\n }> => this.request('GET', '/api/v5/tradingBot/grid/orders-algo-pending', param);\n\n /**\n * GET / 获取网格策略委托持仓\n * 限速:20次/2s\n * 限速规则:User ID\n * 权限:读取\n * HTTP请求\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-grid-trading-get-grid-algo-order-positions\n */\n getGridPositions = (param: {\n algoOrdType: 'contract_grid';\n algoId: string;\n }): Promise<{\n code: string;\n data: {\n algoId: string;\n algoClOrdId: string;\n instType: string;\n instId: string;\n cTime: string;\n uTime: string;\n avgPx: string;\n ccy: string;\n lever: string;\n liqPx: string;\n posSide: string;\n pos: string;\n mgnMode: string;\n mgnRatio: string;\n imr: string;\n mmr: string;\n upl: string;\n uplRatio: string;\n last: string;\n notionalUsd: string;\n adl: string;\n markPx: string;\n }[];\n msg: string;\n }> => this.request('GET', '/api/v5/tradingBot/grid/positions', param);\n}\n\ntype SpotGrid = {\n quoteSz?: string;\n baseSz?: string;\n tradeQuoteCcy?: string;\n};\n\ntype SwapGrid = {\n sz: string;\n direction: string;\n lever: string;\n basePos?: string;\n tpRatio?: string;\n slRatio?: string;\n};\n\ntype Grid = SpotGrid | SwapGrid;\n\ntype AccountBillType =\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | '10'\n | '11'\n | '12'\n | '13'\n | '14'\n | '15'\n | '16'\n | '22'\n | '24'\n | '26'\n | '27'\n | '28'\n | '29'\n | '30'\n | '32'\n | '33'\n | '34'\n | '250'\n | '251';\n\nexport const client = new OkxClient({\n auth: {\n public_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n passphrase: process.env.PASSPHRASE!,\n },\n});\n"]}
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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","sourcesContent":["import { encodeBase64, formatTime, HmacSHA256 } from '@yuants/utils';\n\n/**\n * API v5: https://www.okx.com/docs-v5/#overview\n */\n\nexport interface ICredential {\n access_key: string;\n secret_key: string;\n passphrase: string;\n}\n\nexport const getDefaultCredential = (): ICredential => ({\n access_key: process.env.ACCESS_KEY!,\n secret_key: process.env.SECRET_KEY!,\n passphrase: process.env.PASSPHRASE!,\n});\n\nexport async function request(\n credential: ICredential,\n method: string,\n path: string,\n params?: Record<string, unknown>,\n) {\n const url = new URL('https://www.okx.com');\n url.pathname = path;\n if (method === 'GET' && params) {\n for (const key in params) {\n url.searchParams.set(key, String(params[key]));\n }\n }\n const timestamp = formatTime(Date.now(), 'UTC').replace(' ', 'T');\n const secret_key = credential.secret_key;\n const body = method === 'GET' ? '' : JSON.stringify(params);\n const signData = timestamp + method + url.pathname + url.search + body;\n const str = encodeBase64(\n await HmacSHA256(\n //\n new TextEncoder().encode(signData),\n new TextEncoder().encode(secret_key),\n ),\n );\n\n const headers = {\n 'Content-Type': 'application/json',\n 'OK-ACCESS-KEY': credential.access_key!,\n 'OK-ACCESS-SIGN': str,\n 'OK-ACCESS-TIMESTAMP': timestamp,\n 'OK-ACCESS-PASSPHRASE': credential.passphrase,\n };\n\n console.info(formatTime(Date.now()), method, url.href, JSON.stringify(headers), body, signData);\n const res = await fetch(url.href, {\n method,\n headers,\n body: body || undefined,\n });\n\n console.info(\n formatTime(Date.now()),\n 'PrivateApiResponse',\n credential.access_key,\n method,\n url.href,\n res.status,\n );\n\n return res.json();\n}\n\n/**\n * 获取账户资产估值\n *\n * 查看账户资产估值\n *\n * 限速:1次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-account-asset-valuation\n */\nexport function getAssetValuation(\n credential: ICredential,\n params?: {\n ccy?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: Array<{\n details: {\n classic: string;\n earn: string;\n funding: string;\n trading: string;\n };\n totalBal: string;\n ts: string;\n }>;\n}> {\n return request(credential, 'GET', '/api/v5/asset/asset-valuation', params);\n}\n\n/**\n * 查看账户配置\n * 查看当前账户的配置信息。\n *\n * 限速:5次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-account-configuration\n */\nexport function getAccountConfig(credential: ICredential): Promise<{\n code: string;\n data: Array<{\n acctLv: string;\n autoLoan: boolean;\n ctIsoMode: string;\n greeksType: string;\n level: string;\n levelTmp: string;\n mgnIsoMode: string;\n posMode: string;\n spotOffsetType: string;\n uid: string;\n label: string;\n roleType: string;\n traderInsts: unknown[];\n spotRoleType: string;\n spotTraderInsts: unknown[];\n opAuth: string;\n kycLv: string;\n ip: string;\n perm: string;\n mainUid: string;\n }>;\n msg: string;\n}> {\n return request(credential, 'GET', '/api/v5/account/config');\n}\n\n/**\n * 获取余币宝余额\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#financial-product-savings-get-saving-balance\n */\nexport function getFinanceSavingsBalance(\n credential: ICredential,\n params: {\n ccy?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n earnings: string;\n redemptAmt: string;\n rate: string;\n ccy: string;\n amt: string;\n loanAmt: string;\n pendingAmt: string;\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/finance/savings/balance', params);\n}\n\n/**\n * 余币宝申购/赎回\n *\n * 仅资金账户中的资产支持余币宝申购。\n *\n * 限速:6次/s\n *\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#financial-product-savings-post-savings-purchase-redemption\n */\nexport function postFinanceSavingsPurchaseRedempt(\n credential: ICredential,\n params: {\n ccy: string;\n amt: string;\n side: string;\n rate: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n ccy: string;\n amt: string;\n side: string;\n rate: string;\n }[];\n}> {\n return request(credential, 'POST', '/api/v5/finance/savings/purchase-redempt', params);\n}\n\n/**\n * 提币\n *\n * 用户提币。普通子账户不支持提币。\n *\n * API只能提币到免认证地址/账户上,通过 WEB/APP 可以设置免认证地址。\n *\n * 关于标签:某些币种如XRP充币时同时需要一个充值地址和标签(又名memo/payment_id),标签是一种保证您的充币地址唯一性的数字串,与充币地址成对出现并一一对应。请您务必遵守正确的充值步骤,在提币时输入完整信息,否则将面临丢失币的风险!\n * 对于有标签的币种,如果是OKX用户间的提币,请走内部转账不要走链上提币。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-withdrawal\n */\nexport function postAssetWithdrawal(\n credential: ICredential,\n params: {\n amt: string;\n fee: string;\n dest: string;\n ccy: string;\n chain?: string;\n toAddr: string;\n clientId?: string;\n rcvrInfo?: {\n walletType: string;\n exchId: string;\n rcvrFirstName: string;\n rcvrLastName: string;\n };\n },\n): Promise<{\n code: string;\n msg: string;\n data: Array<{\n amt: string;\n wdId: string;\n ccy: string;\n clientId: string;\n chain: string;\n }>;\n}> {\n return request(credential, 'POST', '/api/v5/asset/withdrawal', params);\n}\n\n/**\n * 获取充值地址信息\n *\n * 获取各个币种的充值地址,包括曾使用过的老地址。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-deposit-address\n */\nexport function getAssetDepositAddress(\n credential: ICredential,\n params: {\n ccy: string;\n },\n): Promise<{\n code: string;\n data: {\n chain: string;\n ctAddr: string;\n ccy: string;\n to: string;\n addr: string;\n verifiedName: string;\n selected: boolean;\n }[];\n msg: string;\n}> {\n return request(credential, 'GET', '/api/v5/asset/deposit-address', params);\n}\n\n/**\n * 获取提币记录\n *\n * 根据币种,提币状态,时间范围获取提币记录,按照时间倒序排列,默认返回100条数据。\n * 支持Websocket订阅,参考 提币信息频道。\n *\n * 限速:6 次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-withdrawal-history\n */\nexport function getAssetWithdrawalHistory(\n credential: ICredential,\n params: {\n ccy?: string;\n wdId?: string;\n clientId?: string;\n txId?: string;\n type?: string;\n state?: string;\n after?: string;\n before?: string;\n limit?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n chain: string;\n fee: string;\n feeCcy: string;\n ccy: string;\n clientId: string;\n amt: string;\n txId: string;\n from: string;\n areaCodeFrom: string;\n to: string;\n areaCodeTo: string;\n state: string;\n ts: string;\n nonTradableAsset: boolean;\n wdId: string;\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/asset/withdrawal-history', params);\n}\n\n/**\n * 获取充值记录\n *\n * 根据币种,充值状态,时间范围获取充值记录,按照时间倒序排列,默认返回 100 条数据。\n * 支持Websocket订阅,参考 充值信息频道。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-deposit-history\n */\nexport function getAssetDepositHistory(\n credential: ICredential,\n params: {\n ccy?: string;\n depId?: string;\n state?: string;\n fromWdId?: string;\n txId?: string;\n type?: string;\n after?: string;\n before?: string;\n limit?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n actualDepBlkConfirm: string;\n amt: string;\n areaCodeFrom: string;\n ccy: string;\n chain: string;\n depId: string;\n from: string;\n fromWdId: string;\n state: string;\n to: string;\n ts: string;\n txId: string;\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/asset/deposit-history', params);\n}\n\n/**\n * 获取资金账户余额\n *\n * 获取资金账户所有资产列表,查询各币种的余额、冻结和可用等信息。\n *\n * 只返回余额大于0的币资产信息。\n *\n * 限速:6次/s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-balance\n */\nexport function getAssetBalances(\n credential: ICredential,\n params: {\n ccy?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n availBal: string;\n bal: string;\n ccy: string;\n frozenBal: string;\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/asset/balances', params);\n}\n\n/**\n * 资金划转\n *\n * 调用时,API Key 需要有交易权限。\n *\n * 支持母账户的资金账户划转到交易账户,母账户到子账户的资金账户和交易账户划转。\n *\n * 子账户默认可转出至母账户,划转到同一母账户下的其他子账户,需要先调用 设置子账户主动转出权限 接口进行授权。\n *\n * 请求失败不代表划转失败,建议以获取资金划转状态接口返回的状态为准。\n *\n * 限速:2 次/s\n * 限速规则:UserID + Currency\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-funds-transfer\n */\nexport function postAssetTransfer(\n credential: ICredential,\n params: {\n ccy: string;\n type?: string;\n amt: string;\n from: string;\n to: string;\n subAcct?: string;\n loanTrans?: boolean;\n omitPosRisk?: string;\n clientId?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n transId: string;\n ccy: string;\n clientId: string;\n from: string;\n amt: string;\n to: string;\n }[];\n}> {\n return request(credential, 'POST', '/api/v5/asset/transfer', params);\n}\n\n/**\n * 查看账户余额\n *\n * 获取交易账户中资金余额信息。\n *\n * 免息额度和折算率都是公共数据,不在账户接口内展示\n *\n * 限速:10次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-balance\n */\nexport function getAccountBalance(\n credential: ICredential,\n params: {\n ccy?: string;\n },\n): Promise<{\n code: string;\n data: {\n adjEq: string;\n borrowFroz: string;\n details: {\n availBal: string;\n availEq: string;\n borrowFroz: string;\n cashBal: string;\n ccy: string;\n crossLiab: string;\n disEq: string;\n eq: string;\n eqUsd: string;\n fixedBal: string;\n frozenBal: string;\n imr: string;\n interest: string;\n isoEq: string;\n isoLiab: string;\n isoUpl: string;\n liab: string;\n maxLoan: string;\n mgnRatio: string;\n mmr: string;\n notionalLever: string;\n ordFrozen: string;\n rewardBal: string;\n spotInUseAmt: string;\n spotIsoBal: string;\n stgyEq: string;\n twap: string;\n uTime: string;\n upl: string;\n uplLiab: string;\n openAvgPx: string;\n spotUpl: string;\n accAvgPx: string;\n totalPnl: string;\n spotBal: string;\n }[];\n imr: string;\n isoEq: string;\n mgnRatio: string;\n mmr: string;\n notionalUsd: string;\n ordFroz: string;\n totalEq: string;\n uTime: string;\n upl: string;\n }[];\n msg: string;\n}> {\n return request(credential, 'GET', '/api/v5/account/balance', params);\n}\n\n/**\n * 查看持仓信息\n *\n * 获取该账户下拥有实际持仓的信息。账户为买卖模式会显示净持仓(net),账户为开平仓模式下会分别返回开多(long)或开空(short)的仓位。按照仓位创建时间倒序排列。\n *\n * 如果该 instId 拥有过仓位且当前持仓量为0,传 instId 时,如果当前存在有效的posId,会返回仓位信息,如果当前不存在有效的 posId 时,不会返回仓位信息;不传 instId 时,仓位信息不返回。\n *\n * 逐仓交易设置中,如果设置为自主划转模式,逐仓转入保证金后,会生成一个持仓量为0的仓位\n *\n * 限速:10次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-positions\n */\nexport function getAccountPositions(\n credential: ICredential,\n params: {\n instType?: string;\n instId?: string;\n posId?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n adl: string;\n availPos: string;\n avgPx: string;\n cTime: string;\n ccy: string;\n deltaBS: string;\n deltaPA: string;\n gammaBS: string;\n gammaPA: string;\n imr: string;\n instId: string;\n instType: string;\n interest: string;\n idxPx: string;\n last: string;\n usdPx: string;\n bePx: string;\n lever: string;\n liab: string;\n liabCcy: string;\n liqPx: string;\n markPx: string;\n margin: string;\n mgnMode: string;\n mgnRatio: string;\n mmr: string;\n notionalUsd: string;\n optVal: string;\n pTime: string;\n pos: string;\n posCcy: string;\n posId: string;\n posSide: string;\n spotInUseAmt: string;\n spotInUseCcy: string;\n thetaBS: string;\n thetaPA: string;\n tradeId: string;\n bizRefId: string;\n bizRefType: string;\n quoteBal: string;\n baseBal: string;\n baseBorrowed: string;\n baseInterest: string;\n quoteBorrowed: string;\n quoteInterest: string;\n uTime: string;\n upl: string;\n uplLastPx: string;\n uplRatio: string;\n uplRatioLastPx: string;\n vegaBS: string;\n vegaPA: string;\n realizedPnl: string;\n pnl: string;\n fee: string;\n fundingFee: string;\n liqPenalty: string;\n closeOrderAlgo: {\n algoId: string;\n slTriggerPx: string;\n slTriggerPxType: string;\n tpTriggerPx: string;\n tpTriggerPxType: string;\n closeFraction: string;\n }[];\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/account/positions', params);\n}\n\n/**\n * 获取最大可下单数量\n *\n * 获取最大可买卖/开仓数量,可对应下单时的 sz 字段\n *\n * 限速:20次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-maximum-tradable-size\n */\nexport function getAccountMaxSize(\n credential: ICredential,\n params: {\n instId: string;\n tdMode: string;\n ccy?: string;\n px?: string;\n leverage?: string;\n tradeQuoteCcy?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: Array<{\n instId: string;\n ccy: string;\n maxBuy: string;\n maxSell: string;\n }>;\n}> {\n return request(credential, 'GET', '/api/v5/account/max-size', params);\n}\n\n/**\n * 赚币\n * GET / 查看项目\n *\n * 限速:3次/s\n * 限速规则:UserID\n */\nexport function getFinanceStakingDeFiOffers(\n credential: ICredential,\n params: {\n productId?: string;\n protocolType?: string;\n ccy?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n ccy: string;\n productId: string;\n protocol: string;\n protocolType: string;\n term: string;\n apy: string;\n earlyRedeem: boolean;\n investData: {\n ccy: string;\n bal: string;\n minAmt: string;\n maxAmt: string;\n }[];\n earningData: {\n ccy: string;\n earningType: string;\n }[];\n state: string;\n earningCcy?: string[];\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/finance/staking-defi/offers', params);\n}\n\n/**\n * 赚币\n * GET / 查看活跃订单\n *\n * 限速:3次/s\n * 限速规则:UserID\n */\nexport function getFinanceStakingDeFiOrdersActive(\n credential: ICredential,\n params: {\n productId?: string;\n protocolType?: string;\n ccy?: string;\n state?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n ordId: string;\n state: string;\n ccy: string;\n protocol: string;\n protocolType: string;\n term: string;\n apy: string;\n investData: {\n ccy: string;\n amt: string;\n minAmt?: string;\n maxAmt?: string;\n }[];\n earningData: {\n ccy: string;\n earningType: string;\n earnings: string;\n }[];\n purchasedTime: string;\n estSettlementTime: string;\n cancelRedemptionDeadline: string;\n tag: string;\n earningCcy?: string[];\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/finance/staking-defi/orders-active', params);\n}\n\n/**\n * 下单\n *\n * 只有当您的账户有足够的资金才能下单。\n *\n * 限速:60次/2s\n *\n * 跟单交易带单产品的限速:4次/2s\n *\n * 限速规则(期权以外):UserID + Instrument ID\n *\n * 限速规则(只限期权):UserID + Instrument Family\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-post-place-order\n */\nexport function postTradeOrder(\n credential: ICredential,\n params: {\n instId: string;\n tdMode: string;\n ccy?: string;\n clOrdId?: string;\n tag?: string;\n side: string;\n posSide?: string;\n ordType: string;\n sz: string;\n px?: string;\n pxUsd?: string;\n pxVol?: string;\n reduceOnly?: string;\n tgtCcy?: string;\n banAmend?: string;\n quickMgnType?: string;\n stpId?: string;\n stpMode?: string;\n attachAlgoOrds?: Array<{\n attachAlgoClOrdId?: string;\n tpTriggerPx?: string;\n tpOrdPx?: string;\n tpOrdKind?: string;\n slTriggerPx?: string;\n slOrdPx?: string;\n tpTriggerPxType?: string;\n slTriggerPxType?: string;\n sz?: string;\n amendPxOnTriggerType?: string;\n }>;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n clOrdId: string;\n ordId: string;\n tag: string;\n sCode: string;\n sMsg: string;\n }[];\n inTime: string;\n outTime: string;\n}> {\n return request(credential, 'POST', '/api/v5/trade/order', params);\n}\n\n/**\n * 修改订单\n *\n * 修改当前未成交的挂单\n *\n * 限速:60次/2s\n *\n * 跟单交易带单员带单产品的限速:4个/2s\n *\n * 限速规则:User ID + Instrument ID\n *\n * 权限:交易\n *\n * 该接口限速同时受到 子账户限速 及 基于成交比率的子账户限速 限速规则的影响。\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-post-amend-order\n */\nexport function postTradeAmendOrder(\n credential: ICredential,\n params: {\n instId: string;\n cxIOnFail?: boolean;\n ordId?: string;\n clOrdId?: string;\n reqId?: string;\n newSz?: string;\n newPx?: string;\n newPxUsd?: string;\n newPxVol?: string;\n attachAlgoOrds?: Array<{\n attachAlgoId?: string;\n attachAlgoClOrdId?: string;\n newTpTriggerPx?: string;\n newTpOrdPx?: string;\n newTpOrdKind?: string;\n newSlTriggerPx?: string;\n newSlOrdPx?: string;\n newTpTriggerPxType?: string;\n newSlTriggerPxType?: string;\n sz?: string;\n amendPxOnTriggerType?: string;\n }>;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n clOrdId: string;\n ordId: string;\n ts: string;\n reqId: string;\n sCode: string;\n sMsg: string;\n }[];\n inTime: string;\n outTime: string;\n}> {\n return request(credential, 'POST', '/api/v5/trade/amend-order', params);\n}\n\n/**\n * 获取未成交订单列表\n *\n * 获取当前账户下所有未成交订单信息\n *\n * 限速:60次/2s\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-get-order-list\n */\nexport function getTradeOrdersPending(\n credential: ICredential,\n params: {\n instType?: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n ordType?: string;\n state?: string;\n after?: string;\n before?: string;\n limit?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n accFillSz: string;\n avgPx: string;\n cTime: string;\n category: string;\n ccy: string;\n clOrdId: string;\n fee: string;\n feeCcy: string;\n fillPx: string;\n fillSz: string;\n fillTime: string;\n instId: string;\n instType: string;\n lever: string;\n ordId: string;\n ordType: string;\n pnl: string;\n posSide: string;\n px: string;\n pxUsd: string;\n pxVol: string;\n pxType: string;\n rebate: string;\n rebateCcy: string;\n side: string;\n attachAlgoClOrdId: string;\n slOrdPx: string;\n slTriggerPx: string;\n slTriggerPxType: string;\n attachAlgoOrds: unknown[];\n source: string;\n state: string;\n stpId: string;\n stpMode: string;\n sz: string;\n tag: string;\n tdMode: string;\n tgtCcy: string;\n tpOrdPx: string;\n tpTriggerPx: string;\n tpTriggerPxType: string;\n tradeId: string;\n reduceOnly: string;\n quickMgnType: string;\n algoClOrdId: string;\n algoId: string;\n isTpLimit: string;\n uTime: string;\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/trade/orders-pending', params);\n}\n\n/**\n * 获取历史订单记录(近七天)\n *\n * 获取最近7天挂单,且完成的订单数据,包括7天以前挂单,但近7天才成交的订单数据。按照订单创建时间倒序排序。\n *\n * 已经撤销的未成交单 只保留2小时\n * 限速:40次/2s\n * 限速规则:User ID\n */\nexport function getTradeOrdersHistory(\n credential: ICredential,\n params: {\n instType: string;\n uly?: string;\n instFamily?: string;\n instId?: string;\n ordType?: string;\n state?: string;\n category?: string;\n after?: string;\n before?: string;\n begin?: string;\n end?: string;\n limit?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: Array<{\n instType: string;\n instId: string;\n tgtCcy: string;\n ccy: string;\n ordId: string;\n clOrdId: string;\n tag: string;\n px: string;\n pxUsd: string;\n pxVol: string;\n pxType: string;\n sz: string;\n ordType: string;\n side: string;\n posSide: string;\n tdMode: string;\n accFillSz: string;\n fillPx: string;\n tradeId: string;\n fillSz: string;\n fillTime: string;\n avgPx: string;\n state: string;\n lever: string;\n attachAlgoClOrdId: string;\n tpTriggerPx: string;\n tpTriggerPxType: string;\n tpOrdPx: string;\n slTriggerPx: string;\n slTriggerPxType: string;\n slOrdPx: string;\n attachAlgoOrds: unknown[];\n linkedAlgoOrd: unknown[];\n stpId: string;\n stpMode: string;\n feeCcy: string;\n fee: string;\n rebateCcy: string;\n source: string;\n rebate: string;\n pnl: string;\n category: string;\n reduceOnly: string;\n cancelSource: string;\n cancelSourceReason: string;\n algoClOrdId: string;\n algoId: string;\n isTpLimit: string;\n uTime: string;\n cTime: string;\n tradeQuoteCcy: string;\n }>;\n}> {\n return request(credential, 'GET', '/api/v5/trade/orders-history', params);\n}\n\n/**\n * 撤单\n *\n * 撤销之前下的未完成订单。\n *\n * 限速:60次/2s\n *\n * 限速规则(期权以外):UserID + Instrument ID\n *\n * 限速规则(只限期权):UserID + Instrument Family\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-trade-post-cancel-order\n */\nexport function postTradeCancelOrder(\n credential: ICredential,\n params: {\n instId: string;\n ordId?: string;\n clOrdId?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n clOrdId: string;\n ordId: string;\n sCode: string;\n sMsg: string;\n }[];\n inTime: string;\n outTime: string;\n}> {\n return request(credential, 'POST', '/api/v5/trade/cancel-order', params);\n}\n\n/**\n * 查看子账户列表\n *\n * 仅适用于母账户。\n *\n * 限速:2次/2s\n *\n * 限速规则:UserID\n */\nexport function getSubAccountList(\n credential: ICredential,\n params?: {\n enable?: string;\n subAct?: string;\n after?: string;\n before?: string;\n limit?: string;\n },\n): Promise<{\n data: {\n type: string;\n enable: string;\n subAcct: string;\n uid: string;\n label: string;\n mobile: string;\n gAuth: boolean;\n frozenFunc: string[];\n canTransOut: boolean;\n ts: string;\n }[];\n code: string;\n msg: string;\n}> {\n return request(credential, 'GET', '/api/v5/users/subaccount/list', params);\n}\n\n/**\n * 设置子账户主动转出权限\n *\n * 设置子账户转出权限(仅适用于母账户),默认可转出至母账户。\n *\n * 限速:1次/s\n *\n * 限速规则:UserID\n */\nexport function postSetSubAccountTransferOut(\n credential: ICredential,\n params: {\n subAcct: string;\n canTransOut: boolean;\n },\n): Promise<{\n subAcct: string;\n canTransOut: boolean;\n}> {\n return request(credential, 'POST', '/api/v5/users/subaccount/set-transfer-out', params);\n}\n\n/**\n * 获取资金划转状态\n *\n * 获取最近2个星期内的资金划转状态数据\n *\n * 限速:10 次/s\n *\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-funds-transfer-state\n */\nexport function getAssetTransferState(\n credential: ICredential,\n params: {\n transId?: string;\n clientId?: string;\n type?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n transId: string;\n clientId: string;\n ccy: string;\n amt: string;\n type: string;\n from: string;\n to: string;\n subAcct: string;\n // success | pending | failed\n state: string;\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/asset/transfer-state', params);\n}\n\n/**\n * 获取币种列表\n *\n * 获取当前用户KYC实体支持的币种列表。\n *\n * 限速:6 次/s\n *\n * 限速规则:UserID\n *\n * https://www.okx.com/docs-v5/zh/#funding-account-rest-api-get-currencies\n */\nexport function getAssetCurrencies(\n credential: ICredential,\n params?: {\n ccy?: string;\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n ccy: string;\n name: string;\n chain: string;\n canWd: boolean;\n canInternal: boolean;\n minWd: string;\n maxWd: string;\n wdTickSz: string;\n wdQuota: string;\n usedWdQuota: string;\n minFee: string;\n maxFee: string;\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/asset/currencies', params);\n}\n\n/**\n * GET / 借贷信息\n * 限速:5次/2s\n * 限速规则:User ID\n * 权限:读取\n * HTTP请求\n *\n * https://www.okx.com/docs-v5/zh/#financial-product-flexible-loan-get-loan-info\n */\nexport function getFlexibleLoanInfo(credential: ICredential): Promise<{\n code: string;\n data: {\n collateralData: {\n amt: string;\n ccy: string;\n }[];\n collateralNotionalUsd: string;\n curLTV: string;\n liqLTV: string;\n loanData: {\n amt: string;\n ccy: string;\n }[];\n loanNotionalUsd: string;\n marginCallLTV: string;\n riskWarningData: {\n instId: string;\n liqPx: string;\n };\n }[];\n msg: string;\n}> {\n return request(credential, 'GET', '/api/v5/finance/flexible-loan/loan-info');\n}\n\n/**\n * 账单流水查询(近七天)\n *\n *\n * 限速:5次/s\n *\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-bills-details-last-7-days\n */\nexport function getAccountBills(\n credential: ICredential,\n params?: {\n instType?: string;\n instId?: string;\n ccy?: string;\n mgnMode?: 'isolated' | 'cross';\n ctType?: 'linear' | 'inverse';\n type?: AccountBillType;\n subType?: string;\n after?: string; //请求此id之前(更旧的数据)的分页内容,传的值为对应接口的billId\n before?: string; //请求此id之后(更新的数据)的分页内容,传的值为对应接口的billId\n begin?: string; //筛选的开始时间戳 ts,Unix 时间戳为毫秒数格式,如 1597026383085\n end?: string;\n limit?: string; //分页返回的结果集数量,最大为100,不填默认返回100条\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n instType: string;\n billId: string;\n type: string;\n subType: string;\n ts: string;\n balChg: string;\n posBalChg: string;\n bal: string;\n posBal: string;\n sz: string;\n px: string;\n ccy: string;\n pnl: string;\n fee: string;\n mgnMode: 'isolated' | 'cross' | 'cash' | '';\n instId: string;\n ordId: string;\n execType: string;\n from: string;\n to: string;\n notes: string;\n interest: string;\n tag: string;\n fillTime: string;\n tradeId: string;\n clOrdId: string;\n fillIdxPx: string;\n fillMarkPx: string;\n fillPxVol: string;\n fillPxUsd: string;\n fillMarkVol: string;\n fillFwdPx: string;\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/account/bills', params);\n}\n\n/**\n * 账单流水查询(近三个月)\n *\n *\n * 限速:5次/2s\n *\n *\n * https://www.okx.com/docs-v5/zh/#trading-account-rest-api-get-bills-details-last-3-months\n */\nexport function getAccountBillsArchive(\n credential: ICredential,\n params?: {\n instType?: string;\n instId?: string;\n ccy?: string;\n mgnMode?: 'isolated' | 'cross';\n ctType?: 'linear' | 'inverse';\n type?: AccountBillType;\n subType?: string;\n after?: string; //请求此id之前(更旧的数据)的分页内容,传的值为对应接口的billId\n before?: string; //请求此id之后(更新的数据)的分页内容,传的值为对应接口的billId\n begin?: string; //筛选的开始时间戳 ts,Unix 时间戳为毫秒数格式,如 1597026383085\n end?: string;\n limit?: string; //分页返回的结果集数量,最大为100,不填默认返回100条\n },\n): Promise<{\n code: string;\n msg: string;\n data: {\n instType: string;\n billId: string;\n type: string;\n subType: string;\n ts: string;\n balChg: string;\n posBalChg: string;\n bal: string;\n posBal: string;\n sz: string;\n px: string;\n ccy: string;\n pnl: string;\n fee: string;\n mgnMode: 'isolated' | 'cross' | 'cash' | '';\n instId: string;\n ordId: string;\n execType: string;\n from: string;\n to: string;\n notes: string;\n interest: string;\n tag: string;\n fillTime: string;\n tradeId: string;\n clOrdId: string;\n fillIdxPx: string;\n fillMarkPx: string;\n fillPxVol: string;\n fillPxUsd: string;\n fillMarkVol: string;\n fillFwdPx: string;\n }[];\n}> {\n return request(credential, 'GET', '/api/v5/account/bills-archive', params);\n}\n\n/**\n * POST / 网格策略委托下单\n * 限速:20次/2s\n * 限速规则:User ID + Instrument ID\n * 权限:交易\n * HTTP请求\n *\n * https://www.okx.com/docs-v5/zh/?language=shell#order-book-trading-grid-trading-post-place-grid-algo-order\n */\nexport function postGridAlgoOrder(\n credential: ICredential,\n params: {\n instId: string;\n algoOrdType: string;\n maxPx: string;\n minPx: string;\n gridNum: string;\n runType?: string;\n tpTriggerPx?: string;\n slTriggerPx?: string;\n algoClOrdId?: string;\n tag?: string;\n profitSharingRatio?: string;\n triggerParams?: {\n triggerAction: string;\n triggerStrategy: string;\n timeframe?: string;\n thold?: string;\n triggerCond?: string;\n timePeriod?: string;\n delaySeconds?: string;\n triggerPx?: string;\n stopType?: string;\n }[];\n } & Grid,\n): Promise<{\n code: string;\n msg: string;\n data: {\n algoId: string;\n algoClOrdId: string;\n sCode: string;\n sMsg: string;\n tag: string;\n }[];\n}> {\n return request(credential, 'POST', '/api/v5/tradingBot/grid/order-algo', params);\n}\n\n/**\n * GET / 获取未完成网格策略委托单列表\n * 限速:20次/2s\n * 限速规则:User ID\n * 权限:读取\n * HTTP请求\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-grid-trading-get-grid-algo-order-list\n */\nexport function getGridOrdersAlgoPending(\n credential: ICredential,\n param: {\n algoOrdType: 'grid' | 'contract_grid';\n algoId?: string;\n instId?: string;\n instType?: string;\n after?: string;\n before?: string;\n limit?: string;\n },\n): Promise<{\n code: string;\n data: {\n algoId: string;\n algoClOrdId: string;\n instType: string;\n instId: string;\n cTime: string;\n uTime: string;\n algoOrdType: 'grid' | 'contract_grid';\n state: 'starting' | 'running' | 'stopping' | 'pending_signal' | 'no_close_position';\n rebateTrans: {\n rebate: string;\n rebateCcy: string;\n }[];\n triggerParams: {\n triggerAction: string;\n triggerStrategy: string;\n delaySeconds: string;\n triggerTime: string;\n triggerType: string;\n timeframe: string;\n thold: string;\n triggerCond: 'cross_up' | 'cross_down' | 'above' | 'below' | 'cross';\n timePeriod: string;\n triggerPx: string;\n stopType: string;\n }[];\n maxPx: string;\n minPx: string;\n gridNum: string;\n runType: '1' | '2';\n tpTriggerPx: string;\n slTriggerPx: string;\n arbitrageNum: string;\n totalPnl: string;\n pnlRatio: string;\n investment: string;\n gridProfit: string;\n floatProfit: string;\n cancelType: '0' | '1' | '2' | '3' | '4' | '5' | '6';\n stopType: '1' | '2';\n quoteSz: string;\n baseSz: SpotGrid;\n direction: string;\n basePos: string;\n sz: string;\n lever: string;\n actualLever: string;\n liqPx: string;\n uly: string;\n instFamily: string;\n ordFrozen: string;\n availEq: string;\n tag: string;\n profitSharingRatio: string;\n copyType: string;\n fee: string;\n fundingFee: string;\n tradeQuoteCcy: string;\n }[];\n msg: string;\n}> {\n return request(credential, 'GET', '/api/v5/tradingBot/grid/orders-algo-pending', param);\n}\n\n/**\n * GET / 获取网格策略委托持仓\n * 限速:20次/2s\n * 限速规则:User ID\n * 权限:读取\n * HTTP请求\n *\n * https://www.okx.com/docs-v5/zh/#order-book-trading-grid-trading-get-grid-algo-order-positions\n */\nexport function getGridPositions(\n credential: ICredential,\n param: {\n algoOrdType: 'contract_grid';\n algoId: string;\n },\n): Promise<{\n code: string;\n data: {\n algoId: string;\n algoClOrdId: string;\n instType: string;\n instId: string;\n cTime: string;\n uTime: string;\n avgPx: string;\n ccy: string;\n lever: string;\n liqPx: string;\n posSide: string;\n pos: string;\n mgnMode: string;\n mgnRatio: string;\n imr: string;\n mmr: string;\n upl: string;\n uplRatio: string;\n last: string;\n notionalUsd: string;\n adl: string;\n markPx: string;\n }[];\n msg: string;\n}> {\n return request(credential, 'GET', '/api/v5/tradingBot/grid/positions', param);\n}\n\ntype SpotGrid = {\n quoteSz?: string;\n baseSz?: string;\n tradeQuoteCcy?: string;\n};\n\ntype SwapGrid = {\n sz: string;\n direction: string;\n lever: string;\n basePos?: string;\n tpRatio?: string;\n slRatio?: string;\n};\n\ntype Grid = SpotGrid | SwapGrid;\n\ntype AccountBillType =\n | '1'\n | '2'\n | '3'\n | '4'\n | '5'\n | '6'\n | '7'\n | '8'\n | '9'\n | '10'\n | '11'\n | '12'\n | '13'\n | '14'\n | '15'\n | '16'\n | '22'\n | '24'\n | '26'\n | '27'\n | '28'\n | '29'\n | '30'\n | '32'\n | '33'\n | '34'\n | '250'\n | '251';\n"]}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import './account';
|
|
2
|
+
import './api-service';
|
|
2
3
|
import './interest_rate';
|
|
3
|
-
import './legacy_index';
|
|
4
4
|
import './loan-account';
|
|
5
|
+
import './market-order';
|
|
5
6
|
import './ohlc';
|
|
6
7
|
import './order';
|
|
8
|
+
import './order-actions';
|
|
7
9
|
import './quote';
|
|
8
|
-
import './trade';
|
|
9
10
|
import './services';
|
|
10
11
|
import './strategy-account';
|
|
11
|
-
import './
|
|
12
|
-
import './
|
|
12
|
+
import './trade';
|
|
13
|
+
import './transfer';
|
|
13
14
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAC;AACnB,OAAO,iBAAiB,CAAC;AACzB,OAAO,gBAAgB,CAAC;AACxB,OAAO,gBAAgB,CAAC;AACxB,OAAO,QAAQ,CAAC;AAChB,OAAO,SAAS,CAAC;AACjB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,CAAC;AACnB,OAAO,eAAe,CAAC;AACvB,OAAO,iBAAiB,CAAC;AACzB,OAAO,gBAAgB,CAAC;AACxB,OAAO,gBAAgB,CAAC;AACxB,OAAO,QAAQ,CAAC;AAChB,OAAO,SAAS,CAAC;AACjB,OAAO,iBAAiB,CAAC;AACzB,OAAO,SAAS,CAAC;AACjB,OAAO,YAAY,CAAC;AACpB,OAAO,oBAAoB,CAAC;AAC5B,OAAO,SAAS,CAAC;AACjB,OAAO,YAAY,CAAC"}
|
package/lib/index.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
require("./account");
|
|
4
|
+
require("./api-service");
|
|
4
5
|
require("./interest_rate");
|
|
5
|
-
require("./legacy_index");
|
|
6
6
|
require("./loan-account");
|
|
7
|
+
require("./market-order");
|
|
7
8
|
require("./ohlc");
|
|
8
9
|
require("./order");
|
|
10
|
+
require("./order-actions");
|
|
9
11
|
require("./quote");
|
|
10
|
-
require("./trade");
|
|
11
12
|
require("./services");
|
|
12
13
|
require("./strategy-account");
|
|
13
|
-
require("./
|
|
14
|
-
require("./
|
|
14
|
+
require("./trade");
|
|
15
|
+
require("./transfer");
|
|
15
16
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,qBAAmB;AACnB,2BAAyB;AACzB,0BAAwB;AACxB,0BAAwB;AACxB,kBAAgB;AAChB,mBAAiB;AACjB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,qBAAmB;AACnB,yBAAuB;AACvB,2BAAyB;AACzB,0BAAwB;AACxB,0BAAwB;AACxB,kBAAgB;AAChB,mBAAiB;AACjB,2BAAyB;AACzB,mBAAiB;AACjB,sBAAoB;AACpB,8BAA4B;AAC5B,mBAAiB;AACjB,sBAAoB","sourcesContent":["import './account';\nimport './api-service';\nimport './interest_rate';\nimport './loan-account';\nimport './market-order';\nimport './ohlc';\nimport './order';\nimport './order-actions';\nimport './quote';\nimport './services';\nimport './strategy-account';\nimport './trade';\nimport './transfer';\n"]}
|
package/lib/loan-account.js
CHANGED
|
@@ -9,8 +9,9 @@ const api_1 = require("./api");
|
|
|
9
9
|
(0, rxjs_1.defer)(async () => {
|
|
10
10
|
const uid = await (0, rxjs_1.firstValueFrom)(account_1.accountUid$);
|
|
11
11
|
const loanAccountId = `okx/${uid}/loan/USDT`;
|
|
12
|
+
const credential = (0, api_1.getDefaultCredential)();
|
|
12
13
|
(0, data_account_1.provideAccountInfoService)(protocol_1.Terminal.fromNodeEnv(), loanAccountId, async () => {
|
|
13
|
-
const res = await api_1.
|
|
14
|
+
const res = await (0, api_1.getFlexibleLoanInfo)(credential);
|
|
14
15
|
const data = res.data[0];
|
|
15
16
|
const positions = [];
|
|
16
17
|
for (const loan of data.loanData) {
|
package/lib/loan-account.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loan-account.js","sourceRoot":"","sources":["../src/loan-account.ts"],"names":[],"mappings":";;AAAA,uDAA4E;AAC5E,+CAA4C;AAC5C,yCAA2C;AAC3C,+BAA6C;AAC7C,uCAAwC;AACxC,+
|
|
1
|
+
{"version":3,"file":"loan-account.js","sourceRoot":"","sources":["../src/loan-account.ts"],"names":[],"mappings":";;AAAA,uDAA4E;AAC5E,+CAA4C;AAC5C,yCAA2C;AAC3C,+BAA6C;AAC7C,uCAAwC;AACxC,+BAAkE;AAElE,IAAA,YAAK,EAAC,KAAK,IAAI,EAAE;IACf,MAAM,GAAG,GAAG,MAAM,IAAA,qBAAc,EAAC,qBAAW,CAAC,CAAC;IAC9C,MAAM,aAAa,GAAG,OAAO,GAAG,YAAY,CAAC;IAC7C,MAAM,UAAU,GAAG,IAAA,0BAAoB,GAAE,CAAC;IAE1C,IAAA,wCAAyB,EACvB,mBAAQ,CAAC,WAAW,EAAE,EACtB,aAAa,EACb,KAAK,IAAI,EAAE;QACT,MAAM,GAAG,GAAG,MAAM,IAAA,yBAAmB,EAAC,UAAU,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEzB,MAAM,SAAS,GAAgB,EAAE,CAAC;QAClC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE;YAChC,SAAS,CAAC,IAAI,CAAC;gBACb,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,QAAQ,IAAI,CAAC,GAAG,OAAO;gBACnC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG;gBACjB,WAAW,EAAE,CAAC,IAAI,CAAC,GAAG;gBACtB,WAAW,EAAE,IAAA,kBAAU,EAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;gBACzC,SAAS,EAAE,OAAO;gBAClB,cAAc,EAAE,CAAC;gBACjB,cAAc,EAAE,CAAC;gBACjB,eAAe,EAAE,CAAC;gBAClB,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;SACJ;QACD,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE;YAC5C,SAAS,CAAC,IAAI,CAAC;gBACb,aAAa,EAAE,KAAK;gBACpB,UAAU,EAAE,QAAQ,UAAU,CAAC,GAAG,OAAO;gBACzC,MAAM,EAAE,CAAC,UAAU,CAAC,GAAG;gBACvB,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG;gBAC5B,WAAW,EAAE,IAAA,kBAAU,EAAC,YAAY,EAAE,UAAU,CAAC,GAAG,CAAC;gBACrD,SAAS,EAAE,MAAM;gBACjB,cAAc,EAAE,CAAC;gBACjB,cAAc,EAAE,CAAC;gBACjB,eAAe,EAAE,CAAC;gBAClB,SAAS,EAAE,CAAC;aACb,CAAC,CAAC;SACJ;QACD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;QACnE,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC;QAClD,OAAO;YACL,KAAK,EAAE;gBACL,QAAQ,EAAE,MAAM;gBAChB,MAAM;gBACN,IAAI;aACL;YACD,SAAS;SACV,CAAC;IACJ,CAAC,EACD;QACE,qBAAqB,EAAE,IAAI;KAC5B,CACF,CAAC;AACJ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC","sourcesContent":["import { IPosition, provideAccountInfoService } from '@yuants/data-account';\nimport { Terminal } from '@yuants/protocol';\nimport { encodePath } from '@yuants/utils';\nimport { defer, firstValueFrom } from 'rxjs';\nimport { accountUid$ } from './account';\nimport { getDefaultCredential, getFlexibleLoanInfo } from './api';\n\ndefer(async () => {\n const uid = await firstValueFrom(accountUid$);\n const loanAccountId = `okx/${uid}/loan/USDT`;\n const credential = getDefaultCredential();\n\n provideAccountInfoService(\n Terminal.fromNodeEnv(),\n loanAccountId,\n async () => {\n const res = await getFlexibleLoanInfo(credential);\n const data = res.data[0];\n\n const positions: IPosition[] = [];\n for (const loan of data.loanData) {\n positions.push({\n datasource_id: 'OKX',\n product_id: `SPOT/${loan.ccy}-USDT`,\n volume: +loan.amt,\n free_volume: +loan.amt,\n position_id: encodePath('loan', loan.ccy),\n direction: 'SHORT',\n position_price: 0,\n closable_price: 0,\n floating_profit: 0,\n valuation: 0,\n });\n }\n for (const collateral of data.collateralData) {\n positions.push({\n datasource_id: 'OKX',\n product_id: `SPOT/${collateral.ccy}-USDT`,\n volume: +collateral.amt,\n free_volume: +collateral.amt,\n position_id: encodePath('collateral', collateral.ccy),\n direction: 'LONG',\n position_price: 0,\n closable_price: 0,\n floating_profit: 0,\n valuation: 0,\n });\n }\n const equity = +data.collateralNotionalUsd - +data.loanNotionalUsd;\n const free = equity - +data.collateralNotionalUsd;\n return {\n money: {\n currency: 'USDT',\n equity,\n free,\n },\n positions,\n };\n },\n {\n auto_refresh_interval: 1000,\n },\n );\n}).subscribe();\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market-order.d.ts","sourceRoot":"","sources":["../src/market-order.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"market-order.d.ts","sourceRoot":"","sources":["../src/market-order.ts"],"names":[],"mappings":"AAqCA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;IAC/E,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;IAC/E,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB"}
|
package/lib/market-order.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const protocol_1 = require("@yuants/protocol");
|
|
4
4
|
const utils_1 = require("@yuants/utils");
|
|
5
|
-
const ws_1 = require("./ws");
|
|
6
5
|
const rxjs_1 = require("rxjs");
|
|
6
|
+
const ws_1 = require("./ws");
|
|
7
7
|
const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
8
8
|
terminal.server.provideService('QueryMarketBooks', {
|
|
9
9
|
required: ['product_id', 'datasource_id'],
|
package/lib/market-order.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market-order.js","sourceRoot":"","sources":["../src/market-order.ts"],"names":[],"mappings":";;AAAA,+CAA4C;
|
|
1
|
+
{"version":3,"file":"market-order.js","sourceRoot":"","sources":["../src/market-order.ts"],"names":[],"mappings":"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","sourcesContent":["import { Terminal } from '@yuants/protocol';\nimport { decodePath, formatTime } from '@yuants/utils';\nimport { map, tap } from 'rxjs';\nimport { useMarketBooks } from './ws';\n\nconst terminal = Terminal.fromNodeEnv();\n\nterminal.server.provideService(\n 'QueryMarketBooks',\n {\n required: ['product_id', 'datasource_id'],\n properties: {\n product_id: { type: 'string' },\n datasource_id: { type: 'string', const: 'OKX' },\n },\n },\n async (msg) => {\n const { sz = '1', product_id } = msg.req as { sz?: string; product_id: string };\n const books = mapProductIdToMarketBooks.get(product_id);\n\n if (books) {\n return {\n res: {\n code: 0,\n message: 'OK',\n data: {\n seqId: books.seqId,\n bids: Array.from(books.bids.values() ?? []).sort((a, b) => +b[0] - +a[0]),\n asks: Array.from(books?.asks.values() ?? []).sort((a, b) => +a[0] - +b[0]),\n },\n },\n };\n }\n return { res: { code: 500, message: 'Server Error' } };\n },\n);\n\nexport interface IWSOrderBook {\n asks: [price: string, volume: string, abandon: string, order_number: string][];\n bids: [price: string, volume: string, abandon: string, order_number: string][];\n ts: string;\n prevSeqId: number;\n seqId: number;\n checksum: number;\n}\n\nconst mapProductIdToMarketBooks = new Map<\n string,\n {\n asks: Map<string, [price: string, volume: string, abandon: string, order_number: string]>;\n bids: Map<string, [price: string, volume: string, abandon: string, order_number: string]>;\n seqId: number;\n }\n>();\n\nterminal.channel.publishChannel('MarketBooks', { pattern: `^OKX/` }, (id) => {\n const [datasource_id, product_id] = decodePath(id);\n const [, instId] = decodePath(product_id);\n console.info(formatTime(Date.now()), `SubscribeMarketBooks`, id);\n\n return useMarketBooks('books', instId).pipe(\n map((data) => {\n return data[0];\n }),\n tap({\n next: (v) => {\n if (!mapProductIdToMarketBooks.get(product_id)) {\n mapProductIdToMarketBooks.set(product_id, {\n seqId: v.seqId,\n asks: new Map<string, [price: string, volume: string, abandon: string, order_number: string]>(),\n bids: new Map<string, [price: string, volume: string, abandon: string, order_number: string]>(),\n });\n }\n v.asks.map((ask) => mapProductIdToMarketBooks.get(product_id)?.asks.set(ask[0], ask));\n v.bids.map((bid) => mapProductIdToMarketBooks.get(product_id)?.bids.set(bid[0], bid));\n },\n finalize: () => {\n mapProductIdToMarketBooks.delete(product_id);\n },\n }),\n );\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-actions.d.ts","sourceRoot":"","sources":["../src/order-actions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const protocol_1 = require("@yuants/protocol");
|
|
4
|
+
const utils_1 = require("@yuants/utils");
|
|
5
|
+
const rxjs_1 = require("rxjs");
|
|
6
|
+
const account_1 = require("./account");
|
|
7
|
+
const api_1 = require("./api");
|
|
8
|
+
const product_1 = require("./product");
|
|
9
|
+
const quote_1 = require("./quote");
|
|
10
|
+
const terminal = protocol_1.Terminal.fromNodeEnv();
|
|
11
|
+
const credential = (0, api_1.getDefaultCredential)();
|
|
12
|
+
(0, rxjs_1.defer)(async () => {
|
|
13
|
+
const tradingAccountId = await (0, rxjs_1.firstValueFrom)(account_1.tradingAccountId$);
|
|
14
|
+
terminal.server.provideService('SubmitOrder', {
|
|
15
|
+
required: ['account_id'],
|
|
16
|
+
properties: {
|
|
17
|
+
account_id: { const: tradingAccountId },
|
|
18
|
+
},
|
|
19
|
+
}, async (msg) => {
|
|
20
|
+
var _a, _b, _c;
|
|
21
|
+
console.info((0, utils_1.formatTime)(Date.now()), 'SubmitOrder', JSON.stringify(msg));
|
|
22
|
+
const order = msg.req;
|
|
23
|
+
const [instType, instId] = (0, utils_1.decodePath)(order.product_id);
|
|
24
|
+
const mapOrderDirectionToSide = (direction) => {
|
|
25
|
+
switch (direction) {
|
|
26
|
+
case 'OPEN_LONG':
|
|
27
|
+
case 'CLOSE_SHORT':
|
|
28
|
+
return 'buy';
|
|
29
|
+
case 'OPEN_SHORT':
|
|
30
|
+
case 'CLOSE_LONG':
|
|
31
|
+
return 'sell';
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`Unknown direction: ${direction}`);
|
|
34
|
+
};
|
|
35
|
+
const mapOrderDirectionToPosSide = (direction) => {
|
|
36
|
+
switch (direction) {
|
|
37
|
+
case 'OPEN_LONG':
|
|
38
|
+
case 'CLOSE_LONG':
|
|
39
|
+
return 'long';
|
|
40
|
+
case 'CLOSE_SHORT':
|
|
41
|
+
case 'OPEN_SHORT':
|
|
42
|
+
return 'short';
|
|
43
|
+
}
|
|
44
|
+
throw new Error(`Unknown direction: ${direction}`);
|
|
45
|
+
};
|
|
46
|
+
const mapOrderTypeToOrdType = (order_type) => {
|
|
47
|
+
switch (order_type) {
|
|
48
|
+
case 'LIMIT':
|
|
49
|
+
return 'limit';
|
|
50
|
+
case 'MARKET':
|
|
51
|
+
return 'market';
|
|
52
|
+
case 'MAKER':
|
|
53
|
+
return 'post_only';
|
|
54
|
+
}
|
|
55
|
+
throw new Error(`Unknown order type: ${order_type}`);
|
|
56
|
+
};
|
|
57
|
+
// 交易数量,表示要购买或者出售的数量。
|
|
58
|
+
// 当币币/币币杠杆以限价买入和卖出时,指交易货币数量。
|
|
59
|
+
// 当币币杠杆以市价买入时,指计价货币的数量。
|
|
60
|
+
// 当币币杠杆以市价卖出时,指交易货币的数量。
|
|
61
|
+
// 对于币币市价单,单位由 tgtCcy 决定
|
|
62
|
+
// 当交割、永续、期权买入和卖出时,指合约张数。
|
|
63
|
+
const mapOrderVolumeToSz = async (order) => {
|
|
64
|
+
if (instType === 'SWAP') {
|
|
65
|
+
return order.volume;
|
|
66
|
+
}
|
|
67
|
+
if (instType === 'MARGIN') {
|
|
68
|
+
if (order.order_type === 'LIMIT') {
|
|
69
|
+
return order.volume;
|
|
70
|
+
}
|
|
71
|
+
if (order.order_type === 'MAKER') {
|
|
72
|
+
return order.volume;
|
|
73
|
+
}
|
|
74
|
+
if (order.order_type === 'MARKET') {
|
|
75
|
+
if (order.order_direction === 'OPEN_SHORT' || order.order_direction === 'CLOSE_LONG') {
|
|
76
|
+
return order.volume;
|
|
77
|
+
}
|
|
78
|
+
//
|
|
79
|
+
const price = await (0, rxjs_1.firstValueFrom)(quote_1.spotMarketTickers$.pipe((0, rxjs_1.map)((x) => mapOrderDirectionToPosSide(order.order_direction) === 'long'
|
|
80
|
+
? +x[instId].askPx
|
|
81
|
+
: +x[instId].bidPx)));
|
|
82
|
+
if (!price) {
|
|
83
|
+
throw new Error(`invalid tick: ${price}`);
|
|
84
|
+
}
|
|
85
|
+
console.info((0, utils_1.formatTime)(Date.now()), 'SubmitOrder', 'price', price);
|
|
86
|
+
const theProduct = await (0, rxjs_1.firstValueFrom)(product_1.productService.mapProductIdToProduct$.pipe((0, rxjs_1.map)((x) => x.get(order.product_id))));
|
|
87
|
+
if (!theProduct) {
|
|
88
|
+
throw new Error(`Unknown product: ${order.position_id}`);
|
|
89
|
+
}
|
|
90
|
+
return (0, utils_1.roundToStep)(order.volume * price, theProduct.volume_step);
|
|
91
|
+
}
|
|
92
|
+
return 0;
|
|
93
|
+
}
|
|
94
|
+
if (instType === 'SPOT') {
|
|
95
|
+
return order.volume;
|
|
96
|
+
}
|
|
97
|
+
throw new Error(`Unknown instType: ${instType}`);
|
|
98
|
+
};
|
|
99
|
+
const params = {
|
|
100
|
+
instId,
|
|
101
|
+
tdMode: instType === 'SPOT' ? 'cash' : 'cross',
|
|
102
|
+
side: mapOrderDirectionToSide(order.order_direction),
|
|
103
|
+
posSide: instType === 'MARGIN' || instType === 'SPOT'
|
|
104
|
+
? 'net'
|
|
105
|
+
: mapOrderDirectionToPosSide(order.order_direction),
|
|
106
|
+
ordType: mapOrderTypeToOrdType(order.order_type),
|
|
107
|
+
sz: (await mapOrderVolumeToSz(order)).toString(),
|
|
108
|
+
tgtCcy: instType === 'SPOT' && order.order_type === 'MARKET' ? 'base_ccy' : undefined,
|
|
109
|
+
reduceOnly: instType === 'MARGIN' && ['CLOSE_LONG', 'CLOSE_SHORT'].includes((_a = order.order_direction) !== null && _a !== void 0 ? _a : '')
|
|
110
|
+
? 'true'
|
|
111
|
+
: undefined,
|
|
112
|
+
px: order.order_type === 'LIMIT' || order.order_type === 'MAKER' ? order.price.toString() : undefined,
|
|
113
|
+
ccy: instType === 'MARGIN' ? 'USDT' : undefined,
|
|
114
|
+
};
|
|
115
|
+
console.info((0, utils_1.formatTime)(Date.now()), 'SubmitOrder', 'params', JSON.stringify(params));
|
|
116
|
+
const res = await (0, api_1.postTradeOrder)(credential, params);
|
|
117
|
+
if (res.code === '0' && ((_c = (_b = res.data) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.ordId)) {
|
|
118
|
+
return {
|
|
119
|
+
res: {
|
|
120
|
+
code: 0,
|
|
121
|
+
message: 'OK',
|
|
122
|
+
data: {
|
|
123
|
+
order_id: res.data[0].ordId,
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return { res: { code: +res.code, message: res.msg } };
|
|
129
|
+
});
|
|
130
|
+
terminal.server.provideService('ModifyOrder', {
|
|
131
|
+
required: ['account_id'],
|
|
132
|
+
properties: {
|
|
133
|
+
account_id: { const: tradingAccountId },
|
|
134
|
+
},
|
|
135
|
+
}, async (msg) => {
|
|
136
|
+
console.info((0, utils_1.formatTime)(Date.now()), 'ModifyOrder', JSON.stringify(msg));
|
|
137
|
+
const order = msg.req;
|
|
138
|
+
const [instType, instId] = (0, utils_1.decodePath)(order.product_id);
|
|
139
|
+
const params = {
|
|
140
|
+
instId,
|
|
141
|
+
ordId: order.order_id, // 使用现有订单ID
|
|
142
|
+
};
|
|
143
|
+
// 如果需要修改价格
|
|
144
|
+
if (order.price !== undefined) {
|
|
145
|
+
params.newPx = order.price.toString();
|
|
146
|
+
}
|
|
147
|
+
// 如果需要修改数量
|
|
148
|
+
if (order.volume !== undefined) {
|
|
149
|
+
// 处理数量修改,类似于 SubmitOrder 中的逻辑
|
|
150
|
+
if (instType === 'SWAP') {
|
|
151
|
+
params.newSz = order.volume.toString();
|
|
152
|
+
}
|
|
153
|
+
else if (instType === 'SPOT') {
|
|
154
|
+
params.newSz = order.volume.toString();
|
|
155
|
+
}
|
|
156
|
+
else if (instType === 'MARGIN') {
|
|
157
|
+
if (order.order_type === 'LIMIT') {
|
|
158
|
+
params.newSz = order.volume.toString();
|
|
159
|
+
}
|
|
160
|
+
if (order.order_type === 'MAKER') {
|
|
161
|
+
params.newSz = order.volume.toString();
|
|
162
|
+
}
|
|
163
|
+
if (order.order_type === 'MARKET') {
|
|
164
|
+
// 对于市价单,可能需要根据当前价格计算新的数量
|
|
165
|
+
const price = await (0, rxjs_1.firstValueFrom)(quote_1.spotMarketTickers$.pipe((0, rxjs_1.map)((x) => order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT'
|
|
166
|
+
? +x[instId].askPx
|
|
167
|
+
: +x[instId].bidPx)));
|
|
168
|
+
if (!price) {
|
|
169
|
+
throw new Error(`invalid tick: ${price}`);
|
|
170
|
+
}
|
|
171
|
+
console.info((0, utils_1.formatTime)(Date.now()), 'ModifyOrder', 'price', price);
|
|
172
|
+
const theProduct = await (0, rxjs_1.firstValueFrom)(product_1.productService.mapProductIdToProduct$.pipe((0, rxjs_1.map)((x) => x.get(order.product_id))));
|
|
173
|
+
if (!theProduct) {
|
|
174
|
+
throw new Error(`Unknown product: ${order.position_id}`);
|
|
175
|
+
}
|
|
176
|
+
params.newSz = (0, utils_1.roundToStep)(order.volume * price, theProduct.volume_step).toString();
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
throw new Error(`Unknown instType: ${instType}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
console.info((0, utils_1.formatTime)(Date.now()), 'ModifyOrder', 'params', JSON.stringify(params));
|
|
184
|
+
const res = await (0, api_1.postTradeAmendOrder)(credential, params);
|
|
185
|
+
if (res.code !== '0') {
|
|
186
|
+
return {
|
|
187
|
+
res: {
|
|
188
|
+
code: +res.code,
|
|
189
|
+
message: res.msg,
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
return { res: { code: 0, message: 'OK' } };
|
|
194
|
+
});
|
|
195
|
+
terminal.server.provideService('CancelOrder', {
|
|
196
|
+
required: ['account_id'],
|
|
197
|
+
properties: {
|
|
198
|
+
account_id: { const: tradingAccountId },
|
|
199
|
+
},
|
|
200
|
+
}, (msg) => (0, rxjs_1.defer)(async () => {
|
|
201
|
+
const order = msg.req;
|
|
202
|
+
const [instType, instId] = (0, utils_1.decodePath)(order.product_id);
|
|
203
|
+
const res = await (0, api_1.postTradeCancelOrder)(credential, {
|
|
204
|
+
instId,
|
|
205
|
+
ordId: order.order_id,
|
|
206
|
+
});
|
|
207
|
+
if (res.code !== '0') {
|
|
208
|
+
return { res: { code: +res.code, message: res.msg } };
|
|
209
|
+
}
|
|
210
|
+
return { res: { code: 0, message: 'OK' } };
|
|
211
|
+
}));
|
|
212
|
+
}).subscribe();
|
|
213
|
+
//# sourceMappingURL=order-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"order-actions.js","sourceRoot":"","sources":["../src/order-actions.ts"],"names":[],"mappings":";;AACA,+CAA4C;AAC5C,yCAAoE;AACpE,+BAAkD;AAClD,uCAA8C;AAC9C,+BAAwG;AACxG,uCAA2C;AAC3C,mCAA6C;AAE7C,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC;AAExC,MAAM,UAAU,GAAG,IAAA,0BAAoB,GAAE,CAAC;AAE1C,IAAA,YAAK,EAAC,KAAK,IAAI,EAAE;IACf,MAAM,gBAAgB,GAAG,MAAM,IAAA,qBAAc,EAAC,2BAAiB,CAAC,CAAC;IACjE,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,aAAa,EACb;QACE,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,UAAU,EAAE;YACV,UAAU,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;SACxC;KACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;;QACZ,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;QACtB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAA,kBAAU,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAExD,MAAM,uBAAuB,GAAG,CAAC,SAAkB,EAAE,EAAE;YACrD,QAAQ,SAAS,EAAE;gBACjB,KAAK,WAAW,CAAC;gBACjB,KAAK,aAAa;oBAChB,OAAO,KAAK,CAAC;gBACf,KAAK,YAAY,CAAC;gBAClB,KAAK,YAAY;oBACf,OAAO,MAAM,CAAC;aACjB;YACD,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC;QACF,MAAM,0BAA0B,GAAG,CAAC,SAAkB,EAAE,EAAE;YACxD,QAAQ,SAAS,EAAE;gBACjB,KAAK,WAAW,CAAC;gBACjB,KAAK,YAAY;oBACf,OAAO,MAAM,CAAC;gBAChB,KAAK,aAAa,CAAC;gBACnB,KAAK,YAAY;oBACf,OAAO,OAAO,CAAC;aAClB;YACD,MAAM,IAAI,KAAK,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC;QACF,MAAM,qBAAqB,GAAG,CAAC,UAAmB,EAAE,EAAE;YACpD,QAAQ,UAAU,EAAE;gBAClB,KAAK,OAAO;oBACV,OAAO,OAAO,CAAC;gBACjB,KAAK,QAAQ;oBACX,OAAO,QAAQ,CAAC;gBAClB,KAAK,OAAO;oBACV,OAAO,WAAW,CAAC;aACtB;YACD,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC,CAAC;QAEF,qBAAqB;QACrB,6BAA6B;QAC7B,wBAAwB;QACxB,wBAAwB;QACxB,wBAAwB;QACxB,yBAAyB;QACzB,MAAM,kBAAkB,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;YACjD,IAAI,QAAQ,KAAK,MAAM,EAAE;gBACvB,OAAO,KAAK,CAAC,MAAM,CAAC;aACrB;YACD,IAAI,QAAQ,KAAK,QAAQ,EAAE;gBACzB,IAAI,KAAK,CAAC,UAAU,KAAK,OAAO,EAAE;oBAChC,OAAO,KAAK,CAAC,MAAM,CAAC;iBACrB;gBACD,IAAI,KAAK,CAAC,UAAU,KAAK,OAAO,EAAE;oBAChC,OAAO,KAAK,CAAC,MAAM,CAAC;iBACrB;gBACD,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE;oBACjC,IAAI,KAAK,CAAC,eAAe,KAAK,YAAY,IAAI,KAAK,CAAC,eAAe,KAAK,YAAY,EAAE;wBACpF,OAAO,KAAK,CAAC,MAAM,CAAC;qBACrB;oBACD,EAAE;oBACF,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAc,EAChC,0BAAkB,CAAC,IAAI,CACrB,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CACR,0BAA0B,CAAC,KAAK,CAAC,eAAe,CAAC,KAAK,MAAM;wBAC1D,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK;wBAClB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CACrB,CACF,CACF,CAAC;oBACF,IAAI,CAAC,KAAK,EAAE;wBACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;qBAC3C;oBACD,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;oBACpE,MAAM,UAAU,GAAG,MAAM,IAAA,qBAAc,EACrC,wBAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAChF,CAAC;oBACF,IAAI,CAAC,UAAU,EAAE;wBACf,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;qBAC1D;oBACD,OAAO,IAAA,mBAAW,EAAC,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,UAAU,CAAC,WAAY,CAAC,CAAC;iBACnE;gBAED,OAAO,CAAC,CAAC;aACV;YAED,IAAI,QAAQ,KAAK,MAAM,EAAE;gBACvB,OAAO,KAAK,CAAC,MAAM,CAAC;aACrB;YAED,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,MAAM;YACN,MAAM,EAAE,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO;YAC9C,IAAI,EAAE,uBAAuB,CAAC,KAAK,CAAC,eAAe,CAAC;YACpD,OAAO,EACL,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,MAAM;gBAC1C,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,0BAA0B,CAAC,KAAK,CAAC,eAAe,CAAC;YACvD,OAAO,EAAE,qBAAqB,CAAC,KAAK,CAAC,UAAU,CAAC;YAChD,EAAE,EAAE,CAAC,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;YAChD,MAAM,EAAE,QAAQ,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YACrF,UAAU,EACR,QAAQ,KAAK,QAAQ,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC,QAAQ,CAAC,MAAA,KAAK,CAAC,eAAe,mCAAI,EAAE,CAAC;gBAC1F,CAAC,CAAC,MAAM;gBACR,CAAC,CAAC,SAAS;YACf,EAAE,EACA,KAAK,CAAC,UAAU,KAAK,OAAO,IAAI,KAAK,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,SAAS;YACpG,GAAG,EAAE,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SAChD,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACtF,MAAM,GAAG,GAAG,MAAM,IAAA,oBAAc,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,KAAI,MAAA,MAAA,GAAG,CAAC,IAAI,0CAAG,CAAC,CAAC,0CAAE,KAAK,CAAA,EAAE;YAC5C,OAAO;gBACL,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC;oBACP,OAAO,EAAE,IAAI;oBACb,IAAI,EAAE;wBACJ,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;qBAC5B;iBACF;aACF,CAAC;SACH;QACD,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;IACxD,CAAC,CACF,CAAC;IAEF,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,aAAa,EACb;QACE,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,UAAU,EAAE;YACV,UAAU,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;SACxC;KACF,EACD,KAAK,EAAE,GAAG,EAAE,EAAE;QACZ,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;QACtB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAA,kBAAU,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAExD,MAAM,MAAM,GAKR;YACF,MAAM;YACN,KAAK,EAAE,KAAK,CAAC,QAAS,EAAE,WAAW;SACpC,CAAC;QAEF,WAAW;QACX,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE;YAC7B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;SACvC;QAED,WAAW;QACX,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE;YAC9B,8BAA8B;YAC9B,IAAI,QAAQ,KAAK,MAAM,EAAE;gBACvB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;aACxC;iBAAM,IAAI,QAAQ,KAAK,MAAM,EAAE;gBAC9B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;aACxC;iBAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE;gBAChC,IAAI,KAAK,CAAC,UAAU,KAAK,OAAO,EAAE;oBAChC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;iBACxC;gBACD,IAAI,KAAK,CAAC,UAAU,KAAK,OAAO,EAAE;oBAChC,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;iBACxC;gBACD,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE;oBACjC,yBAAyB;oBACzB,MAAM,KAAK,GAAG,MAAM,IAAA,qBAAc,EAChC,0BAAkB,CAAC,IAAI,CACrB,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CACR,KAAK,CAAC,eAAe,KAAK,WAAW,IAAI,KAAK,CAAC,eAAe,KAAK,aAAa;wBAC9E,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK;wBAClB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CACrB,CACF,CACF,CAAC;oBACF,IAAI,CAAC,KAAK,EAAE;wBACV,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,EAAE,CAAC,CAAC;qBAC3C;oBACD,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;oBACpE,MAAM,UAAU,GAAG,MAAM,IAAA,qBAAc,EACrC,wBAAc,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAA,UAAG,EAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAChF,CAAC;oBACF,IAAI,CAAC,UAAU,EAAE;wBACf,MAAM,IAAI,KAAK,CAAC,oBAAoB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;qBAC1D;oBACD,MAAM,CAAC,KAAK,GAAG,IAAA,mBAAW,EAAC,KAAK,CAAC,MAAM,GAAG,KAAK,EAAE,UAAU,CAAC,WAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;iBACtF;aACF;iBAAM;gBACL,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;aAClD;SACF;QAED,OAAO,CAAC,IAAI,CAAC,IAAA,kBAAU,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAEtF,MAAM,GAAG,GAAG,MAAM,IAAA,yBAAmB,EAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAC1D,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;YACpB,OAAO;gBACL,GAAG,EAAE;oBACH,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI;oBACf,OAAO,EAAE,GAAG,CAAC,GAAG;iBACjB;aACF,CAAC;SACH;QAED,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IAC7C,CAAC,CACF,CAAC;IAEF,QAAQ,CAAC,MAAM,CAAC,cAAc,CAC5B,aAAa,EACb;QACE,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,UAAU,EAAE;YACV,UAAU,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE;SACxC;KACF,EACD,CAAC,GAAG,EAAE,EAAE,CACN,IAAA,YAAK,EAAC,KAAK,IAAI,EAAE;QACf,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC;QACtB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,IAAA,kBAAU,EAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,MAAM,IAAA,0BAAoB,EAAC,UAAU,EAAE;YACjD,MAAM;YACN,KAAK,EAAE,KAAK,CAAC,QAAS;SACvB,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE;YACpB,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;SACvD;QACD,OAAO,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;IAC7C,CAAC,CAAC,CACL,CAAC;AACJ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC","sourcesContent":["import { IOrder } from '@yuants/data-order';\nimport { Terminal } from '@yuants/protocol';\nimport { decodePath, formatTime, roundToStep } from '@yuants/utils';\nimport { defer, firstValueFrom, map } from 'rxjs';\nimport { tradingAccountId$ } from './account';\nimport { getDefaultCredential, postTradeAmendOrder, postTradeCancelOrder, postTradeOrder } from './api';\nimport { productService } from './product';\nimport { spotMarketTickers$ } from './quote';\n\nconst terminal = Terminal.fromNodeEnv();\n\nconst credential = getDefaultCredential();\n\ndefer(async () => {\n const tradingAccountId = await firstValueFrom(tradingAccountId$);\n terminal.server.provideService<IOrder, { order_id?: string }>(\n 'SubmitOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: { const: tradingAccountId },\n },\n },\n async (msg) => {\n console.info(formatTime(Date.now()), 'SubmitOrder', JSON.stringify(msg));\n const order = msg.req;\n const [instType, instId] = decodePath(order.product_id);\n\n const mapOrderDirectionToSide = (direction?: string) => {\n switch (direction) {\n case 'OPEN_LONG':\n case 'CLOSE_SHORT':\n return 'buy';\n case 'OPEN_SHORT':\n case 'CLOSE_LONG':\n return 'sell';\n }\n throw new Error(`Unknown direction: ${direction}`);\n };\n const mapOrderDirectionToPosSide = (direction?: string) => {\n switch (direction) {\n case 'OPEN_LONG':\n case 'CLOSE_LONG':\n return 'long';\n case 'CLOSE_SHORT':\n case 'OPEN_SHORT':\n return 'short';\n }\n throw new Error(`Unknown direction: ${direction}`);\n };\n const mapOrderTypeToOrdType = (order_type?: string) => {\n switch (order_type) {\n case 'LIMIT':\n return 'limit';\n case 'MARKET':\n return 'market';\n case 'MAKER':\n return 'post_only';\n }\n throw new Error(`Unknown order type: ${order_type}`);\n };\n\n // 交易数量,表示要购买或者出售的数量。\n // 当币币/币币杠杆以限价买入和卖出时,指交易货币数量。\n // 当币币杠杆以市价买入时,指计价货币的数量。\n // 当币币杠杆以市价卖出时,指交易货币的数量。\n // 对于币币市价单,单位由 tgtCcy 决定\n // 当交割、永续、期权买入和卖出时,指合约张数。\n const mapOrderVolumeToSz = async (order: IOrder) => {\n if (instType === 'SWAP') {\n return order.volume;\n }\n if (instType === 'MARGIN') {\n if (order.order_type === 'LIMIT') {\n return order.volume;\n }\n if (order.order_type === 'MAKER') {\n return order.volume;\n }\n if (order.order_type === 'MARKET') {\n if (order.order_direction === 'OPEN_SHORT' || order.order_direction === 'CLOSE_LONG') {\n return order.volume;\n }\n //\n const price = await firstValueFrom(\n spotMarketTickers$.pipe(\n map((x) =>\n mapOrderDirectionToPosSide(order.order_direction) === 'long'\n ? +x[instId].askPx\n : +x[instId].bidPx,\n ),\n ),\n );\n if (!price) {\n throw new Error(`invalid tick: ${price}`);\n }\n console.info(formatTime(Date.now()), 'SubmitOrder', 'price', price);\n const theProduct = await firstValueFrom(\n productService.mapProductIdToProduct$.pipe(map((x) => x.get(order.product_id))),\n );\n if (!theProduct) {\n throw new Error(`Unknown product: ${order.position_id}`);\n }\n return roundToStep(order.volume * price, theProduct.volume_step!);\n }\n\n return 0;\n }\n\n if (instType === 'SPOT') {\n return order.volume;\n }\n\n throw new Error(`Unknown instType: ${instType}`);\n };\n\n const params = {\n instId,\n tdMode: instType === 'SPOT' ? 'cash' : 'cross',\n side: mapOrderDirectionToSide(order.order_direction),\n posSide:\n instType === 'MARGIN' || instType === 'SPOT'\n ? 'net'\n : mapOrderDirectionToPosSide(order.order_direction),\n ordType: mapOrderTypeToOrdType(order.order_type),\n sz: (await mapOrderVolumeToSz(order)).toString(),\n tgtCcy: instType === 'SPOT' && order.order_type === 'MARKET' ? 'base_ccy' : undefined,\n reduceOnly:\n instType === 'MARGIN' && ['CLOSE_LONG', 'CLOSE_SHORT'].includes(order.order_direction ?? '')\n ? 'true'\n : undefined,\n px:\n order.order_type === 'LIMIT' || order.order_type === 'MAKER' ? order.price!.toString() : undefined,\n ccy: instType === 'MARGIN' ? 'USDT' : undefined,\n };\n console.info(formatTime(Date.now()), 'SubmitOrder', 'params', JSON.stringify(params));\n const res = await postTradeOrder(credential, params);\n if (res.code === '0' && res.data?.[0]?.ordId) {\n return {\n res: {\n code: 0,\n message: 'OK',\n data: {\n order_id: res.data[0].ordId,\n },\n },\n };\n }\n return { res: { code: +res.code, message: res.msg } };\n },\n );\n\n terminal.server.provideService<IOrder>(\n 'ModifyOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: { const: tradingAccountId },\n },\n },\n async (msg) => {\n console.info(formatTime(Date.now()), 'ModifyOrder', JSON.stringify(msg));\n const order = msg.req;\n const [instType, instId] = decodePath(order.product_id);\n\n const params: {\n instId: string;\n ordId: string;\n newPx?: string;\n newSz?: string;\n } = {\n instId,\n ordId: order.order_id!, // 使用现有订单ID\n };\n\n // 如果需要修改价格\n if (order.price !== undefined) {\n params.newPx = order.price.toString();\n }\n\n // 如果需要修改数量\n if (order.volume !== undefined) {\n // 处理数量修改,类似于 SubmitOrder 中的逻辑\n if (instType === 'SWAP') {\n params.newSz = order.volume.toString();\n } else if (instType === 'SPOT') {\n params.newSz = order.volume.toString();\n } else if (instType === 'MARGIN') {\n if (order.order_type === 'LIMIT') {\n params.newSz = order.volume.toString();\n }\n if (order.order_type === 'MAKER') {\n params.newSz = order.volume.toString();\n }\n if (order.order_type === 'MARKET') {\n // 对于市价单,可能需要根据当前价格计算新的数量\n const price = await firstValueFrom(\n spotMarketTickers$.pipe(\n map((x) =>\n order.order_direction === 'OPEN_LONG' || order.order_direction === 'CLOSE_SHORT'\n ? +x[instId].askPx\n : +x[instId].bidPx,\n ),\n ),\n );\n if (!price) {\n throw new Error(`invalid tick: ${price}`);\n }\n console.info(formatTime(Date.now()), 'ModifyOrder', 'price', price);\n const theProduct = await firstValueFrom(\n productService.mapProductIdToProduct$.pipe(map((x) => x.get(order.product_id))),\n );\n if (!theProduct) {\n throw new Error(`Unknown product: ${order.position_id}`);\n }\n params.newSz = roundToStep(order.volume * price, theProduct.volume_step!).toString();\n }\n } else {\n throw new Error(`Unknown instType: ${instType}`);\n }\n }\n\n console.info(formatTime(Date.now()), 'ModifyOrder', 'params', JSON.stringify(params));\n\n const res = await postTradeAmendOrder(credential, params);\n if (res.code !== '0') {\n return {\n res: {\n code: +res.code,\n message: res.msg,\n },\n };\n }\n\n return { res: { code: 0, message: 'OK' } };\n },\n );\n\n terminal.server.provideService<IOrder>(\n 'CancelOrder',\n {\n required: ['account_id'],\n properties: {\n account_id: { const: tradingAccountId },\n },\n },\n (msg) =>\n defer(async () => {\n const order = msg.req;\n const [instType, instId] = decodePath(order.product_id);\n const res = await postTradeCancelOrder(credential, {\n instId,\n ordId: order.order_id!,\n });\n if (res.code !== '0') {\n return { res: { code: +res.code, message: res.msg } };\n }\n return { res: { code: 0, message: 'OK' } };\n }),\n );\n}).subscribe();\n"]}
|