我认为这个问题需要了解Interactive Broker随API一起提供的C#示例应用程序是如何工作的。我试图修改IB的示例C#应用程序,该应用程序随API一起提供,以请求多个历史数据系列,但我遇到了多个问题。似乎我需要让程序等到当前的数据请求完成后再提交第二个,第三个。等等等等。如果我添加以下代码(假设我添加了一个按钮来启动该过程),第二个请求似乎“运行”第一个请求,扰乱了应用程序中每个系列生成的图表。即数据合并到一个图表中。此外,过多的请求导致IB开始拒绝数据请求的竞争条件。本例中的代码为:
private void button7_Click(object sender, EventArgs e)
{
if (IsConnected)
{
srInputTickerFile = new StreamReader(stInputTickerFileName);
if (!inputTickerFileOpenFlag)
{
srInputTickerFile = new StreamReader(stInputTickerFileName);
inputTickerFileOpenFlag = true;
}
while (srInputTickerFile.Peek() >= 0)
{
String line = srInputTickerFile.ReadLine();
String[] lineSplit = line.Split(',');
string ticker = lineSplit[0];
string timeDateTo = lineSplit[1];
string myDuration = lineSplit[2];
string myBarSize = lineSplit[3];
string myWhatToShow = lineSplit[4];
int myRTH = Int32.Parse(lineSplit[5]);
Contract contract = GetMDContractForHistorical(line);
contract.ConId = histCounter + 1;
string endTime = hdRequest_EndTime.Text.Trim();
string duration = hdRequest_Duration.Text.Trim() + " " +
hdRequest_TimeUnit.Text.Trim();
string barSize = hdRequest_BarSize.Text.Trim();
string whatToShow = hdRequest_WhatToShow.Text.Trim();
int outsideRTH = contractMDRTH.Checked ? 1 : 0;
historicalDataManager.AddRequest(contract, timeDateTo, myDuration,
myBarSize, myWhatToShow, myRTH, 1, cbKeepUpToDate.Checked);
historicalDataTab.Text = Utils.ContractToString(contract) + " (HD)";
ShowTab(marketData_MDT, historicalDataTab);
}
srInputTickerFile.Close();
}
}
我也尝试过其他方法,比如在函数调用后添加
historicalDataManager.AddRequest
下面的代码,以便它可以处理请求。
System.Threading.Thread.Sleep(3000);
这里的问题似乎是应用程序将控制权传递回UI线程来处理图形,从而阻止了图表的显示。
如果我尝试使用后台工作线程,并将代码的“while”部分放入其中。也就是说
new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;
//while code above goes here
}).Start();
此代码在historicalDataManager.AddRequest
处给予错误,因为它驻留在UI线程上,而不是工作线程上。如果我在while循环中添加代码来更新应用程序中的文本框,它也会生成错误,因为它们驻留在UI线程中。
所以我想可以归结为:
1.如何正确地节流数据请求。
1.如果使用后台工作线程,如何访问IB应用程序中UI线程上的函数调用。
1条答案
按热度按时间i7uaboj41#
所以我想可以归结为:1)如何正确地节流数据请求。2)如果使用后台工作线程,如何访问IB应用中的UI线程上的函数调用。
**1)如何正确地节流数据请求。**这取决于你想走多远。如果你想要一个简单的解决方案,你可以使用...
为了完全控制所有请求,并保持50/秒的API消息限制和6/min(软)或历史数据请求的短期突发限制,我建议至少2个基于生产者/消费者模型的独立线程。
一个基本的大纲,让你开始如下...(替代上述任务延迟)
要使用,请在UI窗体中
2)如果使用后台工作线程,如何访问IB应用中UI线程上的函数调用。
iBclient类在单独的线程上运行,并将事件和数据发送回UI线程。这意味着你的UI线程只在接收到数据的时候才工作,而不需要在UI线程上执行Thread.Sleep或DoEvents。
您可以通过注册如下所示在UI线程上接收这些事件…