跳转至

02.常见问题答疑

订单立即部分成交后未收到XTF_OS_Queuing的Order消息

如订单发送后,立即部分成交或全部成交,将不会产生“未成交还在队列”的Queuing状态,onOrder直接进入PartTraded或AllTraded状态。

开平标志说明

不通交易所有各自的规则,目前情况如下:

  1. 对于中金所、大商所、广期所,请求填Close 、CloseToday、CloseYesterday时,都转化为Close,交易所默认先平昨后平今;回报返回Close;如果平仓错误,柜台会将客户填入的com_offset_flag再返回给客户。
  2. 对于上期所、能源所时,平今只能用CloseToday,回报返回的是CloseToday;平昨可以使用Close、CloseYesterday,都转化为CloseYesterday,回报中是closeyesterday;如果平仓错误,柜台会将客户填入的com_offset_flag再返回给客户。

在上述规则下,释放仓位时,遵循先成交的仓,先被平的规则。

回报中OrderLocalNo收到负值

  1. 柜台清流启动后的历史报单OrderLocalNo固定为“0xd8888888”
  2. 非本柜台报单OrderLocalNo固定为“0x88888888”
  3. 错误为1172,“请求中的报单编号不存在”时,返回0
  4. 本柜台Monitor管理端平仓的客户端报单编号固定为“0xe8888888”
  5. 其他情况返回订单真实编号

actionlocalno收到负值

非本柜台报单固定为“0x86666666”

调用API时遇到 /sys/firmware/dmi/tables/smbios_entry_point: Permission denied 或者 /dev/mem: Permission denied 错误,或错误码为2058

根据看穿式监管的要求,投资者登录柜台时需要采集硬件信息,采集的时候需要调用dmidecode,没有赋予API root权限将会遇到该错误,解决方法如下:

  1. 赋予root权限,以sudo的方式运行程序
  2. 使用root用户增加dmidecode的s位,具体命令为chmod +s /usr/sbin/dmidecode,这样就可以用普通用户权限得到看穿式监管需要的信息

以上两种方案均可解决获取权限失败的问题,请用户根据实际情况选择处理。

如使用crontab任务执行,需在执行脚本或计划任务命令中添加export PATH=${PATH}:/usr/sbinsource /etc/profile指定dmidecode命令位置,。

TCP连接后,是否会发送心跳?

如果是初次建立TCP连接,而没有任何其他操作,API不会发送心跳数据。柜台在一段时间后,会断开该TCP连接。

如果用户登录后再登出,此时TCP连接依然保持,且会发送心跳数据。

如何获得合约属于哪个交易所?

首先根据合约ID查询XTFInstrument对象;\ 然后通过XTFInstrument的getExchange()接口,即可获得交易所对象;

示例代码:

C++
1
2
const XTFInstrument *instrument = api->getInstrumentByID(au2212);
const XTFExchange *exchange = instrument->getExchange();

如何获得交易日信息?

Text Only
1
2
首先获得交易所对象指针,对于双交易所随便使用哪个交易所对象都可以;
然后访问交易所对象的tradingDay字段(整数字符串),即可获得交易日信息;

示例代码:

C++
1
2
const XTFExchange *exchange = api->getExchange(0);
printf(Trading Day=%s\n, exchange->tradingDay);

如何获取最后一次报单的本地编号?

报单的本地编号是由用户自身维护的,一般在报单过程中是递增的,以保证编号的唯一性。如果API发生重启,最后一次的本地编号会丢失。API在重新登录柜台后,柜台会把上一次API报单的最后一个本地报单编号,返回给用户。可以通过下面的方法获取:

C++
1
2
XTFAccount *account;
XTFLocalOrderID lastID = account->lastLocalOrderID;

如何获得交易所报单通道号?

  1. 首先获得交易所对象指针,对于双交易所需要按需查询;
  2. 然后通过交易所对象的getChannelCount()查询交易所通道数量;
  3. 最后用getChannel(int pos)接口获得通道号的值;

示例代码:

C++
1
2
3
4
5
const XTFExchange *exchange = api->getExchange(0);
int count = exchange->getChannelCount();
for (int i = 0; i < count; ++i) {
    printf(channel id: %d\n, exchange->getChannel(i);
}

裸协议报单后收不到API回报

  1. 未登录或者登录掉线后的报单将无法收到回报
  2. MessageId错误
  3. clientindex或token错误,可通过以下方法获取

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
///4.1版本API
void onLogin(errorCode, exchangeCount){
   /// 在登录响应的中获取交易所数目
   m_exchangeCnt = exchangeCount;
   /// 根据交易所数目获取对应交易所的ClientIndex和token数据
   for(i = 0; i < m_exchangeCnt; i++) {
   XTFExchange* pEx = mApi->getExchange(i);
     m_clientIndex = pEx->clientIndex;
     m_clientToken = pEx->clientToken;
   }
}
C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
///3.3版本API
void OnRspUserLogin(pRspUserLogin){
    /// 在登录响应的中获取ClientIndex
    m_clientIndex = pRspUserLogin->ClientIndex; 
    /// 根据ClientIndex获取token信息
    m_token = pTraderApi->GetClientToken(m_clientIndex);
    /// 用户根据实际情况获取自己所有需要的合约序号;
    for() {
      m_instrumentIndex = pTraderApi->GetInstrumentIndex(instrumentID);
    }
    /// 用户也可以调用异步查询接口, 然后在合约序号响应接口中获取自己需要的合约序号;
}

API登录提示错误的资金账号

资金账号填写错误或API更换accountid未重新初始化

获取不到合约涨跌停价时,该合约不支持自成交风控

使用investorid作为accountid登录柜台后,accountid变成investor_1

  1. API登录AccountID不以_结尾的客户账号都识别替换为_1结尾
  2. API登录AccountID以_3、_4、_5结尾的客户账号都识别替换为_2结尾

大量回报接收时,出现TCP断链

TCP链接的缓存区大小受内核参数影响,柜台在某些极速场景下,可能会由于客户端接收缓存区不足而导致断链,可以在配置文件中 /etc/sysctl.conf 增加如下配置即可:

Text Only
1
2
3
4
5
net.core.rmem_default = 8388608
net.core.wmem_max=655360000
net.core.rmem_max=873800000
net.ipv4.tcp_rmem =819200 87380000 873800000
net.ipv4.tcp_wmem =409600 65536000 655360000

“3.3 API”的结构体定义和“协议报单”的结构体定义,同名结构体定义有差别(例如“struct CXeleFtdcOrderField”)。使用时,应该以哪边的为准呢?

裸协议报单,用协议报单的结构体定义;API报单,用API头文件里面的定义。