可视化图表#

与可视化图表的集成支持以下两种方式:

  • 实时数据 提供

  • 实时交易

可视化图表 是完整的交易解决方案:

  • 集成图表、数据提供和经纪交易的单一平台

    欲获取更多信息,请访问:www.visualchart.com

要求#

当前的``comtypes``主要分支不支持解包``VT_RECORD``的``VT_ARRAYS``。而**Visual Chart**使用了这个功能。

[ Pull Request #104 <https://github.com/enthought/comtypes/pull/104> _]已经提交但尚未合并。一旦合并,就可以使用主要分支。

  • ``pytz``(可选但非常推荐)

确保每个数据都返回在市场时间内。

这对大多数市场是正确的,但有些确实是个例外(``全球指数``是一个很好的例子)

**Visual Chart**中的时间管理及其与通过**COM**交付的时间的关系是复杂的,使用``pytz``可以简化事情。

示例代码#

源代码中包含一个完整的示例在:

  • ``samples/vctest/vctest.py``示例可能无法涵盖所有可能的用例,但它尝试提供广泛的见解,并应强调在使用回测模块或实时数据模块时没有真正的差异。

可能可以指出的一件事情是:

  • 在进行任何交易活动之前,示例会等待 data.LIVE 数据状态通知。

    这可能是在任何实时策略中要考虑的一点。

VCStore - 存储器#

存储器是实时数据源/交易支持的关键,它在 COM API 和数据源以及代理经纪商的需求之间提供了一层适配。

  • 提供使用方法获取 代理经纪商 实例:

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

  • 提供获取 数据 源实例的方法:

    • VCStore.getedata(*args, **kwargs)``在这种情况下,许多``**kwargs``对于数据源是通用的,比如``datanamefromdatetodatesessionstartsessionendtimeframe``和``compression

数据源可能提供其他参数。请查看下面的参考资料。

``VCStore``将尝试:

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

    • 如果找到,将扫描安装目录以创建 COM typelibs,并能够实例化相应的对象

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

注意

即使可以通过扫描文件系统找到DLL, Visual Chart 本身也必须在运行中。backtrader不会启动 Visual Chart

``VCStore``的其他职责:

  • 跟踪 Visual Chart 与服务器的连接状态VCData数据源


概述#

Visual Chart 提供的数据源具有一些有趣的特性:

  • **重新采样**由平台完成

    并非所有情况下都是如此: 秒*不受支持,因此仍需由 backtrader*完成

    因此,只有在处理秒级数据时,最终用户才需要执行以下操作:

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

    在其他所有情况下,仅需执行以下操作:

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

数据将通过比较内部设备时钟和平台提供的``ticks``来内部计算``timeoffset``,从而尽可能早地提供 自动重新采样 的数据条,如果没有新的ticks进来。实例化数据:

  • 将出现在 VisualChart 左上角的符号传递给 getdata 函数,不要包含空格。例如:

    • ES-Mini 显示为``001 ES``。实例化代码如下:

      data = vcstore.getdata(dataname='001ES', ...)
      
    • EuroStoxx 50 显示为``015 ES``。实例化代码如下:

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

注意

backtrader 将尽量清除名称中位于第四个位置的空格,如果名称直接从 Visual Chart 中粘贴过来的话

时间管理#

时间管理遵循 backtrader 的一般规则

  • 提供的时间应该是 Market 时间,以确保代码不依赖于在不同时间发生的夏令时转换, 从而使得本地时间在时间比较方面不可靠。这在 Visual Chart 中适用于大多数市场,但对某些市场进行了特定管理:

  • 位于交易所``096``的数据,名称为``国际指数``。

    理论上,这些数据应该报告的时区是``Europe/London``,但经过测试发现这似乎只部分正确,并且需要进行一些内部管理来解决。

可以通过传递参数``usetimezones=True``来启用使用真实 时区*进行时间管理。如果可用,它会尝试使用``pytz``。这不是必需的,因为对于大多数市场, Visual Chart*提供的内部时间偏移量允许无缝转换到市场时间。

无论如何,当``096.DJI``实际位于``US/Eastern``时,在``Europe/London``时间中报告它似乎是没有意义的。因此,backtrader``将会在后者中报告它。在这种情况下,强烈推荐使用``pytz

备注

道琼斯工业指数 (不是全球版本)位于``099I-DJI``

备注

所有这些时间管理都需要在本地和远程市场在DST转换期间真实测试中进行,这两者之间存在时区差异。

输出*时区*在``VCDATA``中定义的``国际指数``列表为:

'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',

小的时间问题 ————传递给``fromdate``或``todate``的给定**时间**而不是默认的``00:00:00``似乎在 COM API中创建了一个过滤器,并且任何日期之后的数据只会在给定的时间之后发布。

因此:

  • 请只传递**完整的日期**给``VCData``,例如:

    data = vcstore.getdata(dataname='001ES', fromdate=datetime(2016, 5, 15))
    
    而不要写成::

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

回填时间长度#

如果用户没有指定``fromdate``,平台将自动尝试回填并继续使用实时数据。回填的时间取决于时间跨度,并且具体如下:

  • Ticks, MicroSeconds, Seconds: 1天

    对于这三个时间跨度,回填时间是相同的,因为 Visual Chart 不直接支持 秒*和 微秒 ,而是通过重新采样 Ticks*来实现。

  • Minutes: 2天 - : 1年

  • : 2年

  • : 5年

  • : 20年

定义的补充周期乘以所请求的``压缩``,即:如果 timeframe 为``分钟``, compression**为5,则最终的 补充周期 *将为:2天 * 5 -> 10天

交易数据#

Visual Chart 提供了**连续期货**。无需手动管理,可以持续跟踪所选择的期货。这是一个优势,并且提出了一个小的挑战:

  • ES-Mini``是``001ES,但实际的交易资产(例如:Sep-2016)是``ESU16``。

为了解决这个问题并允许策略跟踪 连续期货 并在 实际资产 上进行交易,可以在数据实例化期间指定以下内容:

data = vcstore.getdata(dataname='001ES', tradename='ESU16')交易将在``ESU16``上进行,但数据源将来自``001ES``(数据长度为3个月)。

其他参数#

  • ``qcheck``(默认值:``0.5``秒)控制唤醒频率以与内部重采样/重播器通信,避免延迟交付栏位。

    将应用以下逻辑来使用该参数:

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

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

    数据源仍会唤醒以检查 Visual Chart 内置重采样器,但这是自动控制的。

数据通知#

数据源将通过以下其中一个或多个方式报告当前状态(请查看 Cerebro 和*Strategy*参考资料)

  • Cerebro.notify_data``(如果被覆盖)  - 添加了通过 ``Cerebro.adddatacb 添加的回调函数

  • ``Strategy.notify_data``(如果被重写)

策略 中的一个示例:

class VCStrategy(bt.Strategy):

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

if status == data.LIVE: # 数据已切换为实时数据

# 做一些处理 pass

系统发生变化后将发送以下通知:

  • CONNECTED

    在成功建立连接后发送

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

  • 指定了错误的合同

  • 在历史下载期间发生中断

  • 超过了与TWS的重新连接尝试次数

  • ``CONNBROKEN``(连接中断)

    TWS或数据中心的连接已经丢失。数据源将尝试通过存储重新连接和填充数据,必要时恢复操作。

  • ``NOTSUBSCRIBED``(未订阅)

    合同和连接都正常,但由于缺乏权限无法检索数据。

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

  • ``DELAYED``(延迟)

    指示正在进行历史/补偿操作,并且策略正在处理的数据不是实时数据。

  • ``LIVE``(实时) 指示从此处开始由 策略 处理的数据是实时数据的信号

策略 的开发者应该考虑在出现断开连接或接收到**延迟**数据的情况下采取哪些行动。

VCBroker - 实时交易#

使用经纪人#

要使用 VCBroker ,必须替换由 cerebro 创建的标准经纪人模拟实例。

使用 Store 模型(首选):

import backtrader as bt

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

经纪人参数#

无论是直接使用还是通过 getbrokerVCBroker 经纪人不支持任何参数。 这是因为经纪人只是真实 经纪人 的代理,并且真实经纪人提供的功能不应该被去除。限制 ====

位置#

Visual Chart 报告 开放仓位。这通常用于控制实际仓位,但缺少一个指示*仓位*已关闭的最终事件。

这使得 backtrader 必须对*仓位*进行全面的会计记录,并与您账户中的任何先前现有仓位分开。

佣金#

COM 交易接口不报告佣金。除非:

  • 实例化 经纪商 时使用 佣金*实例指示实际发生了哪些佣金,否则 backtrader*无法做出有根据的猜测。

使用它进行交易#

账户#

Visual Chart 在一个经纪商中支持同时使用多个账户。可以使用参数来控制选择的账户: - account``(默认值:``None

VisualChart支持在经纪人上同时使用多个账户。如果使用默认值``None``,则将使用ComTrader的``Accounts``集合中的第一个账户。

如果提供了一个账户名,将会检查并使用``Accounts``集合中的账户(如果存在)。

操作#

对于使用标准的操作方法没有任何变化。只需使用策略中可用的方法(有关完整说明,请参阅``Strategy``参考文档)。

  • buy

  • sell

  • close

  • cancel

返回的订单对象#

  • backtrader 标准的``Order``对象

订单执行类型#

Visual Chart 支持 backtrader 所需的最少订单执行类型,因此,任何已进行回测的模型都可以实际交易。执行订单类型受限于“经纪人模拟”的类型:

  • Order.Market (市价)

  • Order.Close (收盘价)

  • Order.Limit (限价)

  • Order.Stop (触发“止损”后跟随“市价”)

  • Order.StopLimit (触发“止损”后跟随“限价”)

订单有效期#

在回测期间(使用 valid 进行 buysell)可以使用相同的有效期概念。因此,对于以下值,valid 参数在 Visual Chart Orders 中被翻译如下:

  • None 翻译为 Good Til Cancelled (取消前有效)

    因为没有指定有效期,所以订单被理解为一直有效,直到被取消。

  • datetime/date 翻译为 Good Til Date (指定日期前有效)

    注意

    注意: Visual Chart 只支持“完整日期”,时间部分会被忽略。

  • timedelta(x) 翻译为 Good Til Date (指定时长前有效)(这里 timedelta(x) != timedelta()

    注意

    注意: Visual Chart 只支持“完整日期”,时间部分会被忽略。 这被解释为一个信号,表示从``now`` + ``timedelta(x)``开始有效。

  • timedelta() or 0 被翻译为 Session (会话)

    传递了一个值(而不是``None``),但这个值为空( Null ),解释为订单在当前 day (会话)有效。

通知#

标准的``Order``状态将通过方法``notify_order``通知给 strategy (如果重写)

  • Submitted - 订单已发送至TWS

  • Accepted - 订单已下达

  • Rejected - 订单下达失败或在生命周期内被系统取消

  • Partial - 部分成交已发生

  • Completed - 订单已完全执行

  • Canceled``(或``Cancelled

  • Expired - 尚未报告。需要一种启发式方法来区分这种状态和``Cancelled``。

参考#

VCStore#


VCData#