2016-06-20 17 views
1

我正在使用Matlab內置的Interactive Broker庫來連接和使用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#多線程,並節省你自己頭痛的時間)