原文策略源码如下:
#ATR自适应通道
导入函数库
from jqdata import *
import datetime
import time
import talib
‘’’
ArrayManager:
用于拼接K线的类,该策略基于不均匀的K线完成,在固定时间输出bar(日内,如早盘收盘时)
而当前平台未推出该功能,因而自定义ArrayManager类来实现
‘’’
class ArrayManager(object):
# 初始化函数,设定基准等等
def __init__(self, size=100):
# 设定Array的缓存大小
self.size = size
# 基本指标与基本指标的Array字典初始化(用于K线按收盘时间分割)
# 在这里VarArrays指的是全新K线的数据,以字典的形式存放,Vars是更新K线前的缓存
self.Vars = {'close':False,
'open':False,
'high':False,
'low':False}
self.VarsArrays = {'close':np.zeros(size),
'open':np.zeros(size),
'high':np.zeros(size),
'low':np.zeros(size)}
# 更新Array,形成新的bar数据,后续指标等都是基于该Array进行计算
def updateBarArray(self):
for var in self.VarsArrays.keys():
self.VarsArrays[var][0:self.size-1] = self.VarsArrays[var][1:self.size]
self.VarsArrays[var][-1] = self.Vars[var]
# 更新缓存(即为更新Array做准备)
def updateBar(self,close,high,low,open):
# 如果缓存Vars没有数据,或者被clear,则初次写入
if self.Vars['close'] == False:
self.Vars['close'] = close
self.Vars['high'] = high
self.Vars['low'] = low
self.Vars['open'] = open
else:
# 如果有数据,则实时更新
self.Vars['close'] = close
self.Vars['high'] = max(self.Vars['high'],high)
self.Vars['low'] = min(self.Vars['low'],low)
# 清除Bar数据
def clear(self):
self.Vars['open']= False
self.Vars['close']= False
self.Vars['high'] = False
self.Vars['low']= False
# 输出当前Array
def exportArray(self,field):
return self.VarsArrays[field]
# 输出当前缓存变量
def exportVar(self,field):
return self.Vars[field]
# 输出10天内的最高价
def Highest_10(self,future):
return self.VarsArrays['close'][-10*g.TodayBar[future]-1:-1].max()
# 输出10天内的最低价
def Lowest_10(self,future):
return self.VarsArrays['close'][-10*g.TodayBar[future]-1:-1].min()
def initialize(context):
# 设置参数
set_parameter(context)
# 设定基准银华日利,在多品种的回测当中基准没有参考意义
set_benchmark(‘511880.XSHG’)
# 开启动态复权模式(真实价格)
set_option(‘use_real_price’, True)
# 过滤掉order系列API产生的比error级别低的log
log.set_level(‘order’, ‘error’)
### 期货相关设定 ###
# 设定账户为金融账户
set_subportfolios([SubPortfolioConfig(cash=context.portfolio.starting_cash, type=‘futures’)])
# 期货类每笔交易时的手续费是:买入时万分之1,卖出时万分之1,平今仓为万分之1
set_order_cost(OrderCost(open_commission=0.0001, close_commission=0.0001,close_today_commission=0.0001), type=‘index_futures’)
# 设定保证金比例
set_option(‘futures_margin_rate’, 0.15)
# 设置滑点(单边万5,双边千1)
set_slippage(PriceRelatedSlippage(0.001),type=‘future’)
# 开盘前运行
run_daily( before_market_open, time=‘before_open’, reference_security=‘AG8888.XSGE’)
# 开盘时运行
run_daily( DataPrepare, time=‘every_bar’, reference_security=‘AG8888.XSGE’)
# 收盘后运行
run_daily( after_market_close, time=‘after_close’, reference_security=‘AG8888.XSGE’)
#切割函数
def set_parameter(context):
#######变量设置##