使用IbPy检索扫描程序订阅结果

2024-05-19 12:35:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个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 result将<colId>390</colId>指定为Gap值的colId:

^{pr2}$

我该如何取回差距?
这有可能吗?在


Tags: noneidconnhightwsscancodestkqqq
1条回答
网友
1楼 · 发布于 2024-05-19 12:35:41

现在我确定你应该在拿到合同后要求提供资料。在

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点的res=

^{pr2}$

我不知道他们为什么不按等级来??在

相关问题 更多 >