确认在TWS c ++ API中至关重要吗?



我的问题

在盈透证券TWS c++ API(或一般的事件驱动编程中(中,何时将状态/模式(这在TWS API中m_state(更改为"确认"状态至关重要?根据此变量的状态,将调用不同的类方法。在其中一个方法的定义结束时,状态将更改回确认状态,这似乎允许主机接收消息。我可以将m_state更改为其他内容,并完全跳过确认过程吗?

为不了解TWS API的用户提供的一些背景信息

(请随意忽略此部分(

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

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

一方面,每当经纪人决定调用它们时,经纪人就会触发一堆方法,而您作为客户可能会也可能不会利用所提供的信息。

但另一方面,有一堆方法是由我的客户端代码触发的。根据m_state的值,触发不同的类方法。在 IB 提供的示例代码中,即在我的TestCppClient类中,这些函数中的大多数都提供了一些有用的演示代码,更重要的是,这些函数中的大多数都有最后一行将m_state的值设置为以_ACK结尾的东西(我相信,这是一种套接字编程约定,是"确认"的缩写。

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

m_state = ST_REUTERSFUNDAMENTALS_ACK;

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

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

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

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

这些行显然处理一些低级套接字编程的东西。

重申我的问题

因此,如果我不将状态更改为确认状态,则最后三行将不会运行。但这会是一件坏事吗?有人有这方面的经验吗?有什么轶事信息吗?

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

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

处理EReader很痛苦,但是一旦应用程序正常工作,就可以将代码复制并粘贴到其他应用程序中。

是的,您只需删除所有m_state开关即可。 您可能会注意到m_stateST_部分(开始(最终在函数nextValidId()中被触发。在processMessages()函数中,ST条件调用客户端函数,之后,m_state被翻转到ACK然后中断 - 只有相关的部分,如果你要使用processMessages()来处理msg que是m_osSignal.waitForSignal(); errno = 0; m_pReader->processMsgs();可以在processMessages()之外调用。基本上,当使用任何功能时,您可以注释掉所有m_state开关。 但仍然需要等待信号,根据需要处理消息。似乎m_state只是方便测试平台和快速测试功能,只评论/取消评论你想玩的东西。

相关内容

  • 没有找到相关文章

最新更新