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# 即可节省数小时的头痛)