【TWS API 翻译系列】19、TWS API和IB中的市场扫描仪
作者:yunjinqi   类别:    日期:2022-01-03 22:23:34    阅读:1310 次   消耗积分:0 分    

市场扫描仪

TWS Advanced Market [Scanner](https://www.interactivebrokers.com/en/software/webtrader/webtrader/marketscanners/market scanners.htm)中的某些扫描可以从TWS API通过IBApi.EClient.reqScannerSubscription访问。

self.reqScannerSubscription(7001, ScannerSubscriptionSamples.HighOptVolumePCRatioUSIndexes(), [], []) # Generic Filterstagvalues = []tagvalues.append(TagValue("usdMarketCapAbove", "10000"))tagvalues.append(TagValue("optVolumeAbove", "1000"))tagvalues.append(TagValue("avgVolumeAbove", "10000"));self.reqScannerSubscription(7002, ScannerSubscriptionSamples.HotUSStkByVolume(), [], tagvalues) # requires TWS v973+

IBApi.ScannerSubscription对象中定义了 TWS v973和 API v973.07之前的可用 API 筛选器和参数,包括 [AbovePrice、 BelowPrice、 AboveVolume, …]。本页底部列出了一些市场扫描仪示例

扫描限制为每次扫描代码最多 50 个结果,并且一次只能激活 10 次 API 扫描。

结果通过IBApi.EWrapper.scannerData提供,IBApi.EWrapper.scannerDataEnd标记将指示所有结果何时交付。返回到 scannerData 的结果仅包含一个合同列表。扫描程序没有返回的市场数据字段(买入价、卖出价、最后一个、交易量等),因此如果需要,则必须使用 reqMktData 函数单独请求这些字段。由于扫描程序结果不包含任何市场数据字段,因此无需订阅市场数据即可使用 API 扫描程序。但是,要使用过滤器**,通常需要市场**数据订阅。

class TestWrapper(wrapper.EWrapper):# ...
     def scannerData(self, reqId: int, rank: int, contractDetails: ContractDetails,
                     distance: str, benchmark: str, projection: str, legsStr: str):
         super().scannerData(reqId, rank, contractDetails, distance, benchmark,
                             projection, legsStr)
 #       print("ScannerData. ReqId:", reqId, "Rank:", rank, "Symbol:", contractDetails.contract.symbol,
 #              "SecType:", contractDetails.contract.secType,
 #              "Currency:", contractDetails.contract.currency,
 #              "Distance:", distance, "Benchmark:", benchmark,
 #              "Projection:", projection, "Legs String:", legsStr)
         print("ScannerData. ReqId:", reqId, ScanData(contractDetails.contract, rank, distance, benchmark, projection, legsStr))#...
     def scannerDataEnd(self, reqId: int):
         super().scannerDataEnd(reqId)
         print("ScannerDataEnd. ReqId:", reqId)

由于IBApi.EClient.reqScannerSubscription请求使订阅保持打开状态,因此您将不断收到定期更新,直到通过IBApi.EClient.cancelScannerSubscription取消请求:

self.cancelScannerSubscription(7001)self.cancelScannerSubscription(7002)self.cancelScannerSubscription(7003)

市场扫描仪示例

对于 API v973.07和 TWS v973及更低版本,可用的 API 扫描是 ScannerSubscription 对象的字段,即abovePrice、aboveVolume、Below Price等。从 API 的下一个版本(预计为 v973.08)和 TWS v974 开始,已向 API 添加了一个额外的参数 scannerSubscriptionFilterOptions,以允许使用通用筛选器。此字段作为 TagValues 列表输入,其中有一个标签后跟其值,例如 TagValue(“usdMarketCapAbove”、“10000”)表示市值高于 10000 美元。可以使用IBApi.EClient.reqScannerParameters函数找到可用的筛选器。

#Hot US stocks by volumescanSub = ScannerSubscription()scanSub.instrument = "STK"scanSub.locationCode = "STK.US.MAJOR"scanSub.scanCode = "HOT_BY_VOLUME"# ...# Top % gainers at IBISscanSub = ScannerSubscription()scanSub.instrument = "STOCK.EU"scanSub.locationCode = "STK.EU.IBIS"scanSub.scanCode = "TOP_PERC_GAIN"#...# Most active futures at SOFFEXscanSub = ScannerSubscription()scanSub.instrument = "FUT.EU"scanSub.locationCode = "FUT.EU.SOFFEX"scanSub.scanCode = "MOST_ACTIVE"#...# High option volume P/C ratio US indexesscanSub = ScannerSubscription()scanSub.instrument = "IND.US"scanSub.locationCode = "IND.US"scanSub.scanCode = "HIGH_OPT_VOLUME_PUT_CALL_RATIO"

另请参见扫描仪参数

复杂订单和交易扫描仪

TWS 复杂扫描器和订单和交易扫描器是一种特殊的扫描类型,可从 API 获得 TWS v975 和 API v973.07 或更高版本。

# High option volume P/C ratio US indexesscanSub = ScannerSubscription()scanSub.instrument = "NATCOMB"scanSub.locationCode = "NATCOMB.OPT.US"scanSub.scanCode = "COMBO_LATEST_TRADE"AAPLConIDTag = [TagValue("underConID", "265598")]self.reqScannerSubscription(7003, ScannerSubscriptionSamples.ComplexOrdersAndTrades(), [], AAPLConIDTag) # requires TWS v975+

复杂订单和交易扫描仪可用的扫描代码:

  • COMBO_LATEST_TRADE

  • COMBO_QUOTES

  • COMBO_MOST_ACTIVE

  • COMBO_ALL_TRADE_TIME_ASC

  • COMBO_ALL_TRADE_TIME_DESC

  • COMBO_ALL_QUOTE_TIME_ASC

  • COMBO_ALL_QUOTE_TIME_DESC

  • COMBO_ALL_TRADE_QUOTE_TIME_ASC

  • COMBO_ALL_TRADE_QUOTE_TIME_DESC

  • COMBO_ALL_VOLUME_ASC

  • COMBO_ALL_VOLUME_DESC

扫描仪参数

TWS扫描仪参数列表可以通过IBApi.EClient.reqScannerParameters获得。并非所有返回给 scannerParameters 的参数都可以从 API 扫描程序中获得。

self.reqScannerParameters()

包含所有可用 XML 格式参数的字符串将通过IBApi.EWrapper.scannerParameters返回

class TestWrapper(wrapper.EWrapper):# ...
     def scannerParameters(self, xml: str):
         super().scannerParameters(xml)
         open('log/scanner.xml', 'w').write(xml)
         print("ScannerParameters received.")

**重要提示:**请记住,TWS API 只是 TWS 的一个接口。如果您在定义扫描仪时遇到问题,请始终确保您可以使用TWS[的高级市场扫描仪](https://www.interactivebrokers.com/en/software/webtrader/webtrader/marketscanners/market scanners.htm)创建类似的扫描仪。

TWS API相关的教程

【TWS API使用教程1】—如何在自己创建的client和TWS之间创建一个连接,并请求当前的时间
【TWS API使用教程2】—如何使用 TWS API在ubuntu和windows上分别设置contract、获取contract详细信息、设置order、下单、获取持仓信息、获取账户信息
【TWS API使用教程3】—如何使用TWS API从盈透证券中设置contract及获取contract的信息?
【TWS API使用教程4】—如何使用TWS API在盈透证券中设置order?
【TWS API使用教程5】—如何使用TWS API在盈透证券中下单(place order)、获取订单信息、获取持仓、获取账户汇总信息?
【TWS API使用教程6】—如何使用TWS API在盈透证券中获取数据?
【TWS API 使用教程7】如何使用TWS API 从盈透证券中筛选满足一定条件的contract?
【TWS API 使用教程8】一个基于TWS API的简单的程序化策略


版权所有,转载本站文章请注明出处:云子量化, http://www.woniunote.com/article/85
上一篇:【TWS API 翻译系列】18、TWS和IB中的错误处理信息
下一篇:【TWS API 翻译系列】20、TWS API和IB中的显示组