You need to enable JavaScript to run this app. Node.js调用Binance API连续请求报timestamp超出recvWindow(-1021)错误
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.09 01:15:08