交易

大约 11 分钟

常见下单失败错误及排查方法

如果您遇到了下单失败方面的问题,请首先参考以下回答排查。若以下回答不能解决您的问题,请联系我们open in new window排查故障。

为了更快为您定位问题,建议您准备好以下信息

  • 用户id
  • order_id(若有),可通过get_orders()查询
  • 完整错误信息及报错的代码(若在QQ群等公众平台反馈问题,请务必注意在发布前屏蔽您的隐私信息)
  • 下单时段
  • 账户类别(环球、综合、模拟)
  • 市场及标的
  • 订单类型(市价、限价等)

下单失败排查方法

若程序抛出异常,请对照下文的常见错误消息检查问题,若不能解决问题,请联系我们open in new window。若程序无报错,请根据以下方法检查被拒单的原因:

订单状态是异步更新的,因此,如果下单失败,请使用get_order再次查询订单,订单内会标记失败原因。可以根据以下示例,在create_order, place_order, get_order 三个环节之后分别查看Order对象,比较其差异,并查询下单失败原因。

1. create order 创建订单环节

没有全局id,只有账户相关的order_id,status 为 NEW

Order({'account': 'U523', 'id': None, 'order_id': 297, 'parent_id': None, 'order_time': None, 'reason': None, 'trade_time': None, 'action': 'BUY', 'quantity': 100, 'filled': 0, 'avg_fill_price': 0, 'commission': None, 'realized_pnl': None, 'trail_stop_price': None, 'limit_price': 0.1, 'aux_price': None, 'trailing_percent': None, 'percent_offset': None, 'order_type': 'LMT', 'time_in_force': None, 'outside_rth': None, 'contract': ES/None/USD, 'status': 'NEW', 'remaining': 100}) 

2. place order 发送订单

生成全局id,status 仍为 NEW。palce order 之后的 Order 对象中只增加了 id。如果需要获取最新的订单状态,需要使用 get_order 进行查询

Order({'account': 'U523', 'id': 154758864761483264, 'order_id': 297, 'parent_id': None, 'order_time': None, 'reason': None, 'trade_time': None, 'action': 'BUY', 'quantity': 100, 'filled': 0, 'avg_fill_price': 0, 'commission': None, 'realized_pnl': None, 'trail_stop_price': None, 'limit_price': 0.1, 'aux_price': None, 'trailing_percent': None, 'percent_offset': None, 'order_type': 'LMT', 'time_in_force': None, 'outside_rth': None, 'contract': ES/None/USD, 'status': 'NEW', 'remaining': 100})

3. get order 获取订单状态

status 变更为 REJECTED,且 reason 中增加了订单被拒绝的原因

Order({'account': 'U523', 'id': 154758864761483264, 'order_id': 297, 'parent_id': 0, 'order_time': 1550115294556, 'reason': '201:Order rejected - Reason: YOUR ORDER IS NOT ACCEPTED. MINIMUM OF 2000 USD (OR EQUIVALENT IN OTHER CURRENCIES) REQUIRED IN ORDER TO PURCHASE ON MARGIN, SELL SHORT, TRADE CURRENCY OR FUTURE', 'trade_time': 1550115294694, 'action': 'BUY', 'quantity': 100, 'filled': 0, 'avg_fill_price': 0, 'commission': 0, 'realized_pnl': 0, 'trail_stop_price': None, 'limit_price': 0.1, 'aux_price': None, 'trailing_percent': None, 'percent_offset': None, 'order_type': 'LMT', 'time_in_force': 'DAY', 'outside_rth': True, 'contract': ES, 'status': 'REJECTED', 'remaining': 100})

以下为常见错误类型列表:

1.错误提示:standard account response error(bad_request:Orders cannot be place at this moment)

错误原因1

无交易权限

解决方法

如果是新注册的账号,请先确认当前账号有没有完成手机、人脸、银行卡验证,若未验证,请先在手机端APP上完成人脸识别和国内银行卡验证

错误原因2

当前时段不可下单

解决方法

遇到此错误时,请首先检查您下单的时间,并与对应市场交易时间对照。注意:市场交易时间可能受到交易所所在地区公共节假日的影响,请结合交易所官网公告进行判断

  • 若您使用的是模拟账户

    模拟账户目前不支持部分市场及品类的盘前盘后及预挂单交易。请暂时修改程序尝试在正常交易时段进行下单,同时可以向我们反馈问题open in new window

  • 若您使用的是综合账户

    综合账户不支持部分订单类型的盘前、盘后交易及预挂单交易。关于支持的订单类型,请见支持的订单类型列表


2.错误提示:standard account response error(BAD_REQUEST:You cannot place market or stop order during pre-market and after-hours trading)

错误原因

盘前盘后交易时不可下市价单和止损单

解决方法

检查下单时间,请注意对应的时区,并根据交易时间更改订单类型。关于支持的订单类型及交易时段,请见支持的订单类型列表


3.错误提示:The order quantity you entered exceeds your currently available position

错误原因

下卖单数量超过您当前可用仓位

解决方法

若需要从做多调整为做空,请先调用接口检查仓位并下单平仓,在平仓后再下卖单进行做空


4.错误提示:standard account response error(bad_request:We don’t support trading of this stock now(Error Code 4))

错误原因

传入了不可交易的股票代码

解决方法

可以使用手机APP确认标的的交易状态,或通过行情接口检查股票交易状态后再进行下单操作


5.错误提示:status=illegal_price, msg=Sorry, your order price does not match the tick size: 0.05

错误原因

价格不符合minTick的最小变动单位值

解决方法

可以用综合账号或者模拟账号查询合约,合约接口返回tickSizes字段包含不同价格档位的minTick值。SDK提供StockPriceUtils工具类可以判断限价价格是否符合要求,可以向上或者向下修复价格使其符合minTick要求。示例代码:

    ContractModel model = new ContractModel("00700");
    ContractRequest contractRequest = ContractRequest.newRequest(
        model, "402901");
    Double limitPrice = 352.3344d;
    ContractResponse contractResponse = client.execute(contractRequest);
    if (contractResponse.isSuccess() && contractResponse.getItem().getTickSizes() != null) {
      List<TickSizeItem> tickSizes = contractResponse.getItem().getTickSizes();
      System.out.println(JSONObject.toJSONString(tickSizes));
      boolean match = StockPriceUtils.matchTickSize(limitPrice, tickSizes);
      if (!match) {
        // limitPrice:352.3344, fixed limitPrice(increments the price):352.4
        System.out.println("limitPrice:" + limitPrice + ", fixed limitPrice(increments the price):"
            + StockPriceUtils.fixPriceByTickSize(limitPrice, tickSizes, true));

        // limitPrice:352.3344, fixed limitPrice(decrease the price):352.2
        System.out.println("limitPrice:" + limitPrice + ", fixed limitPrice(decrease the price):"
            + StockPriceUtils.fixPriceByTickSize(limitPrice, tickSizes, false));
      }
    }

其他错误

使用合约接口获取股票合约的multiplier和minTick,去配置港股订单的total_quantity和limit_price,导致下单失败

解决方法

需要调用获取股票交易信息接口,获取每手股票数(lotSize)和股价最小变动单位(minTick)来计算total_quantity,否则可能出现不是lotSize的整数倍,导致下单失败。另外合约接口返回的multiplier实际是给期货用的,综合账户合约返回的min_tick只是简单获取了最小值,实际会根据价格段调整。

如何判断订单是部分成交状态?

如何判断综合和模拟账号的部分成交状态?

当订单状态不是Initial和Filled(有可能是PendingSubmit,Submitted,Cancelled,Invalid,Inactive其中一种)时,都有可能是部分成交的状态,可以通过订单成交数量是否大于0来判断

如何判断环球账号部分成交状态?

订单状态是 Filled,且订单成交数量大于0

支持交易的订单类型

美国

股票, ETFs

订单类型时效盘中盘前盘后预挂单
限价单DAY/GTC
市价单DAY/GTC××
止损限价单DAY/GTC
止损单DAY/GTC×
条件订单DAY/GTC××
附加订单DAY/GTC××
括号订单DAY/GTC
跟踪止损订单DAY/GTC××
TWAP/VWAP订单根据订单类型××

期权

订单类型时效盘中预挂单
限价单DAY/GTC
市价单DAY×
止损限价单DAY/GTC
括号订单DAY/GTC
附加订单根据订单类型×
括号订单根据订单类型×

期货

订单类型时效盘中预挂单
限价单DAY/GTC
市价单DAY/GTC×
止损限价单DAY/GTC
止损单DAY/GTC
条件订单DAY/GTC×
附加订单DAY/GTC×
括号订单DAY/GTC×

香港

收盘后有安全时间,安全时间内不允许预挂单

股票,ETFs

订单类型时效盘中预挂单
限价单DAY/GTC
市价单DAY/GTC×
止损限价单DAY/GTC
止损单DAY/GTC
条件订单DAY/GTC×
附加订单DAY/GTC
括号订单DAY/GTC
盘前竞价单DAY/GTC×
追踪止损单根据订单类型×
TWAP/VWAP订单根据订单类型×

期权

订单类型时效盘中预挂单
限价单DAY/GTC
市价单DAY×
止损限价单DAY/GTC
止损单DAY/GTC

窝轮、牛熊证

订单类型时效盘中预挂单
限价单DAY/GTC
止损限价单DAY/GTC×
条件订单DAY/GTC×
附加订单根据订单类型×
括号订单根据订单类型×

新加坡

收盘后有安全时间,安全时间内不允许预挂单

股票,ETFs

订单类型时效盘中
限价单DAY/GTC
市价单DAY/GTC
止损限价单DAY/GTC
止损单DAY/GTC
条件订单DAY/GTC
附加订单DAY/GTC
括号订单DAY/GTC
追踪止损订单DAY/GTC

澳大利亚

收盘后有安全时间,安全时间内不允许预挂单

股票,ETFs

订单类型时效盘中
限价单DAY/GTC
市价单DAY/GTC
止损限价单DAY/GTC
止损单DAY/GTC
条件订单DAY/GTC
附加订单DAY/GTC
括号订单DAY/GTC
追踪止损订单DAY/GTC

交易时间

A股

只有当沪深港三个交易市场都开市的情况下,才能进行沪股通、深股通的交易。 沪股通、深股通的交易时间为:沪深港3个市场都开市的交易日

上午9:30-11:30;下午13:00-15:00

美股

美东时间:

盘前:04:00-9:30;盘中:09:30-16:00;盘后:16:00-20:00。

北京时间:

夏令时:盘前:16:00-21:30;盘中:21:30-04:00;盘后:04:00-08:00

冬令时:盘前:17:00-22:30;盘中:22:30-05:00;盘后:05:00-09:00

港股

开市前时段

时段交易规则
输入买卖盘时段9:00-9:15可以提交、修改、取消竞价市价单及竞价限价单
不可取消时段9:15-9:20只可以提交竞价市价单和竞价限价单,不可进行撤单、改单
随机对盘时段9:20-9:22(对盘会按最终参考平衡价格随机于 9:20-9:22 开始)进行竞价时段的撮合对盘
暂停时段,随机对盘结束-9:30竞价盘: 未完成的买卖盘会被系统取消;竞价限价盘:未完成的买卖盘若输入价格范围不偏离按盘价九倍或以上,将转为限价盘并自动转至持续交易时段

持续交易时段

时段时间
早市9:30-12:00
中午休市12:00-13:00
午市13:00-16:00

注意:中午休市时段不允许进行改单,12:30-13:00允许进行撤单。

收市竞价交易时段

时段交易规则
收市竞价时段 16:00-16:01计算及公布参考价;不可提交订单
输入买卖盘16:01-16:06可以提交、修改、取消竞价市价单及竞价限价单,竞价限价单价格限制不得超出参考价的±5%
不可取消 16:06-16:08可以提交竞价市价单及竞价限价单,不可取消及更改;竞价限价单输入价格必须在最低沽盘价与最高买盘价之间
随机收市 16:08-16:10随机收市时段,仍可提交竞价市价单及竞价限价单,不可取消及更改;竞价限价单输入价格必须在最低沽盘价与最高买盘价之间

新加坡

时段全天交易半天交易
开市时间
开市前8:30 - 8:58/ 8:59*8:30 - 8:58 /8:59*
不可撤销8:58 / 8:59 - 9:008:58 / 8:59 - 9:00
交易9:00 - 12:009:00 - 12:00
午休
开市前12:00 - 12:58 / 12:59*
不可撤销12:58 / 12:59 - 13:00
交易13:00 - 17:00
休市时间
休市前17:00 - 17:04 / 17:05*12:00 - 12:04 / 12:05*
不可撤销17:04/ 17:05* - 17:0612:04 / 12:05* - 12:06
休市前交易17:06 - 17:1612:06 - 12:16
休市17:1612:16

澳大利亚

澳洲市场交易时间为周一至周五,时间如下: 澳大利亚东部标准时间 10am - 4pm

期货交易时间

按照交易所的规定,不同期货品种交易时间不同,详情请在老虎交易软件中查看。具体以交易所公告为准。

美期货

芝加哥商品交易所

商品类型交易时间
股指期货周一至周五,9:30 - 次日4:00(闭市休息:16:15 - 16:30)
农产品期货周一至周五,9:30 - 次日2:00(闭市休息:13:15 - 14:00)
能源期货周一至周五,9:00 - 次日2:30(闭市休息:13:15 - 14:00)
金属期货周一至周五,8:00 - 次日1:00(闭市休息:13:15 - 14:00)

香港期货

商品类型交易时间
香港期货周一至周五,9:00 - 16:30

日本期货

商品类型交易时间
日本期货周一至周五,8:45 - 15:30

新加坡期货

商品类型交易时间
新加坡期货周一至周五,9:00 - 17:15

请注意,以上交易时间仅供参考,具体的交易时间可能会根据季节变化、节假日等因素进行调整。建议您在进行交易前,查阅官方或相关交易所的最新公告以获取准确的交易时间信息

上次编辑于: