一创客户服务 发布于2018-06-12
评论 0
浏览 294487
15
###一、替换代码注意事项
---------------
####1. 替换代码后,策略加载过程
- 加载策略代码, 因为python是动态语言, 编译即运行, 所以全局的(在函数外写的)代码会被执行一遍.
- 使用保存的状态恢复 g, context, 和函数外定义的全局变量.
- 执行` process_initialize`, 每次启动时都会执行这个函数.
- 如果策略代码和上一次运行时发生了修改,而且代码中定义了 `after_code_changed` 函数,则会运行` after_code_changed `函数.
- 替换代码之后,一般在5分钟之内开始生效(替换后刷新页面,打开具体实盘右侧代码,查看替换后代码是否变化);
- 替换代码后,代码何时运行:这个和具体策略的状态(是否开启实盘、是否已经暂停或者运行失败了)、频率(分钟还是天)、代码、替换时间(盘中还是盘后)有关;一般的正常运行实盘,替换代码后,会在原代码下一次运行时运行新代码(例如分钟级别的盘中替换,下一分钟就会运行新代码;天级别的一般是run_daily中下一个运行时间或者下一个交易日);分钟级别策略可以重新替换代码,在after_code_changed中打印当前时间;如需客户经理帮忙核查,请在确定正常运行分钟级别策略前提下,截图实盘:(1)设置页面,策略信息部分,(2)代码页面,替换代码,替换时间和状态部分,(3)代码页面,策略的初始化部分和替换代码部分,(4)实盘日志;不确定的话,可以关闭使用新代码新建实盘;
####2.替换代码注意事项
- **替换的代码是在原策略的基础上修改(不是新建一个策略或者在其他策略上修改)且修改后进行回测**;
- 替换代码后不再执行 initialize 函数,initialize函数在整个模拟盘的生命周期中只执行一次. 即使是更改回测后, initialize 也不会执行;
- 更改回测之后上述的全局变量(包括 g 和 context 中保存的)不会丢失, run_daily() 函数依然会执行. 新代码中 initialize 不会执行;
- 使用`after_code_change` 函数:
如果需要修改原来的值, 可以在 after_code_changed 函数里面修改;
- 使用`unschedule_all`函数:
如果需要指定新的定期执行的函数, 调用 unschedule_all 清除原有 run_daily() 运行时间(请注意是所有的定时任务),再重新指定 run_daily() 运行时间,(请在`after_code_change` 中调用此函数);
- 使用`process_initialize(context) `函数:
initialize 函数在整个实盘交易/模拟交易的生命周期中只执行一次,后续策略运行过程中不再重复执行,而一些初始化的数据不能被通过pickle序列化, 在实盘交易/模拟交易策略进程重启后会丢失状态。为解决这个问题,我们提供了process_initialize(context)函数;
process_initialize 函数会在每次实盘交易/模拟交易/回测进程重启时执行, **一般用来初始化一些不能持久化保存的内容.(如 get_fundamentals 中的 query 对象)**;
执行顺序是在 initialize 后执行,实盘交易/模拟交易会每天启动, 所以这个函数会每天都执行.
####3.替换代码示例
- after_code_changed示例
比如, 原来代码是:
```python
def initialize(context):
g.stock = '000001.XSHE'
run_daily(buy_stock, 'open')
run_daily(sell_stock, time='11:00')
```
现在想修改`g.stock = '000002.XSHE'`, run_daily 运行时间为 `before_open`,必须定义 after_code_changed:
```python
def after_code_changed(context):
print('{0}替换了代码'.format(context.current_dt))
# 清除/取消所有原有 run_daily() 运行任务(请注意是所有的定时任务)
unschedule_all()
g.stock = '000002.XSHE'
run_daily(buy_stock, 'before_open')
# 虽然没有修改运行时间,但是初始化中的定时任务已经被清除,需要再写一次
run_daily(sell_stock, time='11:00')
```
- process_initialize(context)示例
```python
def process_initialize(context):
# query 对象不能被 pickle 序列化, 所以不能持久保存, 所以每次进程重启时对它初始化
# 以两个下划线开始, 系统序列化 [g] 时就会自动忽略这个变量,
g.__q = query(valuation
).filter(valuation.code == '000001.XSHE'
))
def handle_data(context, data):
get_fundamentals(g.__q)
```
g.__q 每天都会被初始化一遍,在 handle_data 中调用 get_fundamentals 不会出错。
------------
###二、替换代码操作方法
-----------
####1.进入实盘交易策略,点击“代码”,对将要替换的策略代码进行系统审核
![图片 1.png][1]
####2.在该策略的回测列表中选择需要替换的回测,并点击确定
![图片 12.png][2]
![图片 13.png][3]
####3.审核通过后可以将代码替换成相应的策略
![图片 11.png][4]
[1]: https://ycjq.95358.com/img/fbe4f5a67629739983969fa040af0be8
[2]: https://ycjq.95358.com/img/b9b4fb63bfd08630bebc27800d7d65f2
[3]: https://ycjq.95358.com/img/007c536d9ac403690892a4d81ad6306a
[4]: https://ycjq.95358.com/img/86f7730c7e3954547efb8055eaaf92b0