2016-06-20 3 views
1

Я использую встроенную библиотеку Interactive Broker Matlab для подключения и использования TWS. Я пытаюсь запросить данные в реальном времени, однако через некоторое время он просто застревает по той же цене. Он обновляется нормально в течение нескольких минут, а затем он просто прекращает обновление и выдаются одни и те же цены.Данные в реальном времени Matlab IB застряли через некоторое время

С кодом нет в коде?

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 

ответ

2

Это может быть вызвано либо вопрос сети, вызвавшим разъем MatLab, чтобы застрять в недопустимом состоянии, или сервер IB, что, возможно, застряли. Вы можете попытаться отключиться от IB, а затем повторно подключить и повторно запросить данные в реальном времени - возможно, это сбросит проблему подключения и отправит вам хорошие данные с этой точки.

В качестве альтернативы попробуйте использовать разъем IB-Matlab (http://UndocumentedMatlab.com/IB-Matlab), который, как сообщается, более надежный.

0

Если вы используете специальный обработчик событий, вы обычно можете обойти проблемный код в панели инструментов трейдера, которая заставляет эту функцию зависать.

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 

Использование глобалов не требуется, просто используется для простоты. Я часто использую статический метод в качестве обработчика события и переношу все остальное в класс. Если вы не многопоточность, это не имеет большого значения. (если вы многопоточность, просто используйте java или C# и спасите себя от головных болей)

Смежные вопросы