使用Visual Chart 实时交易 – 可视化图表 – backtrader中文教程
与 Visual Chart 的集成同时支持:
Visual Chart是一个完整的交易解决方案:
- 在单一平台中集成图表、数据馈送和代理
欲了解更多信息,请访问:www.visualchart.com
要求
- 视觉图 6
- Windows – 运行 VisualChart 的一个
comtypes
分叉:https ://github.com/mementum/comtypes安装它:
pip install https://github.com/mementum/comtypes/archive/master.zip
Visual Chart API基于COM。
当前
comtypes
主分支不支持VT_ARRAYS
对VT_RECORD
. 这是Visual Chart使用的Pull Request #104已提交但尚未集成。集成后就可以使用主分支了。
pytz
(可选但非常推荐)确保在市场时间内返回每个数据。
大多数市场都是如此,但有些市场确实是个例外(
Global Indices
作为一个很好的例子)Visual Chart中的时间管理及其与COM上的交付时间的关系是复杂的,并且
pytz
倾向于简化事情。
示例代码
来源包含以下完整示例:
samples/vctest/vctest.py
该示例无法涵盖所有可能的用例,但它试图提供广泛的见解,并应强调在使用回测模块或实时数据模块时没有真正的区别
可以明确指出一件事:
data.LIVE
该示例在任何交易活动发生之前等待数据状态通知。这可能是任何实时策略中需要考虑的事情
VCStore – 商店
存储是实时数据馈送/交易支持的基石,在COM API 与数据馈送和代理代理的需求之间提供了一层适配。
- 提供使用以下方法获取代理实例的访问权限:
VCStore.getbroker(*args, **kwargs)
- 提供对 getter数据馈送实例的访问
VCStore.getedata(*args, **kwargs)
在这种情况下,许多是
**kwargs
数据馈送所共有的,例如dataname
,fromdate
,todate
,sessionstart
,sessionend
,timeframe
,compression
数据可以提供其他参数。检查下面的参考。
将VCStore
尝试:
- 使用Windows 注册表在系统中自动定位VisualChart
- 如果找到,将扫描安装目录中的COM DLL 以创建COM 类型库并能够实例化适当的对象
- 如果未找到,则将尝试使用已知和硬编码 的CLSID来执行相同的操作。
Tips:即使可以通过扫描文件系统找到 DLL,Visual Chart 本身也必须运行。backtrader 不会启动Visual Chart
其他职责VCStore
:
- 跟踪Visual Chart与服务器的连接状态
VC数据提要
一般的
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)
数据将timeoffset
通过比较内部设备时钟和ticks
平台交付的时钟在内部计算 a,以便在没有新报价时尽早交付自动重新采样的柱线。
实例化数据:
- 传递VisualChart左上角的符号,不带空格。例如:
- ES-Mini显示为
001 ES
。将其实例化为:
- ES-Mini显示为
data = vcstore.getdata(dataname='001ES', ...)
- EuroStoxx 50显示为
015 ES
。将其实例化为:
data = vcstore.getdata(dataname='015ES', ...)
Tips:如果直接从Visual Chart粘贴名称,则backtrader将努力清除位于第四位的空格
时间管理
时间管理遵循反向交易者的一般规则
- 在市场时间中给出时间,以确保代码不依赖于在不同时间发生的 DST 转换,并使本地时间对于时间比较不可靠。
这适用于Visual Chart中的大多数市场,但对某些市场进行了一些特定的管理:
- 交换
096
中名为的数据International Indices
。这些理论上报告在时区
Europe/London
,但测试表明这似乎部分正确,并且一些内部管理已经到位。
可以通过传递参数来启用使用实时时区usetimezones=True
进行时间管理。pytz
如果可用,它会尝试使用。不需要,因为对于大多数市场,Visual Chart提供的内部时间偏移允许无缝转换为市场时间。
096.DJI
无论如何,报告它实际位于的 Europe/London
时间似乎毫无意义US/Eastern
。因此backtrader
将在稍后报告。在这种情况下, pytz
建议使用以上。
Tips:所有这些时间管理都在等待 DST 过渡期间的真正测试,其中本地和远程市场恰好在 DST 方面不同步。
International Indices
输出时区定义的 列表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 天鉴于视觉图表不直接支持Seconds和MicroSeconds并且通过对 Ticks重新采样来完成,这 3 个时间帧也是如此
Minutes
: 2 天Days
: 1 年Weeks
: 2 年Months
: 5 年Months
: 20 年
定义的回填周期乘以请求的compression
,即:如果时间帧为Minutes
且压缩为 5,则最终 回填周期为:2 days * 5 -> 10 days
交易数据
视觉图表提供连续期货。无需手动管理,可以不间断地跟踪您选择的未来。这是一个优势,也带来了一个小挑战:
ES-Mini
是001ES
,但实际交易资产(例如:2016 年 9 月)是ESU16
。
为了克服这一点并允许策略跟踪连续的未来并在真实资产上进行交易,可以在数据实例化期间指定以下内容:
data = vcstore.getdata(dataname='001ES', tradename='ESU16')
交易将发生在ESU16
,但数据馈送将是 frm 001ES
(数据是相同的 3 个月长)
其他参数
qcheck
(默认值:0.5
秒)控制唤醒频率以与内部重采样器/重放器对话,以避免延迟交付条形图。以下逻辑将应用于使用此参数:
- 如果检测到内部重采样/重放,将按原样使用该值。
- 如果未检测到内部重新采样/重放,则数据馈送将不会唤醒,因为没有要报告的内容。
数据馈送仍会唤醒以检查Visual Chart内置重采样器,但这是自动控制的。
数据通知
数据馈送将通过以下一项或多项报告当前状态(查看Cerebro和策略参考)
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
发出信号,表示策略从此时开始处理的数据是实时数据
策略开发人员应考虑在断开连接或接收延迟数据等情况下采取哪些行动。
VCBroker – 实时交易
使用代理
要使用VCBroker ,必须替换由cerebro创建的标准代理模拟实例 。
使用Store模型(首选):
import backtrader as bt cerebro = bt.Cerebro() vcstore = bt.stores.VCStore() cerebro.broker = vcstore.getbroker() # or cerebro.setbroker(...)
代理参数
无论是直接还是通过getbroker
代理VCBroker
都不支持任何参数。这是因为经纪人只是真正 经纪人的代理。而真正的经纪人所给予的,是不会被拿走的。
限制
位置
可视图表报告未平仓头寸。这可以在大多数情况下用于控制实际仓位,但缺少指示仓位已关闭的最终事件。
这使得反向交易者必须对头寸进行全面核算,并与您账户中任何先前存在的 头寸分开
委员会
COM交易界面不报告佣金。反向交易者没有机会 做出有根据的猜测,除非:
- 经纪人用一个委员会实例来实例化,指示哪些佣金确实发生了。
与之交易
帐户
Visual Chart在一个经纪商中同时支持多个账户。可以使用以下参数控制所选帐户:
account
(默认None
:)VisualChart 在经纪商上同时支持多个账户。如果默认设置
None
到位,则将使用ComTraderAccounts
集合中的第一个帐户 。如果提供了帐户名称,
Accounts
则将检查并使用该集合(如果存在)
操作
标准用法没有变化。只需使用策略中可用的方法(Strategy
完整说明请参阅参考资料)
buy
sell
close
cancel
返回的订单对象
- 标准反向交易者
Order
对象
订单执行类型
Visual Chart支持反向交易者所需的最小订单执行类型, 因此,任何经过回测的东西都可以上线。
因此,订单执行类型仅限于 经纪人模拟中可用的类型:
Order.Market
Order.Close
Order.Limit
Order.Stop
(当触发止损时,市场订单会跟随)Order.StopLimit
(当止损被触发时,一个限价单会跟随)
订单有效期
在回测期间可用的相同有效性概念(使用valid
to buy
和sell
)是可用的并且具有相同的含义。因此, 对于以下值,可视图表订单valid
的参数转换如下:
None
翻译为Good Til Cancelled由于未指定有效性,因此订单必须在取消之前有效
datetime/date
翻译为Good Til Datetimedelta(x)
翻译为Good Til Date (这里timedelta(x) != timedelta()
)
- 这被解释为使订单从
now
+ 开始有效的信号timedelta(x)
timedelta() or 0
转换为会话已传递一个值(而不是
None
),但为Null,并被解释为对当天(会话)有效的订单
通知
标准状态将通过方法 Order
通知给策略notify_order
(如果被覆盖)
Submitted
– 订单已发送至 TWSAccepted
– 已下订单Rejected
– 下单失败或在其生命周期内被系统取消Partial
– 部分执行已发生Completed
– 订单已全部执行Canceled
(或Cancelled
)Expired
– 尚未报告。需要一种启发式方法来区分这种状态与Cancelled
参考
VCStore
class backtrader.stores.VCStore()
包装 ibpy ibConnection 实例的单例类。
参数也可以在使用这个存储的类中指定,比如VCData
和VCBroker
VC经纪商
class backtrader.brokers.VCBroker(**kwargs)
VisualChart 的代理实现。
此类将 VisualChart 中的订单/仓位映射到backtrader
.
参数:
account
(默认:None)VisualChart 在经纪商上同时支持多个账户。如果默认设置
None
到位,则将使用ComTraderAccounts
集合中的第一个帐户 。如果提供了帐户名称,
Accounts
则将检查并使用该集合(如果存在)commission
(默认:None)如果没有将佣金方案作为参数传递,则将自动生成一个对象
请参阅下面的注释以获取更多说明
笔记
- 位置
VisualChart 通过 ComTrader 界面报告“OpenPositions”更新,但仅当仓位具有“大小”时。如果没有这样的位置,则会报告指示位置已移至零的更新。这迫使通过查看执行事件来记录头寸,就像模拟经纪人一样
- 佣金
VisualChart 的 ComTrader 界面不报告佣金,因此自动生成的 CommissionInfo 对象不能使用不存在的佣金来正确计算它们。为了支持佣金commission
,必须使用适当的佣金方案传递参数。
关于佣金计划的文档详细说明了如何执行此操作
- 到期时间
ComTrader 界面(或者它是comtypes 模块?)丢弃 time
来自datetime
对象的信息并且到期日期始终是完整日期。
- 到期报告
目前还没有启发式方法来确定取消的订单何时因到期而被取消。因此,过期的订单被报告为已取消。
VCData
class backtrader.feeds.VCData(**kwargs)
可视化图表数据馈送。
参数:
qcheck
(默认:0.5
)唤醒的默认超时时间让重采样器/重放器可以检查当前柱是否到期只有在数据中插入了重采样/重放过滤器时才使用该值
historical
(默认值:False
)如果没有todate
提供参数(在基类中定义),如果设置为,这将强制仅历史下载True
如果
todate
提供了同样的效果milliseconds
(默认:True
) Visual Chart构建的条形图有这个方面:HH:MM:59.999000如果这个参数是
True
毫秒,将添加到这个时间,使其看起来像:HH::MM + 1:00.000000tradename
(默认值:None
) 连续期货不能交易,但非常适合数据跟踪。如果提供此参数,它将是当前期货的名称,即交易资产。例子:- 001ES -> ES-Mini 连续供应
dataname
- ESU16 -> ES-Mini 2016-09。如果提供了
tradename
这将是交易资产。
- 001ES -> ES-Mini 连续供应
usetimezones
(默认值:True
)对于大多数市场, Visual Chart提供的时间偏移信息 允许将日期时间转换为市场时间(用于表示的反向交易者选择)有些市场是特殊的 (
096
),需要特殊的内部覆盖和时区支持才能在用户预期的市场时间显示。如果此参数设置为
True
导入pytz
将尝试使用时区(默认)禁用它将删除时区使用(如果负载过大可能会有所帮助)