2016-11-25 56 views
0

我在努力處理ScannerSubscription的結果。
例如,如果我要求:使用IbPy檢索ScannerSubscription結果

qqq_id = 0 
subscript = ScannerSubscription() 
subscript.numberOfRows(15) 
subscript.m_scanCode = 'HIGH_OPEN_GAP' 
subscript.m_instrument = 'STK' 
subscript.m_averageOptionVolumeAbove = '' 
subscript.m_couponRateAbove = '' 
subscript.m_couponRateBelow = '' 
subscript.m_abovePrice = '5' 
subscript.m_belowPrice = '' 
subscript.m_marketCapAbove = '' 
subscript.m_marketCapBelow = '' 
subscript.m_aboveVolume = '100000' 
subscript.m_stockTypeFilter = 'ALL' 
subscript.locationCode('STK.US.MAJOR') 
tws_conn.reqScannerSubscription(qqq_id, subscript) 
tws_conn.reqScannerParameters() 

我收到這樣的scannerData響應:

<scannerData reqId=0, rank=0, contractDetails=<ib.ext.ContractDetails.ContractDetails object at 0x00000000036EFA58>, distance=None, benchmark=None, projection=None, legsStr=None>
等等

但我不能檢索的結果值,例如:

reqScannerParameters() xml結果指定<colId>390</colId>作爲的colIdvalue:

<ScanType> 
    <displayName>Top Close-to-Open % Gainers</displayName> 
    <scanCode>HIGH_OPEN_GAP</scanCode> 
    <instruments>STK,STOCK.NA,STOCK.EU,STOCK.HK,FUT.US,FUT.HK,FUT.EU,FUT.NA</instruments> 
    <absoluteColumns>false</absoluteColumns> 
<Columns varName="columns"> 
<Column> 
    <colId>390</colId> 
    <name>Gap</name> 
    <display>true</display> 
    <section>m</section> 
    <displayType>DATA</displayType> 
</Column> 

如何檢索GAP值?
這甚至可能嗎?

+1

只是一個猜測,但是當您在scannerData回調中獲得合約後,使用它來請求reqMktData的快照。然後你可以計算開放差距。 – brian

+0

@brian這是我的第一個方法,但我試圖避免任何額外的請求和計算,它沒有任何意義,ib api應該返回值。不管怎樣,謝謝你。 –

+1

我剛剛在雅虎交易平臺API小組閱讀了一些評論,其他人提到你通常必須要求數據,因爲你只是在scannerData中獲得最低限度的回報。 – brian

回答

1

現在我確定你應該在得到合同後請求數據。

import pandas as pd 
scans = 15 
res = pd.DataFrame(index = range(scans), columns = ['sym','open','close','calc']).fillna(0) 
msgs = [] 

from ib.ext.Contract import Contract 
from ib.opt import ibConnection, message 
from ib.ext.TickType import TickType as tt 

def tickPrice(msg): 
    global scans 

    if msg.field in [tt.OPEN, tt.CLOSE]: 
     res.loc[msg.tickerId,tt.getField(msg.field)] = msg.price 

    op = res.loc[msg.tickerId,'open'] 
    cl = res.loc[msg.tickerId,'close'] 

    if op > 0 and cl > 0 and res.loc[msg.tickerId,'calc'] == 0: 
     res.loc[msg.tickerId,'calc'] = ((op-cl)*100/cl) 
     con.cancelMktData(msg.tickerId) 
     scans -= 1 
     if scans == 0: 
      print(res) 
      con.disconnect() 

def snapshot(msg): 
    res.loc[msg.rank,'sym'] = msg.contractDetails.m_summary.m_symbol 
    #tt.OPEN (14) isn't coming with snapshot 
    con.reqMktData(str(msg.rank), msg.contractDetails.m_summary, "", False) 

def watcher(msg): 
    #print (msg) 
    msgs.append(msg) 

def scanData(msg): 
    snapshot(msg) 

def scanDataEnd(msg): 
    con.cancelScannerSubscription(qqq_id) 

con = ibConnection(port=7497, clientId=888) 
con.registerAll(watcher) 
con.unregister(watcher, message.scannerData) 
con.register(scanData, message.scannerData) 
con.unregister(watcher, message.scannerDataEnd) 
con.register(scanDataEnd, message.scannerDataEnd) 
con.unregister(watcher, message.tickPrice) 
con.register(tickPrice, message.tickPrice) 

con.connect() 

from ib.ext.ScannerSubscription import ScannerSubscription 
qqq_id = 0 
subscript = ScannerSubscription() 
subscript.numberOfRows(15) 
subscript.m_scanCode = 'HIGH_OPEN_GAP' 
subscript.m_instrument = 'STK' 
subscript.m_averageOptionVolumeAbove ='0' 
subscript.m_abovePrice = '5' 
subscript.m_aboveVolume = '100000' 

con.reqScannerSubscription(qqq_id, subscript) 

水庫在下午1點EST =

 sym open close  calc 
0  TAC 4.95 4.25 16.470588 
1  CTRP 44.80 40.99 9.294950 
2  IIIN 39.26 36.58 7.326408 
3  LFC 14.60 13.63 7.116654 
4  ACH 11.59 10.87 6.623735 
5  KALV 9.01 8.38 7.517900 
6  OMER 13.25 12.75 3.921569 
7  DWTI 68.00 66.50 2.255639 
8  WLDN 23.75 23.43 1.365770 
9  BZQ 19.67 18.73 5.018687 
10  JNUG 6.55 6.43 1.866252 
11 GXP PRB 50.78 49.80 1.967871 
12  AU 10.85 10.59 2.455146 
13  USLV 13.07 12.81 2.029664 
14  CBD 16.60 16.03 3.555833 

我不知道爲什麼他們沒有在排名順序來?

+0

我想我們必須在計算'gap'後對結果進行排序。它的工作,表示讚賞! –