Matlab IB 实时数据在一段时间后卡住
Matlab IB realtime data gets stuck after a while
我正在使用 Matlab 内置的 Interactive Broker 库来连接和使用 TWS。我正在尝试请求实时数据,但是,一段时间后它就停留在相同的价格上。它会正常更新几分钟,然后它就会停止更新并给出相同的价格。
我的代码有问题吗?
try
close(ib);
close(conn);
catch
end
clear all;
ibBuiltInRealtimeData = struct('id',0,'BID_PRICE',0,'BID_SIZE',0,'ASK_PRICE',0,'ASK_SIZE',0);
ib = ibtws('',7496);
f = '233';
ibContract = ib.Handle.createContract;
ibContract.symbol = 'EUR';
ibContract.secType = 'CASH';
ibContract.exchange = 'IDEALPRO';
ibContract.primaryExchange = '';
ibContract.currency = 'USD';
ibContract2 = ib.Handle.createContract;
ibContract2.symbol = 'M6E';
ibContract2.secType = 'FUT';
ibContract2.exchange = 'GLOBEX';
ibContract2.primaryExchange = '';
ibContract2.currency = 'USD';
ibContract2.expiry = '201609';
contracts = {ibContract;ibContract2};
tickerid = realtime(ib,contracts,f);
while true
d2 = ibBuiltInRealtimeData
tickerid
pause(1)
end
这可能是由于网络问题导致 Matlab 的连接器卡在无效状态,或者 IB 的服务器可能已卡住。您可以尝试断开与 IB 的连接,然后重新连接并重新请求实时数据 - 也许这会重置连接问题并从那时起向您发送良好的数据。
或者,尝试使用 IB-Matlab 连接器 (http://UndocumentedMatlab.com/IB-Matlab),据说它更可靠。
如果您使用自定义事件处理程序,您通常可以绕过导致此函数挂起的交易工具箱中有问题的代码。
try
close(ib);
close(conn);
catch
end
clear all;
global simpleStructure
simpleStructure=struct;
ib = ibtws('',7496);
f = '233';
ibContract = ib.Handle.createContract;
ibContract.symbol = 'EUR';
ibContract.secType = 'CASH';
ibContract.exchange = 'IDEALPRO';
ibContract.primaryExchange = '';
ibContract.currency = 'USD';
ibContract2 = ib.Handle.createContract;
ibContract2.symbol = 'M6E';
ibContract2.secType = 'FUT';
ibContract2.exchange = 'GLOBEX';
ibContract2.primaryExchange = '';
ibContract2.currency = 'USD';
ibContract2.expiry = '201609';
contracts = {ibContract;ibContract2};
tickerid = realtime(ib,contracts,f, @yourEventHandler);
function yourEventHandler(varargin)
global simpleStructure;
id=num2str(varargin{3});
switch varargin{4}
case 0; simpleStructure.(['i' id]).BID_SIZE=varargin{5};
case 1; simpleStructure.(['i' id]).BID_PRICE=varargin{5};
case 2; simpleStructure.(['i' id]).ASK_PRICE=varargin{5};
case 3; simpleStructure.(['i' id]).ASK_SIZE=varargin{5};
end
end
不需要使用全局变量,只是为了简单起见。我经常使用静态方法作为事件处理程序,并将其他所有内容包装在 class 中。除非你是多线程的,否则这并不重要。 (如果您是多线程的,只需使用 java 或 c# 即可节省数小时的头痛)
我正在使用 Matlab 内置的 Interactive Broker 库来连接和使用 TWS。我正在尝试请求实时数据,但是,一段时间后它就停留在相同的价格上。它会正常更新几分钟,然后它就会停止更新并给出相同的价格。
我的代码有问题吗?
try
close(ib);
close(conn);
catch
end
clear all;
ibBuiltInRealtimeData = struct('id',0,'BID_PRICE',0,'BID_SIZE',0,'ASK_PRICE',0,'ASK_SIZE',0);
ib = ibtws('',7496);
f = '233';
ibContract = ib.Handle.createContract;
ibContract.symbol = 'EUR';
ibContract.secType = 'CASH';
ibContract.exchange = 'IDEALPRO';
ibContract.primaryExchange = '';
ibContract.currency = 'USD';
ibContract2 = ib.Handle.createContract;
ibContract2.symbol = 'M6E';
ibContract2.secType = 'FUT';
ibContract2.exchange = 'GLOBEX';
ibContract2.primaryExchange = '';
ibContract2.currency = 'USD';
ibContract2.expiry = '201609';
contracts = {ibContract;ibContract2};
tickerid = realtime(ib,contracts,f);
while true
d2 = ibBuiltInRealtimeData
tickerid
pause(1)
end
这可能是由于网络问题导致 Matlab 的连接器卡在无效状态,或者 IB 的服务器可能已卡住。您可以尝试断开与 IB 的连接,然后重新连接并重新请求实时数据 - 也许这会重置连接问题并从那时起向您发送良好的数据。
或者,尝试使用 IB-Matlab 连接器 (http://UndocumentedMatlab.com/IB-Matlab),据说它更可靠。
如果您使用自定义事件处理程序,您通常可以绕过导致此函数挂起的交易工具箱中有问题的代码。
try
close(ib);
close(conn);
catch
end
clear all;
global simpleStructure
simpleStructure=struct;
ib = ibtws('',7496);
f = '233';
ibContract = ib.Handle.createContract;
ibContract.symbol = 'EUR';
ibContract.secType = 'CASH';
ibContract.exchange = 'IDEALPRO';
ibContract.primaryExchange = '';
ibContract.currency = 'USD';
ibContract2 = ib.Handle.createContract;
ibContract2.symbol = 'M6E';
ibContract2.secType = 'FUT';
ibContract2.exchange = 'GLOBEX';
ibContract2.primaryExchange = '';
ibContract2.currency = 'USD';
ibContract2.expiry = '201609';
contracts = {ibContract;ibContract2};
tickerid = realtime(ib,contracts,f, @yourEventHandler);
function yourEventHandler(varargin)
global simpleStructure;
id=num2str(varargin{3});
switch varargin{4}
case 0; simpleStructure.(['i' id]).BID_SIZE=varargin{5};
case 1; simpleStructure.(['i' id]).BID_PRICE=varargin{5};
case 2; simpleStructure.(['i' id]).ASK_PRICE=varargin{5};
case 3; simpleStructure.(['i' id]).ASK_SIZE=varargin{5};
end
end
不需要使用全局变量,只是为了简单起见。我经常使用静态方法作为事件处理程序,并将其他所有内容包装在 class 中。除非你是多线程的,否则这并不重要。 (如果您是多线程的,只需使用 java 或 c# 即可节省数小时的头痛)