Node.js调用Binance API连续请求报timestamp超出recvWindow(-1021)错误
Node.js Binance交易程序触发-1021 timestamp超范围错误复现说明
固定问题表现
- 程序启动后的前若干次接口请求可正常返回预期结果
- 程序持续运行一段时间后,会稳定持续抛出接口错误,提示请求携带的timestamp超出允许的recvWindow范围,对应Binance接口错误码-1021
可复现代码逻辑
主程序入口文件
//main file const BinanceAPI = require(./BinanceAPI.js); const binanceAPI = new BinanceAPI(); let data = { p1: { tradePair: 'BNBBTC', tradePairData: { lastupdate: 1610127918784, b: '0.00102880', B: '48.80000000', a: '0.00102920', A: '2.35000000', u: 1178490919, }, bid: 0, } inArr: ['0.1000000'], outArr: [0.0024186200000000002], priceArr: ['0.0010520'], /// qtyArr: ['2.35000000'], bidArr: [0, 1, 0], }; async function executeTrade() { data.calculationEndTime = new Date().getTime(); data.id = data.p1.tradePair + '_' + data.calculationEndTime; if (data.bidArr[0] == 1) { binanceAPI.setNewOrder( data.p1.tradePair, data.outArr[0], data.priceArr[0], 'SELL', insertResponse(id, data.p1.tradePair), id ); } else { binanceAPI.setNewOrder( data.p1.tradePair, data.inArr[0], data.priceArr[0], 'BUY', insertResponse(id, data.p1.tradePair), id ); } } setInterval(executeTrade, 200);
Binance接口封装文件
//Binance API class BinanceAPI { constructor() { this.counter = 0; } async setNewOrder(symbol, quantitiy, price, side, cb, id) { let client = new Binance({ apiKey: API_KEY, apiSecret: API_SECRET, // getTime: this.getTime(this.timeOffset), }); client .order({ symbol: symbol, side: side, quantity: quantitiy, price: price, timeInForce: 'FOK', type: 'LIMIT', }) .then(cb) .catch(cb); } } module.exports = BinanceAPI;
核心问题诱因
- 代码中完全未启用客户端的时间偏移校准逻辑,注释掉的
getTime配置项正是binance-api-node用来校准本地时间与Binance服务端时间差的入口,缺失该逻辑时,每次请求携带的本地时间戳会随着本地系统时间漂移、网络传输延迟不断累积偏差 - 每次发起下单请求时都会重新实例化一个新的
Binance客户端,无法复用已校准的时间偏移参数,即使后续补充时间校准逻辑,每次新建客户端的操作也会导致已有的校准结果失效 setInterval设置的200ms高频调用间隔,会在网络波动时进一步放大时间偏差,当本地时间戳与服务端时间的差值超过默认允许的5000ms recvWindow阈值时,就会触发固定的-1021错误,且偏差会持续累积无法自动恢复
内容的提问来源于stack exchange,提问作者Parth Patoliya
相关产品推荐
相关产品推荐

