跳转到内容

接收市场扫描器参数

scannerParameters(xml)reqScannerParameters() 的返回回调。它只返回一个参数:XML 字符串。

这段 XML 不是给人直接阅读的,实际开发中应该用 XML 解析器提取需要的值。不要用字符串截取去猜位置,因为 TWS 版本更新后 XML 节点顺序可能变化。

官方参考:IBKR Campus - Receive Market Scanner Parameters

def scannerParameters(self, xml: str) -> None:
# xml 很大,正式程序里建议保存或解析,不要完整打印到日志。
self.parameters_xml = xml
self.parameters_done.set()
import xml.etree.ElementTree as ET
def summarize_scanner_xml(xml: str) -> None:
"""提取扫描器 XML 中常用节点,帮助确认可用参数。"""
root = ET.fromstring(xml)
instruments = []
locations = []
scan_codes = []
for element in root.iter():
tag = element.tag.lower()
text = (element.text or "").strip()
code = element.attrib.get("code") or element.attrib.get("name") or text
if not code:
continue
if "instrument" in tag:
instruments += [code]
elif "location" in tag:
locations += [code]
elif "scan" in tag and "code" in tag:
scan_codes += [code]
print("产品类型数量:", len(instruments))
print("市场范围数量:", len(locations))
print("扫描规则数量:", len(scan_codes))
print("前几个市场范围:", locations[:8])
PARAMETERS_ROOT=ScanParameterResponse
INSTRUMENT_COUNT=784
SAMPLE_INSTRUMENTS=STK,STK,STK,STK,STK,STK,STK,STK
LOCATION_COUNT=321
SAMPLE_LOCATIONS=STK.US,STK.US.MAJOR,STK.NYSE,STK.AMEX,STK.ARCA,STK.NASDAQ,STK.NASDAQ.NMS,STK.NASDAQ.SCM
SCAN_CODE_COUNT=771
SAMPLE_SCAN_CODES=SCAN_etfAssets_DESC,SCAN_etfAssets_ASC,SCAN_etfExpense_DESC

不同 TWS 版本返回的数量可能不同。开发时重点不是数字完全一致,而是确认你要用的 instrumentlocationCodescanCode 是否存在且可以组合。

字段中文说明
instrument产品类型,例如股票、期货、指数、期权组合等。
locationCode市场或地区范围,例如美国主要股票市场。
scanCode扫描规则,例如涨幅榜、成交量活跃、最活跃等。
filter / setting额外过滤条件,例如价格、成交量、市值、期权成交量等。

过滤条件会出现在 XML 的 FilterList 中。不同产品和扫描规则支持的过滤项不同,常见形态包括:

过滤方向例子中文含义
价格范围abovePricebelowPrice只返回价格高于或低于某个值的合约。
成交量aboveVolume只返回成交量高于某个值的合约。
市值usdMarketCapAbove只返回美元市值高于某个值的合约。
涨跌幅依扫描类型而定按涨跌幅、波动率或其它指标筛选。
期权相关依扫描类型而定期权成交量、隐含波动率等条件。

XML 中的节点和属性很多,不同扫描类型支持的过滤条件也不同。写界面或配置文件时,最好把 instrumentlocationCodescanCode 作为一组保存,避免用户选择到彼此不匹配的组合。

先把 XML 解析成下拉选项或配置表,再让用户选择组合。这样比把 STK.US.MAJORHOT_BY_VOLUME 写死在界面里更可靠。

写第一个扫描器时,可以先使用常见组合 STKSTK.US.MAJORHOT_BY_VOLUME,等能返回结果后再逐步增加价格、成交量或市值过滤。