确认在 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提供的示例代码中,也就是在我的TestCppClient
class中,这些函数中的大部分都提供了一些有用的演示代码,而且更切合我的问题,这些函数中的大多数都有最后一行将 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_pReader
是 EReader
class 的实例,它读取传入数据并生成消息。因为在自己的线程中运行,所以需要特殊处理。
checkClient
函数告诉 EReader
将传入数据打包到 EMessage
中并将消息存储在消息队列中。但是在 waitForSignal
函数 returns 之前,应用程序无法访问队列。之后,processMsgs
读取 EMessage
并调用适当的回调函数。
处理 EReader
是一件痛苦的事情,但是一旦您的应用程序开始运行,您就可以将代码复制并粘贴到其他应用程序中。
我的问题
在 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提供的示例代码中,也就是在我的TestCppClient
class中,这些函数中的大部分都提供了一些有用的演示代码,而且更切合我的问题,这些函数中的大多数都有最后一行将 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_pReader
是 EReader
class 的实例,它读取传入数据并生成消息。因为在自己的线程中运行,所以需要特殊处理。
checkClient
函数告诉 EReader
将传入数据打包到 EMessage
中并将消息存储在消息队列中。但是在 waitForSignal
函数 returns 之前,应用程序无法访问队列。之后,processMsgs
读取 EMessage
并调用适当的回调函数。
处理 EReader
是一件痛苦的事情,但是一旦您的应用程序开始运行,您就可以将代码复制并粘贴到其他应用程序中。