可视化图表#
与可视化图表的集成支持以下两种方式:
实时数据 提供
实时交易
可视化图表 是完整的交易解决方案:
集成图表、数据提供和经纪交易的单一平台
欲获取更多信息,请访问:www.visualchart.com
要求#
VisualChart 6
Windows - 可视化图表运行所在的操作系统
``comtypes``的分支版本:https://github.com/mementum/comtypes
使用以下命令安装:``pip install https://github.com/mementum/comtypes/archive/master.zip``**可视化图表** API基于**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``对于数据源是通用的,比如``dataname
、fromdate
、todate
、sessionstart
、sessionend
、timeframe``和``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个月)。
其他参数#
数据通知#
数据源将通过以下其中一个或多个方式报告当前状态(请查看 Cerebro 和*Strategy*参考资料)
Cerebro.notify_data``(如果被覆盖) - 添加了通过 ``Cerebro.adddatacb
添加的回调函数``Strategy.notify_data``(如果被重写)
策略 中的一个示例:
系统发生变化后将发送以下通知:
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(…)
经纪人参数#
无论是直接使用还是通过 getbroker
,VCBroker
经纪人不支持任何参数。
这是因为经纪人只是真实 经纪人 的代理,并且真实经纪人提供的功能不应该被去除。限制
====
位置#
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
进行 buy
和 sell
)可以使用相同的有效期概念。因此,对于以下值,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
- 订单已发送至TWSAccepted
- 订单已下达Rejected
- 订单下达失败或在生命周期内被系统取消Partial
- 部分成交已发生Completed
- 订单已完全执行Canceled``(或``Cancelled
)Expired
- 尚未报告。需要一种启发式方法来区分这种状态和``Cancelled``。