管理策略

初始化

策略实例创建成功后,就可以对该实例进行初始化了。点击该策略实例下的【初始化】按钮,若初始化成功,则如下图所示:

https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/6.png

初始化过程中,主要按顺序完成了以下三步任务:

  1. 获取历史数据

    为了确保策略内指标数值的准确性,每个策略实例都需要一定的历史数据来进行策略初始化。

    因此,在策略初始化时,策略实例内部的load_bar函数会先去接口获取最新历史数据。如果接口不提供历史数据,则通过RQData(提供国内期货、股票以及期权的历史数据)获取。RQData的数据服务提供盘中K线更新,即使在9点45分才启动策略,也能获取到之前从9点30开盘到9点45分之间的K线数据,提供给策略进行初始化计算,而不用担心数据缺失的问题。如果没有配置RQData数据服务,则通过访问本地数据库查询。这种情况下,用户需要保证数据库中的数据完整性(满足初始化需求),可以通过DataRecorder录制,使用DataManager从CSV文件载入,或者使用其他数据服务来更新数据。

    具体载入数据的长度,取决于load_bar函数的参数控制(策略模板默认是10天)。数据载入后会以逐根K线(或者Tick)的方式推送给策略,实现内部变量的初始化计算,比如缓存K线序列、计算技术指标等。

  2. 载入缓存变量

    在每天实盘运行的过程中,量化策略中的有些变量只和历史行情数据相关,这类变量通过加载历史数据回放就能得到正确的数值。另一类变量则可能和交易状态相关,如策略的持仓、移动止损的最高价跟踪等,这类变量需要缓存在硬盘上(退出程序时),第二天回放完历史数据后再读取还原,才能保证和之前交易状态的一致性。

    每次停止策略时,会自动将策略的variables列表对应的变量以及策略持仓缓存进.vntrader目录下的cta_strategy_data.json文件中,以便在下一次策略初始化时自动载入。

    注意在某些情况下(比如手动平仓了),缓存的数据可能会出现偏差,此时可以通过手动修改json文件来调整。

  3. 订阅行情推送

    最后基于vt_symbol参数获取该策略所交易合约的信息,并订阅该合约的实时行情推送。如果实盘交易系统找不到该合约的信息,比如没有连接登录接口或者vt_symbol填写错误,则会在日志模块中输出相应的报错信息。

以上三个步骤全部完成后,可观察到此时该策略实例的【inited】状态已经为【True】,且变量也都显示对应的数值(不再为0)。说明该策略实例已经调用过load_bar函数加载历史数据并完成初始化了。【trading】状态还是为【False】,说明此时该策略实例还不能开始自动交易。

初始化失败

以下为创建策略实例失败的几种可能情况:

  • 即使交易所填的是vn.py支持的交易所的名字,成功创建了策略实例。但是如果该合约名字输入错误(比如大小写错误,合约与交易所对不上或者已经退市),导致实盘交易系统找不到该合约,则会初始化失败。此时图形界面输出“行情订阅失败,找不到合约”的日志。如下图所示:

    https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/14.png

  • 即使合约代码填写正确,成功创建了策略实例。但是如果此时还没有连接接口,或者接口合约信息查询合约操作还没有完成,导致实盘交易系统找不到该合约,也会初始化失败。此时图形界面输出“行情订阅失败,找不到合约”的日志。如下图所示:

    https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/15.png

    如果出现了“行情订阅失败,找不到合约”这类问题,可以通过VN Trader的主界面点击【帮助】-【查询合约】进行查询,找到正确的合约信息。如下图所示:

    https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/34.png

  • 如果策略内用到了K线时间序列管理模块(ArrayManager)来计算变量指标的值,那么请确保历史数据的长度足够ArrayManager进行初始化(默认的ArrayManager需要100条数据才能初始化成功)。如果历史数据的长度不够ArrayManager初始化,即使图形界面上输出了日志“初始化完成”,该策略实例的初始化也是失败的。

    • 如果策略逻辑是基于示例策略中的,一但ArrayManager没有初始化成功(if not am.inited)就返回了逻辑写的话,那么由下图可观察到,图形界面左侧的策略实例中基于ArrayManager计算的策略指标的值都是0。说明此时该策略实例虽然启动之后就可以开始自动交易了,但是因为ArrayManager没有初始化成功,策略内的逻辑每次走到ArrayManager初始化状态判断时就返回了,走不到计算指标进而发出交易信号的逻辑。该策略实例需要一直等到推进策略实例的数据足够ArrayManager初始化之后,满足ArrayManager初始化的判断条件,才能真正发出交易信号。 https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/16.png

    • 如果策略逻辑不是基于示例策略中的,一但ArrayManager没有初始化成功(if not am.inited)就返回的逻辑写的话,那么虽然图形界面左侧的策略实例中的策略指标有具体数值,而且此时启动可以发出交易信号,无需等待ArrayManager初始化完成。但是因为ArrayManager没有初始化成功,该策略实例计算出来的变量指标值是不准确的,进而可能会发出不符合策略预期的交易信号。

启动

策略实例初始化成功,【inited】状态为【True】时,才能启动该策略的自动交易功能。点击该策略实例下的【启动】按钮,即可启动该策略实例。成功后如下图所示:

https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/17.png

可观察到此时该策略实例的【inited】和【trading】状态都为【True】。说明此时该策略实例已经调用过load_bar函数,完成了历史数据回放,而且此时策略内部的交易请求类函数(buy/sell/short/cover/cancel_order等),以及信息输出类函数(send_email/put_event等),才会真正执行并发出对应的请求指令到底层接口中(真正执行交易)。

在上一步策略初始化的过程中,尽管策略同样在接收(历史)数据,并调用对应的功能函数,但因为【trading】状态为【False】,所以并不会有任何真正的委托下单操作或者交易相关的日志信息输出。

如果启动之后,策略发出了限价单,可以去VN Trader主界面【委托】栏查看委托订单细节。如果策略发出了本地停止单,可以在CTA策略UI界面右上方区域的停止单监控组件查看委托订单细节。

停止

如果启动策略之后,由于某些情况(如到了市场收盘时间,或盘中遇到紧急情况)想要停止、编辑或者移除策略,可以点击策略实例下的【停止】按钮,即可停止该策略实例的自动交易。成功后如下图所示:

https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/18.png

CTA策略引擎会自动将该策略之前发出的所有活动委托全部撤销,以保证在策略停止后不会有失去控制的委托存在。同时该策略实例最新的变量信息会被保存到.vntrader文件夹下的cta_strategy_data.json文件中。

此时可观察到该策略实例的【trading】状态已变为【False】,说明此时该策略实例已经停止自动交易了。

在CTA策略的实盘交易过程中,正常情况应该让策略在整个交易时段中都自动运行,尽量不要有额外的暂停重启类操作。对于国内期货市场来说,应该在交易时段开始前,启动策略的自动交易,然后直到收盘后,再关闭自动交易。因为现在CTP夜盘收盘后也会关闭系统,早上开盘前重启,所以夜盘收盘后也需要停止策略,关闭VN Trader了。

编辑

如果创建策略实例之后,想要编辑某个策略实例的参数(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【编辑】按钮,会弹出参数编辑对话框,以供修改策略参数。如下图所示:

https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/39.png

编辑完策略参数之后,点击下方的【确定】按钮,相应的修改会立即更新在参数表格中,如下图所示:

https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/40.png

但是策略实例的交易合约代码无法修改,同时修改完后也不会重新执行初始化操作。也请注意,此时修改的只是.vntrader文件夹下cta_strategy_setting.json文件中该策略实例的参数值,并没有修改原策略文件下的参数。

修改前,json文件如下图所示:

https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/19.png

修改后,json文件如下图所示:

https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/20.png

若盘中编辑后想要再次启动策略,点击策略实例下的【启动】按钮即可再次启动该略实例,如下图所示:

https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/41.png

移除

如果创建策略实例之后,想要移除某个策略实例(若已启动策略,需要先点击策略实例下的【停止】按钮,停止策略),可以点击该策略实例下的【移除】按钮。移除成功后,图形界面左侧的策略监控组件中将不会再显示该策略实例的信息。如下图所示:

https://vnpy-doc.oss-cn-shanghai.aliyuncs.com/cta_strategy/21.png

此时.vntrader文件夹下的cta_strategy_setting.json文件也移除了该策略实例的配置信息。

状态跟踪

如果想要通过图形界面跟踪策略的状态,有两种方式:

  1. 调用put_event函数

    策略实例中所有的的变量信息,都需要把变量名写在策略的variables列表中,才能在图形界面显示。如果想跟踪变量的状态变化,则需要在策略中调用put_event函数,界面上才会进行数据刷新。

    有时用户会发现自己写的策略无论跑多久,变量信息都不发生变化,这种情况请检查策略中是否漏掉了对put_event函数的调用。

  2. 调用write_log函数

    如果不仅想观察到变量信息的状态变化,还想根据策略的状态输出基于自己需求的个性化的日志,可以在策略中调用write_log函数,进行日志输出。