在 `binance_client` 中引入 K线和最优挂单的 WebSocket 流,优先从缓存中获取价格数据,减少对 REST API 的依赖。同时,更新了价格获取逻辑,确保在未能获取价格时提供详细的错误信息。增强了异常处理,确保在请求超时或失败时记录相关日志,提升系统的稳定性和可追溯性。
338 lines
14 KiB
Plaintext
338 lines
14 KiB
Plaintext
下单 (TRADE)
|
||
接口描述
|
||
下单
|
||
|
||
方式
|
||
order.place
|
||
|
||
请求
|
||
order.place
|
||
|
||
{
|
||
"id": "3f7df6e3-2df4-44b9-9919-d2f38f90a99a",
|
||
"method": "order.place",
|
||
"params": {
|
||
"apiKey": "HMOchcfii9ZRZnhjp2XjGXhsOBd6msAhKz9joQaWwZ7arcJTlD2hGPHQj1lGdTjR",
|
||
"positionSide": "BOTH",
|
||
"price": 43187.00,
|
||
"quantity": 0.1,
|
||
"side": "BUY",
|
||
"symbol": "BTCUSDT",
|
||
"timeInForce": "GTC",
|
||
"timestamp": 1702555533821,
|
||
"type": "LIMIT",
|
||
"signature": "0f04368b2d22aafd0ggc8809ea34297eff602272917b5f01267db4efbc1c9422"
|
||
}
|
||
}
|
||
|
||
请求权重
|
||
0
|
||
|
||
请求参数
|
||
名称 类型 是否必需 描述
|
||
symbol STRING YES 交易对
|
||
side ENUM YES 买卖方向 SELL, BUY
|
||
positionSide ENUM NO 持仓方向,单向持仓模式下非必填,默认且仅可填BOTH;在双向持仓模式下必填,且仅可选择 LONG 或 SHORT
|
||
type ENUM YES 订单类型 LIMIT, MARKET, STOP, TAKE_PROFIT, STOP_MARKET, TAKE_PROFIT_MARKET, TRAILING_STOP_MARKET
|
||
reduceOnly STRING NO true, false; 非双开模式下默认false;双开模式下不接受此参数; 使用closePosition不支持此参数。
|
||
quantity DECIMAL NO 下单数量,使用closePosition不支持此参数。
|
||
price DECIMAL NO 委托价格
|
||
newClientOrderId STRING NO 用户自定义的订单号,不可以重复出现在挂单中。如空缺系统会自动赋值。必须满足正则规则 ^[\.A-Z\:/a-z0-9_-]{1,36}$
|
||
stopPrice DECIMAL NO 触发价, 仅 STOP, STOP_MARKET, TAKE_PROFIT, TAKE_PROFIT_MARKET 需要此参数
|
||
closePosition STRING NO true, false;触发后全部平仓,仅支持STOP_MARKET和TAKE_PROFIT_MARKET;不与quantity合用;自带只平仓效果,不与reduceOnly 合用
|
||
activationPrice DECIMAL NO 追踪止损激活价格,仅TRAILING_STOP_MARKET 需要此参数, 默认为下单当前市场价格(支持不同workingType)
|
||
callbackRate DECIMAL NO 追踪止损回调比例,可取值范围[0.1, 10],其中 1代表1% ,仅TRAILING_STOP_MARKET 需要此参数
|
||
timeInForce ENUM NO 有效方法
|
||
workingType ENUM NO stopPrice 触发类型: MARK_PRICE(标记价格), CONTRACT_PRICE(合约最新价). 默认 CONTRACT_PRICE
|
||
priceProtect STRING NO 条件单触发保护:"TRUE","FALSE", 默认"FALSE". 仅 STOP, STOP_MARKET, TAKE_PROFIT, TAKE_PROFIT_MARKET 需要此参数
|
||
newOrderRespType ENUM NO "ACK", "RESULT", 默认 "ACK"
|
||
priceMatch ENUM NO OPPONENT/ OPPONENT_5/ OPPONENT_10/ OPPONENT_20/QUEUE/ QUEUE_5/ QUEUE_10/ QUEUE_20;不能与price同时传
|
||
selfTradePreventionMode ENUM NO NONE / EXPIRE_TAKER/ EXPIRE_MAKER/ EXPIRE_BOTH; 默认NONE
|
||
goodTillDate LONG NO TIF为GTD时订单的自动取消时间, 当timeInforce为GTD时必传;传入的时间戳仅保留秒级精度,毫秒级部分会被自动忽略,时间戳需大于当前时间+600s且小于253402300799000
|
||
recvWindow LONG NO
|
||
timestamp LONG YES
|
||
根据 order type的不同,某些参数强制要求,具体如下:
|
||
|
||
Type 强制要求的参数
|
||
LIMIT timeInForce, quantity, price或priceMatch
|
||
MARKET quantity
|
||
STOP, TAKE_PROFIT quantity, stopPrice
|
||
STOP_MARKET, TAKE_PROFIT_MARKET stopPrice, price或priceMatch
|
||
TRAILING_STOP_MARKET callbackRate
|
||
条件单的触发必须:
|
||
|
||
如果订单参数priceProtect为true:
|
||
达到触发价时,MARK_PRICE(标记价格)与CONTRACT_PRICE(合约最新价)之间的价差不能超过改symbol触发保护阈值
|
||
触发保护阈值请参考接口GET /fapi/v1/exchangeInfo 返回内容相应symbol中"triggerProtect"字段
|
||
STOP, STOP_MARKET 止损单:
|
||
买入: 最新合约价格/标记价格高于等于触发价stopPrice
|
||
卖出: 最新合约价格/标记价格低于等于触发价stopPrice
|
||
TAKE_PROFIT, TAKE_PROFIT_MARKET 止盈单:
|
||
买入: 最新合约价格/标记价格低于等于触发价stopPrice
|
||
卖出: 最新合约价格/标记价格高于等于触发价stopPrice
|
||
TRAILING_STOP_MARKET 跟踪止损单:
|
||
买入: 当合约价格/标记价格区间最低价格低于激活价格activationPrice,且最新合约价格/标记价高于等于最低价设定回调幅度。
|
||
卖出: 当合约价格/标记价格区间最高价格高于激活价格activationPrice,且最新合约价格/标记价低于等于最高价设定回调幅度。
|
||
TRAILING_STOP_MARKET 跟踪止损单如果遇到报错 {"code": -2021, "msg": "Order would immediately trigger."}
|
||
表示订单不满足以下条件:
|
||
|
||
买入: 指定的activationPrice 必须小于 latest price
|
||
卖出: 指定的activationPrice 必须大于 latest price
|
||
newOrderRespType 如果传 RESULT:
|
||
|
||
MARKET 订单将直接返回成交结果;
|
||
配合使用特殊 timeInForce 的 LIMIT 订单将直接返回成交或过期拒绝结果。
|
||
STOP_MARKET, TAKE_PROFIT_MARKET 配合 closePosition=true:
|
||
|
||
条件单触发依照上述条件单触发逻辑
|
||
条件触发后,平掉当时持有所有多头仓位(若为卖单)或当时持有所有空头仓位(若为买单)
|
||
不支持 quantity 参数
|
||
自带只平仓属性,不支持reduceOnly参数
|
||
双开模式下,LONG方向上不支持BUY; SHORT 方向上不支持SELL
|
||
响应示例
|
||
{
|
||
"id": "3f7df6e3-2df4-44b9-9919-d2f38f90a99a",
|
||
"status": 200,
|
||
"result": {
|
||
"orderId": 325078477,
|
||
"symbol": "BTCUSDT",
|
||
"status": "NEW",
|
||
"clientOrderId": "iCXL1BywlBaf2sesNUrVl3",
|
||
"price": "43187.00",
|
||
"avgPrice": "0.00",
|
||
"origQty": "0.100",
|
||
"executedQty": "0.000",
|
||
"cumQty": "0.000",
|
||
"cumQuote": "0.00000",
|
||
"timeInForce": "GTC",
|
||
"type": "LIMIT",
|
||
"reduceOnly": false,
|
||
"closePosition": false,
|
||
"side": "BUY",
|
||
"positionSide": "BOTH",
|
||
"stopPrice": "0.00",
|
||
"workingType": "CONTRACT_PRICE",
|
||
"priceProtect": false,
|
||
"origType": "LIMIT",
|
||
"priceMatch": "NONE",
|
||
"selfTradePreventionMode": "NONE",
|
||
"goodTillDate": 0,
|
||
"updateTime": 1702555534435
|
||
},
|
||
"rateLimits": [
|
||
{
|
||
"rateLimitType": "ORDERS",
|
||
"interval": "SECOND",
|
||
"intervalNum": 10,
|
||
"limit": 300,
|
||
"count": 1
|
||
},
|
||
{
|
||
"rateLimitType": "ORDERS",
|
||
"interval": "MINUTE",
|
||
"intervalNum": 1,
|
||
"limit": 1200,
|
||
"count": 1
|
||
},
|
||
{
|
||
"rateLimitType": "REQUEST_WEIGHT",
|
||
"interval": "MINUTE",
|
||
"intervalNum": 1,
|
||
"limit": 2400,
|
||
"count": 1
|
||
}
|
||
]
|
||
}
|
||
|
||
|
||
|
||
|
||
查询订单
|
||
查询订单 (USER_DATA)
|
||
接口描述
|
||
查询订单状态
|
||
|
||
请注意,如果订单满足如下条件,不会被查询到:
|
||
订单的最终状态为 CANCELED 或者 EXPIRED 并且 订单没有任何的成交记录 并且 订单生成时间 + 3天 < 当前时间
|
||
订单创建时间 + 90天 < 当前时间
|
||
方式
|
||
order.status
|
||
|
||
请求
|
||
{
|
||
"id": "0ce5d070-a5e5-4ff2-b57f-1556741a4204",
|
||
"method": "order.status",
|
||
"params": {
|
||
"apiKey": "HMOchcfii9ZRZnhjp2XjGXhsOBd6msAhKz9joQaWwZ7arcJTlD2hGPHQj1lGdTjR",
|
||
"orderId": 328999071,
|
||
"symbol": "BTCUSDT",
|
||
"timestamp": 1703441060152,
|
||
"signature": "ba48184fc38a71d03d2b5435bd67c1206e3191e989fe99bda1bc643a880dfdbf"
|
||
}
|
||
}
|
||
|
||
请求权重
|
||
1
|
||
|
||
请求参数
|
||
名称 类型 是否必需 描述
|
||
symbol STRING YES 交易对
|
||
orderId LONG NO 系统订单号
|
||
origClientOrderId STRING NO 用户自定义的订单号
|
||
recvWindow LONG NO
|
||
timestamp LONG YES
|
||
注意:
|
||
|
||
至少需要发送 orderId 与 origClientOrderId中的一个
|
||
orderId在symbol维度是自增的
|
||
响应示例
|
||
{
|
||
"avgPrice": "0.00000", // 平均成交价
|
||
"clientOrderId": "abc", // 用户自定义的订单号
|
||
"cumQuote": "0", // 成交金额
|
||
"executedQty": "0", // 成交量
|
||
"orderId": 1573346959, // 系统订单号
|
||
"origQty": "0.40", // 原始委托数量
|
||
"origType": "TRAILING_STOP_MARKET", // 触发前订单类型
|
||
"price": "0", // 委托价格
|
||
"reduceOnly": false, // 是否仅减仓
|
||
"side": "BUY", // 买卖方向
|
||
"positionSide": "SHORT", // 持仓方向
|
||
"status": "NEW", // 订单状态
|
||
"stopPrice": "9300", // 触发价,对`TRAILING_STOP_MARKET`无效
|
||
"closePosition": false, // 是否条件全平仓
|
||
"symbol": "BTCUSDT", // 交易对
|
||
"time": 1579276756075, // 订单时间
|
||
"timeInForce": "GTC", // 有效方法
|
||
"type": "TRAILING_STOP_MARKET", // 订单类型
|
||
"activatePrice": "9020", // 跟踪止损激活价格, 仅`TRAILING_STOP_MARKET` 订单返回此字段
|
||
"priceRate": "0.3", // 跟踪止损回调比例, 仅`TRAILING_STOP_MARKET` 订单返回此字段
|
||
"updateTime": 1579276756075, // 更新时间
|
||
"workingType": "CONTRACT_PRICE", // 条件价格触发类型
|
||
"priceProtect": false // 是否开启条件单触发保护
|
||
}
|
||
|
||
|
||
条件单下单 (TRADE)
|
||
接口描述
|
||
条件单下单
|
||
|
||
方式
|
||
algoOrder.place
|
||
|
||
请求
|
||
{
|
||
"id": "7731f6b5-8d5e-419c-a424-016b0a5fe8d7",
|
||
"method": "algoOrder.place",
|
||
"params": {
|
||
"algoType": "CONDITIONAL",
|
||
"apiKey": "autoApiKey7mM4kPWaRuTUypdTEZKG8U8tDjO64xdBJBrmE1nXU2XSwdxGPyXcYx",
|
||
"newOrderRespType": "RESULT",
|
||
"positionSide": "SHORT",
|
||
"price": "160000",
|
||
"quantity": "1",
|
||
"recvWindow": "99999999",
|
||
"side": "SELL",
|
||
"symbol": "BTCUSDT",
|
||
"timeInForce": "GTC",
|
||
"timestamp": 1762506268690,
|
||
"triggerprice": 120000,
|
||
"type": "TAKE_PROFIT",
|
||
"signature": "ec6e529c69fd8193b19484907bc713114eae06259fcab9728dafd5910f9cac5a"
|
||
}
|
||
}
|
||
|
||
请求权重
|
||
0
|
||
|
||
请求参数
|
||
名称 类型 是否必需 描述
|
||
algoType ENUM YES 仅支持 CONDITIONAL
|
||
symbol STRING YES 交易对
|
||
side ENUM YES 买卖方向 SELL, BUY
|
||
positionSide ENUM NO 持仓方向,单向持仓模式下非必填,默认且仅可填BOTH;在双向持仓模式下必填,且仅可选择 LONG 或 SHORT
|
||
type ENUM YES 条件订单类型 STOP, TAKE_PROFIT, STOP_MARKET, TAKE_PROFIT_MARKET, TRAILING_STOP_MARKET
|
||
timeInForce ENUM NO IOC or GTC or FOK, 默认 GTC
|
||
quantity DECIMAL NO 下单数量,使用closePosition不支持此参数。
|
||
price DECIMAL NO 委托价格
|
||
triggerPrice DECIMAL NO 触发价
|
||
workingType ENUM NO 触发类型: MARK_PRICE(标记价格), CONTRACT_PRICE(合约最新价). 默认 CONTRACT_PRICE
|
||
priceMatch ENUM NO OPPONENT/ OPPONENT_5/ OPPONENT_10/ OPPONENT_20/QUEUE/ QUEUE_5/ QUEUE_10/ QUEUE_20;不能与price同时传
|
||
closePosition STRING NO true, false;触发后全部平仓,仅支持STOP_MARKET和TAKE_PROFIT_MARKET;不与quantity合用;自带只平仓效果,不与reduceOnly 合用
|
||
priceProtect STRING NO 条件单触发保护:"TRUE","FALSE", 默认"FALSE".
|
||
reduceOnly STRING NO true, false; 非双开模式下默认false;双开模式下不接受此参数; 使用closePosition不支持此参数。
|
||
activatePrice DECIMAL NO 追踪止损激活价格,仅TRAILING_STOP_MARKET 需要此参数, 默认为下单当前市场价格(支持不同workingType)
|
||
callbackRate DECIMAL NO 追踪止损回调比例,可取值范围[0.1, 10],其中 1代表1% ,仅TRAILING_STOP_MARKET 需要此参数
|
||
clientAlgoId STRING NO 用户自定义的条件订单号,不可以重复出现在挂单中。如空缺系统会自动赋值。必须满足正则规则 ^[\.A-Z\:/a-z0-9_-]{1,36}$
|
||
newOrderRespType ENUM NO "ACK", "RESULT", 默认 "ACK"
|
||
selfTradePreventionMode ENUM NO EXPIRE_TAKER/ EXPIRE_MAKER/ EXPIRE_BOTH; 默认NONE
|
||
goodTillDate LONG NO TIF为GTD时订单的自动取消时间, 当timeInforce为GTD时必传;传入的时间戳仅保留秒级精度,毫秒级部分会被自动忽略,时间戳需大于当前时间+600s且小于253402300799000
|
||
recvWindow LONG NO
|
||
timestamp LONG YES
|
||
条件单的触发必须:
|
||
|
||
如果订单参数priceProtect为true:
|
||
达到触发价时,MARK_PRICE(标记价格)与CONTRACT_PRICE(合约最新价)之间的价差不能超过改symbol触发保护阈值
|
||
触发保护阈值请参考接口GET /fapi/v1/exchangeInfo 返回内容相应symbol中"triggerProtect"字段
|
||
STOP, STOP_MARKET 止损单:
|
||
买入: 最新合约价格/标记价格高于等于触发价stopPrice
|
||
卖出: 最新合约价格/标记价格低于等于触发价stopPrice
|
||
TAKE_PROFIT, TAKE_PROFIT_MARKET 止盈单:
|
||
买入: 最新合约价格/标记价格低于等于触发价stopPrice
|
||
卖出: 最新合约价格/标记价格高于等于触发价stopPrice
|
||
TRAILING_STOP_MARKET 跟踪止损单:
|
||
买入: 当合约价格/标记价格区间最低价格低于激活价格activatePrice,且最新合约价格/标记价高于等于最低价设定回调幅度。
|
||
卖出: 当合约价格/标记价格区间最高价格高于激活价格activatePrice,且最新合约价格/标记价低于等于最高价设定回调幅度。
|
||
TRAILING_STOP_MARKET 跟踪止损单如果遇到报错 {"code": -2021, "msg": "Order would immediately trigger."}
|
||
表示订单不满足以下条件:
|
||
|
||
买入: 指定的activatePrice 必须小于 latest price
|
||
卖出: 指定的activatePrice 必须大于 latest price
|
||
STOP_MARKET, TAKE_PROFIT_MARKET 配合 closePosition=true:
|
||
|
||
条件单触发依照上述条件单触发逻辑
|
||
条件触发后,平掉当时持有所有多头仓位(若为卖单)或当时持有所有空头仓位(若为买单)
|
||
不支持 quantity 参数
|
||
自带只平仓属性,不支持reduceOnly参数
|
||
双开模式下,LONG方向上不支持BUY; SHORT 方向上不支持SELL
|
||
selfTradePreventionMode 仅在 timeInForce为IOC或GTC或GTD时生效.
|
||
|
||
响应示例
|
||
{
|
||
"id": "06c9dbd8-ccbf-4ecf-a29c-fe31495ac73f",
|
||
"status": 200,
|
||
"result": {
|
||
"algoId": 3000000000003505,
|
||
"clientAlgoId": "0Xkl1p621E4EryvufmYre1",
|
||
"algoType": "CONDITIONAL",
|
||
"orderType": "TAKE_PROFIT",
|
||
"symbol": "BTCUSDT",
|
||
"side": "SELL",
|
||
"positionSide": "SHORT",
|
||
"timeInForce": "GTC",
|
||
"quantity": "1.000",
|
||
"algoStatus": "NEW",
|
||
"triggerPrice": "120000.00",
|
||
"price": "160000.00",
|
||
"icebergQuantity": null,
|
||
"selfTradePreventionMode": "EXPIRE_MAKER",
|
||
"workingType": "CONTRACT_PRICE",
|
||
"priceMatch": "NONE",
|
||
"closePosition": false,
|
||
"priceProtect": false,
|
||
"reduceOnly": false,
|
||
"createTime": 1762507264142,
|
||
"updateTime": 1762507264143,
|
||
"triggerTime": 0,
|
||
"goodTillDate": 0
|
||
},
|
||
"rateLimits": [
|
||
{
|
||
"rateLimitType": "REQUEST_WEIGHT",
|
||
"interval": "MINUTE",
|
||
"intervalNum": 1,
|
||
"limit": 2400,
|
||
"count": 1
|
||
}
|
||
]
|
||
} |