2017-03-15 5 views
1

Ibpy를 통해 대화 형 중개인 (IB)에서 내역 데이터를 얻으려고합니다. 나는이 작업을 위해 여러 스크립트를 시도했다. 그러나 그들 중 누구도 나를 위해 일하지 않습니다! 필자는 파이썬에 익숙하지 않으므로이 방법의 작동에 대한 완전한 통찰력을 갖지 못했다는 것을 인정합니다. 그러나 가장 확실한 수정을 시도해야합니다. 아래에서 필자는 두 가지 스크립트를 나열했습니다. 파이썬 2x를 사용하고 있습니다.IBPY의 reqHistoricalData가 아무 것도 반환하지 않음 [파이썬]

는 TWS에서 나는 다음과 같은 설정이 있습니다

확인 : 액티브 및 소켓 클라이언트를 사용합니다. 선택 취소 : DDE 클라이언트를 사용합니다. 선택 해제 됨 : 읽기 전용 API. 확인 : 연결시 미 체결 주문을 다운로드하십시오. 확인 : 포트폴리오를 보낼 때 FX 포지션을 포함합니다. 선택 : EEP에 대한 상태 업데이트를 보냅니다. 소켓 포트 = 7496. 확인 : 자동 주문을 바인드하려면 음수를 사용하십시오. 선택 취소 : API 메시지 로그 파일을 만듭니다. 선택 취소 : API 로그 파일에 마켓 데이터를 포함합니다. 로깅 수준 = 오류. 마스터 API 클라이언트 ID = 222입니다. API에 대량 데이터를 보내기위한 시간 초과는 30 초입니다. 구성 요소 Exch Separator = 공백입니다. 선택 : 로컬 호스트에서만 연결을 허용합니다.

API -주의 사항 확인 : API 주문 관련 주문 예방 조치. 이 탭에서는 모든 항목이 모두 선택 취소되어 있습니다.

파이썬 스크립트를 실행할 때 TWS 로그인 및 실행 중이며 위의 TWS API 설정은 다른 모든 사람들이 온라인에서 말하는 것과 비교할 때 올바른 것처럼 보입니다. 미국 주식 데이터에 등록 된 실제 IB 계좌가 있습니다. 또한 IBPY를 통해 주문하는 다른 스크립트를 실행하려했음을 언급해야합니다. 이는 문제가 역사적인 데이터를 얻는 것에 관한 것 (적어도 현재) 인 것처럼 보입니다.

스크립트 1 :

from time import sleep, strftime, localtime 
from ib.ext.Contract import Contract 
from ib.opt import ibConnection, message 


new_symbolinput = ['AAPL'] 
newDataList = [] 
dataDownload = [] 

def historical_data_handler(msg): 
    global newDataList 
    print (msg.reqId, msg.date, msg.close) 
    if ('finished' in str(msg.date)) == False: 
     new_symbol = new_symbolinput[msg.reqId] 
     dataStr = '%s, %s, %s' % (new_symbol, strftime("%Y-%m-%d", localtime(int(msg.date))), msg.close) 
     newDataList = newDataList + [dataStr] 
    else: 
     new_symbol = new_symbolinput[msg.reqId] 
     filename = 'minutetrades' + new_symbol + '.csv' 
     csvfile = open('IBdata/' + filename,'w') 
     for item in newDataList: 
      csvfile.write('{} \n'.format(item)) 
     csvfile.close() 
     newDataList = [] 
     global dataDownload 
     dataDownload.append(new_symbol) 


con = ibConnection(port=7496, clientId=222) 
con.register(historical_data_handler, message.historicalData) 
con.connect() 

symbol_id = 0 
for i in new_symbolinput: 
    print (i) 
    qqq = Contract() 
    qqq.m_symbol = i 
    qqq.m_secType = 'STK' 
    qqq.m_exchange = 'SMART' 
    qqq.m_currency = 'USD' 
    con.reqHistoricalData(symbol_id, qqq, '20161101', '1 W', '1 D', 'MIDPOINT', 1, 2) 

    symbol_id = symbol_id + 1 
    sleep(10) 

print (dataDownload) 
filename = 'downloaded_symbols.csv' 
csvfile = open('IBdata/' + filename,'w') 
for item in dataDownload: 
    csvfile.write('%s \n' % item) 
csvfile.close() 

이 csv 파일의 데이터를 반환해야합니다. CSV 파일이 생성되었지만 비어 있습니다.

응답 :

Server Version: 76 
TWS Time at connection:20170315 14:18:06 CET 
AAPL 
[] 

그래서 분명히 아무것도 반환하지 않습니다.

스크립트 2 : 여기

from time import sleep, strftime 
from ib.ext.Contract import Contract 
from ib.opt import ibConnection, message 

def my_account_handler(msg): 
    print(msg) 

def my_tick_handler(msg): 
    print(msg) 

def my_hist_data_handler(msg): 
    print(msg) 


if __name__ == '__main__': 

    con = ibConnection(port=7496,clientId=222) 
    con.register(my_account_handler, 'UpdateAccountValue') 
    con.register(my_tick_handler, message.tickSize, message.tickPrice) 
    con.register(my_hist_data_handler, message.historicalData) 
    con.connect() 

    print(con.isConnected()) 

    def inner(): 

     qqqq = Contract() 
     qqqq.m_secType = "STK" 
     qqqq.m_symbol = "AAPL" 
     qqqq.m_currency = "USD" 
     qqqq.m_exchange = "SMART" 
     endtime = strftime('%Y%m%d %H:%M:%S') 
     print(endtime) 
     print(con.reqHistoricalData(1,qqqq,endtime,"1 W","1 D","MIDPOINT",1,2)) 



    sleep(10) 

    inner() 
    sleep(5) 
    print('disconnected', con.disconnect()) 
    print(con.isConnected()) 

응답 :

Server Version: 76 
TWS Time at connection:20170315 14:29:53 CET 
True 
20170315 14:30:05 
None 
('disconnected', True) 
False 

다시 아무것도 반환하지 않습니다. 나는 그것이 다른 사람들을 위해 일하는 것처럼 보이는 이유를 모른다. 필자는 Python을 처음 접했을 때 뭔가 근본적으로 놓친 것일까?

모든 도움을 주시면 대단히 감사하겠습니다.

답변

0

항상 오류 처리기를 구현하면 API가 잘못된 것을 알려줍니다. 이 경우 막대 크기에 "1 일"을 사용합니다.

잠을 잘 필요가 없습니다. 연결이 언제 준비되는지 알고 싶으면 nextValidId을 사용하십시오.다른 끝 방법을 사용하여 완료 시점을 알 수 있습니다. historicalDataEnd은 아직 IBpy에서 구현되지 않은 것 같습니다. 따라서 '완료'를 찾으십시오.

API 로깅을 종료하지 마십시오. 그러면 TWS와주고받는 모든 다른 메시지가 표시됩니다. 로그 파일에서 시장 데이터를 차단할 수 있습니다. jts dir에서 'api.222.Wed.log'파일을 찾으십시오.

from time import sleep, strftime 
from ib.ext.Contract import Contract 
from ib.opt import ibConnection, message 
import pandas as pd 
import numpy as np 

def nextValidId_handler(msg): 
    print(msg) 
    inner() 

hist = [] 

def my_hist_data_handler(msg): 
    print(msg) 
    if "finished" in msg.date: 
     print('disconnecting', con.disconnect()) 
     df = df = pd.DataFrame(index=np.arange(0, len(hist)), columns=('date', 'close', 'volume')) 
     for index, msg in enumerate(hist): 
      df.loc[index,'date':'volume'] = msg.date, msg.close, msg.volume 
     print(df) 
    else: 
     hist.append(msg)  

def error_handler(msg): 
    print(msg) 

if __name__ == '__main__': 

    con = ibConnection(port=7497,clientId=222) 
    con.register(error_handler, message.Error) 
    con.register(nextValidId_handler, message.nextValidId) 
    con.register(my_hist_data_handler, message.historicalData) 
    con.connect() 

    print(con.isConnected()) 

    def inner(): 

     qqqq = Contract() 
     qqqq.m_secType = "STK" 
     qqqq.m_symbol = "AAPL" 
     qqqq.m_currency = "USD" 
     qqqq.m_exchange = "SMART" 
     endtime = strftime('%Y%m%d %H:%M:%S') 
     print(endtime) 
     con.reqHistoricalData(1,qqqq,endtime,"1 W","1 day","MIDPOINT",1,2) 

    print(con.isConnected()) 
+0

고맙습니다. – Emjora

+0

너무 많은 것을 요구하지는 않지만 누구나 pd.DataFrame으로 출력을 얻는 방법에 대한 통찰력을 제공 할 수 있습니까? – Emjora

+0

@JohanEmilRasmussen 다른 사람이 귀하의 의견을 볼 수 없습니다. 다른 질문을해야합니다. 예를 들어 대답을 편집했지만 파이썬을 사용하지 않습니다. 먼저 파이썬 기초를 연구해야합니다. – brian