确认在 TWS c++ 中很重要 API

Is acknowledgement critical in TWS c++ API

我的问题

在 Interactive Brokers TWS c++ API,(或者在一般的事件驱动编程中)什么时候更改 state/mode 是关键的(这是 m_state 在 TWS API) 到 "acknowledgement?" 的状态,根据这个变量的状态,调用不同的 class 方法。在这些方法之一的定义结束时,状态变回确认状态,这似乎允许主机接收消息。我可以将 m_state 更改为其他内容,并完全跳过确认过程吗?

为不了解交易平台的人提供的一些背景信息API

(请忽略此部分)

Interactive Brokers 的 TWS C++ API 有数万行代码,所以让我试着描述一下我认为最基本的功能是什么。

我在 Main.cpp 中的程序入口点实例化一个客户端对象,然后在 while 循环的每次迭代中一遍又一遍地重复调用它的 void TestCppClient::processMessages() 方法。

一方面,有许多方法会在经纪人决定调用它们时被经纪人触发,作为客户,您可能会也可能不会利用所提供的信息。

但另一方面,我的客户端代码触发了很多方法。根据 m_state 的值,会触发不同的 class 方法。在IB提供的示例代码中,也就是在我的TestCppClientclass中,这些函数中的大部分都提供了一些有用的演示代码,而且更切合我的问题,这些函数中的大多数都有最后一行将 m_state 的值设置为以 _ACK 结尾的内容(我相信这是套接字编程约定,是 "acknowledgement." 的缩写)

例如,当m_state等于ST_REUTERSFUNDAMENTALS时,TestCppClient::processMessages()switch语句将触发TestCppClient::reutersFundamentals()。该方法定义的最后一行是

m_state = ST_REUTERSFUNDAMENTALS_ACK;

下一次 void TestCppClient::processMessages() 被触发,(如果你还记得的话,它一直被 while 循环触发)switch 语句被跳过,因为只有一个 break 语句:

...
case ST_REUTERSFUNDAMENTALS:
    reutersFundamentals();
    break;
case ST_REUTERSFUNDAMENTALS_ACK:
    break;
...

这个 switch 语句代码构成了这个函数定义中的大部分代码,但在 switch 语句之外的末尾有一小部分。在这种情况下 TestCppClient::procesMessages() 中 运行s 的唯一代码在最后,即

m_pReader->checkClient();
m_osSignal.waitForSignal();
m_pReader->processMsgs();

这些行显然处理一些低级套接字编程内容。

重申我的问题

所以,如果我没有将状态更改为确认状态,最后三行就不会 运行。但这会是一件坏事吗?有人对此有经验吗?任何轶事信息?

TestCppClient 示例在 IB/C++ 应用程序中相当复杂,但这三行很重要。 m_pReaderEReader class 的实例,它读取传入数据并生成消息。因为在自己的线程中运行,所以需要特殊处理。

checkClient 函数告诉 EReader 将传入数据打包到 EMessage 中并将消息存储在消息队列中。但是在 waitForSignal 函数 returns 之前,应用程序无法访问队列。之后,processMsgs 读取 EMessage 并调用适当的回调函数。

处理 EReader 是一件痛苦的事情,但是一旦您的应用程序开始运行,您就可以将代码复制并粘贴到其他应用程序中。