Skip to content

视觉图表

原文: https://www.backtrader.com/docu/live/vc/vc/

与 Visual Chart 的集成支持以下两种功能:

  • 现场数据投料

  • 现场交易

视觉图表是一个完整的交易解决方案:

  • 在单个平台中集成制图、数据馈送和代理

    欲了解更多信息,请访问:www.visualchart.com

要求

  • 视觉图表 6

  • Windows-运行 VisualChart 的一个

  • comtypes拨叉:https://github.com/mementum/comtypes

    安装时使用:pip install https://github.com/mementum/comtypes/archive/master.zip

    可视化图表API 基于COM

    当前comtypes主支路不支持VT_RECORDVT_ARRAYS解包。这是由视觉图表使用的

    拉取请求已提交但尚未集成。一旦集成,就可以使用主分支。

  • pytz(可选但真正推荐)

    确保在市场时间内返回所有数据。

    大多数市场都是如此,但有些市场确实是个例外(Global Indices就是一个很好的例子)

    视觉图表中的时间管理及其与COM上交付时间的关系是复杂的,具有pytz倾向于简化事情。

示例代码

来源包含以下内容下的完整样本:

  • samples/vctest/vctest.py

该示例不能涵盖所有可能的用例,但它试图提供广泛的见解,并且应该强调,在使用回溯测试模块或实时数据模块时没有真正的区别

有一件事可以用别针指着:

  • 在任何交易活动发生之前,样本等待data.LIVE数据状态通知。

    这可能是任何生活策略中需要考虑的问题。

VCStore-商店

存储是实时数据馈送/交易支持的基石,在COMAPI 与数据馈送和代理需求之间提供了一层自适应。

  • 使用以下方法提供获取代理实例的访问:

    • VCStore.getbroker(*args, **kwargs)
    • 提供对 getter数据提要实例的访问

    • VCStore.getedata(*args, **kwargs)

    在这种情况下,**kwargs中的许多内容与datanamefromdatetodatesessionstartsessionendtimeframecompression等数据源相同

    该数据可提供其他参数。检查下面的参考资料。

VCStore将尝试:

  • 使用Windows 注册表在系统中自动定位VisualChart

    • 如果找到,将扫描安装目录中的COMDLL,以创建COMtypelibs,并能够实例化适当的对象

    • 如果未找到,则将尝试使用已知和硬编码的CLSID执行相同操作。

笔记

即使可以通过扫描文件系统找到 DLL,可视化图表本身也必须运行。反向交易者不会启动视觉图表

VCStore的其他职责:

  • 全面跟踪视觉图表与服务器的连接状态

VCD 数据源

全体的

视觉图表提供的数据提要具有一些有趣的特性:

  • 重采样由平台完成

    并非在所有情况下:不受支持,仍需由反向交易者完成

    因此,只有在用秒做某事时,最终用户才需要做:

    py vcstore = bt.stores.VCStore() vcstore.getdata(dataname='015ES', timeframe=bt.TimeFrame.Ticks) cerebro.resampledata(data, timeframe=bt.TimeFrame.Seconds, compression=5)

    在所有其他情况下,满足以下条件即可:

    py vcstore = bt.stores.VCStore() data = vcstore.getdata(dataname='015ES', timeframe=bt.TimeFrame.Minutes, compression=2) cerebro.addata(data)

数据将通过比较内部设备时钟和平台交付的ticks在内部计算timeoffset,以便在没有新的滴答声进入时尽早交付自动重采样条。

实例化数据:

  • 传递视觉图表左上方看到的符号,不带空格。例如:

    • ES Mini显示为001 ES。将其实例化为:

    py data = vcstore.getdata(dataname='001ES', ...)

    • EuroStoxx 50显示为015 ES。将其实例化为:

    py data = vcstore.getdata(dataname='015ES', ...)

笔记

如果名称直接从视觉图表粘贴,则将努力清除位于第四位置的空白

时间管理

时间管理遵循反向交易者的一般规则

  • 给出市场时间内的时间,以确保代码不依赖于在不同时间发生的 DST 转换,使本地时间不可靠,无法进行时间比较。

这适用于视觉图表中的大多数市场,但对某些市场进行了一些具体管理:

  • 交易所096中的数据,名为International Indices

    理论上,这些数据被报告在时区Europe/London内,但测试表明,这似乎部分是正确的,并且一些内部管理层已经到位来覆盖它。

通过传递参数usetimezones=True可以启用使用实时时区进行时间管理。如果可用,则尝试使用pytz。不需要,因为对于大多数市场,视觉图表提供的内部时间偏移允许无缝转换到市场时间。

无论如何,当096.DJI实际位于US/Eastern时,在Europe/London时间报告096.DJI似乎毫无意义。因此backtrader将在稍后报告。在这种情况下,pytz的使用超出了推荐范围。

笔记

道琼斯工业指数(非全球版)位于099I-DJI

笔记

在 DST 过渡期间,所有这些时间管理都在等待一个真正的测试,在这个过渡期间,本地和远程市场恰好与 DST 不同步。

VCDATA中定义了输出时区International Indices列表:

'096.FTSE': 'Europe/London',
'096.FTEU3': 'Europe/London',
'096.MIB30': 'Europe/Berlin',
'096.SSMI': 'Europe/Berlin',
'096.HSI': 'Asia/Hong_Kong',
'096.BVSP': 'America/Sao_Paulo',
'096.MERVAL': 'America/Argentina/Buenos_Aires',
'096.DJI': 'US/Eastern',
'096.IXIC': 'US/Eastern',
'096.NDX': 'US/Eastern', 

小时间问题

使用给定的时间而不是默认的00:00:00传递fromdatetodate似乎会在COMAPI 中创建一个过滤器,任何一天的条形图都只会在给定的时间之后交付。

像这样的:

  • 请仅将完整日期传递给VCData,如下所示:

    py data = vcstore.getdata(dataname='001ES', fromdate=datetime(2016, 5, 15))

    而不是:

    py data = vcstore.getdata(dataname=‘001ES’, fromdate=datetime(2016, 5, 15, 8, 30))

回填时间长度

如果最终用户未指定fromdate,平台将自动尝试使用实时数据进行回填和携带。回填取决于时间范围,并且:

  • TicksMicroSecondsSeconds1 天

    考虑到视觉图表不直接支持微秒,并通过节拍的重采样完成,3 个时间段的情况也是如此

  • Minutes2 天

  • Days1 年

  • Weeks2 年

  • Months5 年

  • Months20 年

定义的回填周期乘以请求的compression,即:如果时间段Minutes,且压缩为 5,则最终回填周期为:2 days * 5 -> 10 days

交易数据

视觉图表提供连续期货。无需手动管理,您可以不间断地跟踪选择的未来。这是一个优势,也是一个小挑战:

  • ES-Mini001ES,但实际交易资产(例如:2016 年 9 月)为ESU16

为了克服这一点,允许策略跟踪连续未来并在真实资产上交易,可以在数据实例化期间指定以下内容:

data = vcstore.getdata(dataname='001ES', tradename='ESU16') 

交易将在ESU16发生,但数据馈送将为 frm001ES(数据相同,持续 3 个月)

其他参数

  • qcheck(默认值:0.5秒)控制唤醒与内部重采样器/重放器通话的频率,以避免酒吧延迟交付。

    以下逻辑将应用于此参数:

    • 如果检测到内部重采样/重放,则该值将按原样使用。

    • 如果没有检测到内部重采样/重放,数据馈送将不会唤醒,因为没有要报告的内容。

    数据馈送仍将唤醒以检查视觉图表内置重采样器,但这是自动控制的。

数据通知

数据馈送将通过以下一项或多项报告当前状态(检查大脑策略参考)

  • Cerebro.notify_data(如果被覆盖)n

  • 添加了Cerebro.adddatacb的回调

  • Strategy.notify_data(如果被覆盖)

策略中的一个例子:

class VCStrategy(bt.Strategy):

    def notify_data(self, data, status, *args, **kwargs):

        if status == data.LIVE:  # the data has switched to live data
           # do something
           pass 

系统中的以下更改将发送以下通知:

  • CONNECTED

    初始连接成功时发送

  • DISCONNECTED

    在这种情况下,无法再检索数据,数据将指示系统无法执行任何操作。可能的条件:

    • 指定了错误的合同

    • 历史下载期间的中断

    • 已超过尝试重新连接到 TWS 的次数

  • CONNBROKEN

    TWS 或数据场的连接已丢失。数据馈送将尝试(通过存储)在需要时重新连接和回填,并恢复操作

  • NOTSUBSCRIBED

    协定和连接正常,但由于缺少权限,无法检索数据。

    数据将向系统指示它无法检索数据

  • DELAYED

    信号表示历史/回填操作正在进行,策略处理的数据不是实时数据

  • LIVE

    表示策略从此点开始处理的数据为实时数据

Apple T0 策略的开发者应该考虑在断开发生时或当接收到 Ty2 T2 延迟的 T3 数据时采取哪些行动。

VCBroker-实时交易

使用代理

要使用VCBroker,必须替换大脑创建的标准 broker 模拟实例。

使用商店型号(首选):

import backtrader as bt

cerebro = bt.Cerebro()
vcstore = bt.stores.VCStore()
cerebro.broker = vcstore.getbroker()  # or cerebro.setbroker(...) 

代理参数

无论是直接还是通过getbroker代理VCBroker都不支持任何参数。这是因为经纪人只是真实的经纪人的代理。而真正的经纪人所给予的,不应被剥夺。

限制

位置

视觉图表报告打开位置。这可以在大部分时间用于控制实际位置,但缺少指示位置已关闭的最终事件。

这使得反向交易者必须对头寸进行完整核算,并与您账户中以前存在的任何头寸分开

委员会

COM交易界面不报告佣金。反向交易者没有机会做出有根据的猜测,除非:

  • 经纪人被实例化为一个佣金实例,指示实际发生的佣金。

用它交易

账户

视觉图表支持一个经纪人同时拥有多个账户。所选科目可以通过以下参数进行控制:

  • account(默认为None

    VisualChart 在代理上同时支持多个帐户。如果默认None已到位,则将使用 ComTraderAccounts托收中的 1st账户。

    如果提供了帐户名,则会检查并使用Accounts集合(如果存在)

异议

标准使用方面没有变化。只需使用策略中可用的方法(完整解释请参见Strategy参考)

  • buy

  • sell

  • close

  • cancel

返回的订单对象

  • 标准反向交易者Order对象

订单执行类型

视觉图表支持反向交易者所需的最低订单执行类型,因此,反向测试的任何东西都可以上线。

因此,订单执行类型仅限于经纪人模拟中可用的类型:

  • Order.Market

  • Order.Close

  • Order.Limit

  • Order.Stop(触发停止时,跟随市场指令)

  • Order.StopLimit(触发停止时,跟随限制指令)

订单有效期

回溯测试中可用的相同有效性概念(具有validbuysell的有效性概念)可用且具有相同的含义。因此,valid参数对于视觉图表订单转换为以下值:

  • None翻译为良好,直到取消

    由于未指定有效期,因此订单必须在取消前有效

  • datetime/date翻译为良好截止日期

    笔记

    注意:视觉图表只支持“完整日期”时间部分被丢弃。

  • timedelta(x)翻译为截止日期(此处为timedelta(x) != timedelta()

    笔记

    注意:视觉图表只支持完整日期时间部分被丢弃。

    这被解释为命令从now+timedelta(x)开始生效的信号

  • timedelta() or 0翻译为会话

    已传递一个值(而不是None),但该值为,并被解释为对当前(会话)有效的订单

通知

标准Order状态将通过notify_order方法通知策略(如果被覆盖)

  • Submitted-订单已发送至 TWS

  • Accepted-已下订单

  • Rejected-下单失败或在其有效期内被系统取消

  • Partial-部分执行已发生

  • Completed-订单已全部执行

  • Canceled(或Cancelled

  • Expired-目前尚未报告。需要一种启发式方法来区分此状态与Cancelled

参考

VCStore

类 backtrader.stores.VCStore()

包装 ibpy ibConnection 实例的 Singleton 类。

也可以在使用此存储的类中指定参数,如VCDataVCBroker

VCBroker

类 backtrader.brokers.VCBroker(**kwargs)

VisualChart 的代理实现。

此类将订单/位置从 VisualChart 映射到backtrader的内部 API。

参数:

  • account(默认为无)

    VisualChart 在代理上同时支持多个帐户。如果默认None已到位,则将使用 ComTraderAccounts托收中的 1st账户。

    如果提供了帐户名,则会检查并使用Accounts集合(如果存在)

  • commission(默认为无)

    如果未将佣金方案作为参数传递,则将自动生成对象

    请参阅下面的注释以了解更多说明

笔记

  • 位置

VisualChart 通过 ComTrader 界面报告“未平仓”更新,但仅当仓位有“大小”时。如果没有某个位置,则会报告该位置已移到零的更新。这迫使我们通过查看执行事件来记录头寸,就像模拟代理一样

  • 委员会

VisualChart 的 ComTrader 界面不报告佣金,因此自动生成的 CommissionInfo 对象无法使用不存在的佣金来正确计算佣金。为了支持佣金,commission参数必须与适当的佣金方案一起传递。

有关佣金计划的文件详细说明了如何做到这一点

  • 到期时间

ComTrader 接口(或者是 comtypes 模块?)从datetime对象中丢弃time信息,到期日期始终为完整日期。

  • 到期报告

目前还没有启发式方法来确定取消的订单何时因到期而取消。因此,过期订单将被报告为已取消。

VCData

类 backtrader.feeds.VCData(**kwargs)

VisualChart 数据馈送。

参数:

  • qcheck(默认值:0.5)用于唤醒的默认超时,以便重新采样/重放器检查当前条是否可以正常交付

    仅当在数据中插入了重采样/重放过滤器时,才使用该值

  • historical(默认值:False)如果没有提供todate参数(在基类中定义),这将在设置为True时强制历史下载

    如果提供了todate,则可以达到相同的效果

  • milliseconds(默认值:True)由视觉图表构建的条形图具有以下特征:HH:MM:59.999000

    如果此参数为True,则此时间将添加一毫秒,使其看起来像:HH::MM+1:00.000000

  • tradename(默认值:None)连续期货不能交易,但非常适合数据跟踪。如果提供此参数,则它将是当前期货的名称,该期货将是交易资产。例子:

    • 001ES->ES 小型连续泵作为dataname供应

    • ESU16->ES Mini 2016-09。如果在tradename中提供,则它将成为交易资产。

  • usetimezones(默认值:True)对于大多数市场,视觉图表提供的时间偏移信息允许 datetime 转换为市场时间(backtrader表示选择)

    有些市场是特殊的(096),需要特殊的内部覆盖和时区支持才能在用户预期的市场时间内显示。

    如果此参数设置为True导入pytz将尝试使用时区(默认)

    禁用它将删除时区使用(如果负载过大,可能会有所帮助)


我们一直在努力

apachecn/AiLearning

【布客】中文翻译组