@Channelchan
2018-12-04T14:15:57.000000Z
字数 17363
阅读 59728
clone vnpy from https://github.com/xingetouzi/vnpy_fxdayu and install it
(1)策略类名以Strategy结尾,如multiATR_Strategy
(2)super(multiATR_Strategy, self).init(ctaEngine, setting),继承CtaTemplate类模板
(3)onInit()函数初始化变量,self.setArrayManagerSize()设置数据推送长度
(4)保存在paramList和varList的参数和变量的值会在vnpy的策略界面显示,方便策略运行时查看
(5)onBar()函数编写一分钟周期策略逻辑,通常作为出场指标计算与风险控制
(6)on15MinBar()函数,在15分钟周期下编写交易逻辑,即每15分钟计算一次指标
(7)onOrder()和onTrade()分别为交易委托信息和交易成交信息推送
(8)在执行开平仓逻辑时候,使用bar.close*1.02或者bar.close*0.98是为了更快速成交,避免发出信号没平仓的情况
(9)仓位信息保存在posdict中,适用posdict[symbol+'LONG'] 和 posdict[symbol+'SHORT']读取
(10)self.writeCtaLog()在实盘交易中会输出日志并保存在temp文件中,方便策略复盘
进场条件,当满足波动率的条件以及突破周期最高低价格时买入或者卖出
出场条件,使用吊灯止损以及固定止盈法平仓(加减仓以及止盈止损方法见大鱼学院仓位管理内容)
#coding: utf-8from __future__ import divisionfrom vnpy.trader.vtConstant import *from vnpy.trader.app.ctaStrategy import CtaTemplateimport warningsimport numpy as npimport talib as taimport pandas as pdfrom datetime import datetimewarnings.filterwarnings('ignore')class multiATR_Strategy(CtaTemplate):className = 'multiATR_Strategy'author = 'Sky'#策略交易标的symbol = EMPTY_STRINGposDict = {} # 仓位数据缓存eveningDict = {} # 可平仓量数据缓存bondDict = {} # 保证金数据缓存up_value = 16down_value = 16window1 = 18window2 = 28trailingPercent = 4fixsize = 1stopRatio = 0.02 # 止损百分比profitMultiplier = 6 # 止盈与止损比例transactionPrice = {} # 记录成交价格intraTradeHighDict = {}intraTradeLowDict = {}adx_con = {} # 均线趋势,多头1,空头-1atr_con = {}cross = {}Ma_exit = {}MA_CON = {}# 策略变量initbars = 100 # 获取历史数据的条数# 参数列表,保存了参数的名称paramList = ['name','className','author','Window1','Window2','trailingPercent','fixsize','stopRatio','profitMultiplier','up_value','down_value']# 变量列表,保存了变量的名称varList = ['inited','trading','posDict','atr_con','cross','MA_CON']# 同步列表,保存了需要保存到数据库的变量名称syncList = ['posDict','eveningDict','bondDict']# ----------------------------------------------------------------------def __init__(self, ctaEngine, setting):"""Constructor"""super(multiATR_Strategy, self).__init__(ctaEngine, setting)# ----------------------------------------------------------------------def onInit(self):"""初始化策略(必须由用户继承实现)"""self.writeCtaLog(u'策略%s:初始化' % self.className)self.adx_con = {s: 0 for s in self.symbolList}self.atr_con = {s: 0 for s in self.symbolList}self.cross = {s: 0 for s in self.symbolList}self.transactionPrice = {s: 0 for s in self.symbolList}self.Ma_exit = {s: 0 for s in self.symbolList}self.MA_CON = {s: 0 for s in self.symbolList}self.intraTradeHighDict = {s: 0 for s in self.symbolList}self.intraTradeLowDict ={s: 0 for s in self.symbolList}self.setArrayManagerSize(100)self.putEvent()'''在点击初始化策略时触发,载入历史数据,会推送到onbar去执行updatebar,但此时ctaEngine下单逻辑为False,不会触发下单.'''# ----------------------------------------------------------------------def onStart(self):"""启动策略(必须由用户继承实现)"""# self.writeCtaLog(u'策略%s:启动' % self.className)# self.ctaEngine.loadSyncData(self) # 加载当前正确的持仓self.putEvent()'''在点击启动策略时触发,此时的ctaEngine会将下单逻辑改为True,此时开始推送到onbar的数据会触发下单.'''# ----------------------------------------------------------------------def onStop(self):"""停止策略(必须由用户继承实现)"""# self.writeCtaLog(u'策略%s:停止' % self.className)self.putEvent()# ----------------------------------------------------------------------def onRestore(self):"""从错误状态恢复策略(必须由用户集成实现)"""# self.writeCtaLog(u'策略%s:恢复策略状态成功' % self.Name)self.putEvent()# ----------------------------------------------------------------------def onTick(self, tick):"""收到行情TICK推送"""pass# ----------------------------------------------------------------------def onBar(self, bar):"""收到1分钟K线推送"""symbol = bar.vtSymbol# 无持仓状态,重置变量if self.posDict[symbol+"_LONG"] == 0 and self.posDict[symbol+"_SHORT"] == 0:self.intraTradeHighDict[symbol] = 0self.intraTradeLowDict[symbol] = 999999# 洗价器elif (self.posDict[symbol+"_LONG"] > 0):self.intraTradeHighDict[symbol] = max(self.intraTradeHighDict[symbol], bar.high)self.intraTradeLowDict[symbol] = bar.lowself.longStop = self.intraTradeHighDict[symbol]*(1-self.trailingPercent/100)if bar.close<=self.longStop or (bar.close > self.transactionPrice[symbol] * (1 + self.profitMultiplier * self.stopRatio)):self.cancelAll()self.sell(symbol, bar.close*0.98, self.fixsize)elif (self.posDict[symbol+"_SHORT"] > 0):self.intraTradeLowDict[symbol] = min(self.intraTradeLowDict[symbol], bar.low)self.intraTradeHighDict[symbol] = bar.highself.shortStop = self.intraTradeLowDict[symbol]*(1+self.trailingPercent/100)if (bar.close>=self.shortStop) or (bar.close < self.transactionPrice[symbol] * (1 - self.profitMultiplier * self.stopRatio)):self.cancelAll()self.cover(symbol, bar.close*1.02, self.fixsize,priceType=PRICETYPE_LIMITPRICE,levelRate = 10)self.putEvent()# ----------------------------------------------------------------------def on15MinBar(self, bar):"""60分钟K线推送"""symbol = bar.vtSymbolam15 = self.getArrayManager(symbol, "15m")if not am15.inited:return### 计算波动率指标atr14 = ta.ATR(am15.high,am15.low,am15.close,14)atr66 = ta.ATR(am15.high,am15.low,am15.close,66)self.upband = ta.MAX(am15.close,self.up_value)self.downband = ta.MIN(am15.close,self.down_value)if am15.close[-2]<self.upband[-2] and am15.close[-1]>self.upband[-2]:self.cross[symbol] = 1elif am15.close[-2]>self.downband[-2] and am15.close[-1]<self.downband[-2]:self.cross[symbol] = -1else:self.cross[symbol] = 0if atr14[-1]>atr66[-1]:self.atr_con[symbol] = 1else:self.atr_con[symbol] = 0if (self.cross[symbol] == 1 and self.atr_con[symbol] == 1):# 如果满足开仓条件时手头没有持仓,则直接做多if (self.posDict[symbol+"_LONG"]==0) and (self.posDict[symbol+"_SHORT"]==0):self.buy(symbol,bar.close*1.02, self.fixsize)# 如果有空头持仓,则先平空,再做多elif self.posDict[symbol+"_SHORT"] == 1:self.cover(symbol,bar.close*1.02, self.fixsize)self.buy(symbol,bar.close*1.02, self.fixsize)# 空头开仓elif (self.cross[symbol] == -1 and self.atr_con[symbol] == 1) :if (self.posDict[symbol+"_LONG"]==0) and (self.posDict[symbol+"_SHORT"]==0):self.short(symbol,bar.close, self.fixsize)elif self.posDict[symbol+"_LONG"] == 1:self.sell(symbol,bar.close*0.98, self.fixsize)self.short(symbol,bar.close*0.98, self.fixsize)def onOrder(self, order):"""收到委托变化推送(必须由用户继承实现)"""self.putEvent()# ----------------------------------------------------------------------def onTrade(self, trade):"""收到成交信息变化推送"""symbol = trade.vtSymbol#print("\n\n\n\n stg onTrade", trade.vtSymbol)self.transactionPrice[symbol] = trade.price#print('trade direction',trade.direction,'offset',trade.offset,'price',trade.price, trade.dt)# self.writeCtaLog('onTrade price:%s'%trade.price)# self.saveSyncData()pass# ---------------------------------------------------------------------def onStopOrder(self, so):"""停止单推送"""pass
from __future__ import divisionfrom vnpy.trader.app.ctaStrategy import BacktestingEnginefrom vnpy.trader.app.ctaStrategy.ctaBase import *if __name__ == '__main__':# 创建回测引擎engine = BacktestingEngine()# 设置引擎的回测模式为K线engine.setBacktestingMode(engine.BAR_MODE)# 设置使用的历史数据库engine.setDatabase('VnTrader_1Min_Db')# 设置回测用的数据起始日期,initHours 默认值为 0engine.setStartDate('20180605 01:00', initHours=10)engine.setEndDate('20181030 12:00')# 设置产品相关参数engine.setCapital(100000) # 设置起始资金,默认值是1,000,000engine.setSlippage(0.002) # 股指1跳engine.setRate(0.3 / 10000) # 万0.3engine.setSize(300) # 股指合约大小engine.setPriceTick(0.002) # 股指最小价格变动# 策略报告默认不输出,默认文件夹生成于当前文件夹下engine.setLog(True, "D:\\log\\") # 设置是否输出日志和交割单, 默认值是不输出Falseengine.setCachePath("D:\\vnpy_data\\") # 设置本地数据缓存的路径,默认存在用户文件夹内# 在引擎中创建策略对象d = {'symbolList': ['EOSUSDT:binance']}#d = {'symbolList':['eos_quarter:OKEX']}engine.initStrategy(multiATR_Strategy, d)# 开始跑回测engine.runBacktesting()# 显示回测结果engine.showBacktestingResult()engine.showDailyResult()
2018-12-03 01:03:15.091338 第一笔交易: 2018-06-05 18:12:00
2018-12-03 01:03:15.091338 最后一笔交易: 2018-10-30 11:58:00
2018-12-03 01:03:15.091338 总交易次数: 260
2018-12-03 01:03:15.091338 总盈亏: -320.8
2018-12-03 01:03:15.091338 最大回撤: -1,163.69
2018-12-03 01:03:15.091338 平均每笔盈利: -1.23
2018-12-03 01:03:15.091338 平均每笔滑点: 1.2
2018-12-03 01:03:15.091338 平均每笔佣金: 0.12
2018-12-03 01:03:15.091338 胜率 33.46%
2018-12-03 01:03:15.091338 盈利交易平均值 76.12
2018-12-03 01:03:15.091338 亏损交易平均值 -40.13
2018-12-03 01:03:15.091338 盈亏比: 1.9
2018-12-03 01:03:16.138695 策略回测统计图已保存

2018-12-03 01:03:16.974330 计算按日统计结果
2018-12-03 01:03:17.017303 ------------------------------
2018-12-03 01:03:17.017303 首个交易日: 2018-06-05 00:00:00
2018-12-03 01:03:17.017303 最后交易日: 2018-10-30 00:00:00
2018-12-03 01:03:17.017303 总交易日: 148
2018-12-03 01:03:17.017303 盈利交易日 65
2018-12-03 01:03:17.017303 亏损交易日: 82
2018-12-03 01:03:17.017303 起始资金: 100000
2018-12-03 01:03:17.017303 结束资金: 99,679.85
2018-12-03 01:03:17.017303 总收益率: -0.32%
2018-12-03 01:03:17.017303 年化收益: -0.52%
2018-12-03 01:03:17.017303 总盈亏: -320.15
2018-12-03 01:03:17.017303 最大回撤: -1,057.75
2018-12-03 01:03:17.018302 百分比最大回撤: -1.05%
2018-12-03 01:03:17.018302 总手续费: 32.21
2018-12-03 01:03:17.018302 总滑点: 311.4
2018-12-03 01:03:17.018302 总成交金额: 1,073,736.36
2018-12-03 01:03:17.018302 总成交笔数: 519
2018-12-03 01:03:17.018302 日均盈亏: -2.16
2018-12-03 01:03:17.018302 日均手续费: 0.22
2018-12-03 01:03:17.018302 日均滑点: 2.1
2018-12-03 01:03:17.018302 日均成交金额: 7,254.98
2018-12-03 01:03:17.018302 日均成交笔数: 3.51
2018-12-03 01:03:17.018302 日均收益率: -0.0%
2018-12-03 01:03:17.019305 收益标准差: 0.11%
2018-12-03 01:03:17.019305 Sharpe Ratio: -0.4
2018-12-03 01:03:19.177748 策略回测绩效图已保存

(1)收益率等盈亏指标观察总体盈利情况
(2)总成交笔数观察交易频率
(3)最大回测以及日均盈亏等按日统计指标观察是否有一些黑天鹅事件等特殊风险
(4)通常夏普比率大于2以上是比较不错的策略
(5)engine.setLog(True, "D:\log\")获取策略回测绩效报告
(6)engine.setCachePath("D:\vnpy_data\")数据缓存地址
#coding: utf-8from __future__ import divisionfrom vnpy.trader.vtConstant import *from vnpy.trader.app.ctaStrategy import CtaTemplateimport warningsimport numpy as npimport talib as taimport pandas as pdfrom datetime import datetimewarnings.filterwarnings('ignore')class multiATR_Strategy(CtaTemplate):className = 'multiATR_Strategy'author = 'Sky'#策略交易标的up_value = 16down_value = 16Window1 = 14Window2 = 66Window3 = 18Window4 = 28trailingPercent = 4fixsize = 1stopRatio = 0.02 # 止损百分比profitMultiplier = 6 # 止盈与止损比例transactionPrice = {} # 记录成交价格intraTradeHighDict = {}intraTradeLowDict = {}atr_con = {}cross = {}MA_CON = {}# 策略变量initbars = 100 # 获取历史数据的条数# 参数列表,保存了参数的名称paramList = ['name','className','author','Window1','Window2','trailingPercent','fixsize','stopRatio','profitMultiplier','up_value','down_value']# 变量列表,保存了变量的名称varList = ['inited','trading','posDict','atr_con','cross','MA_CON']# 同步列表,保存了需要保存到数据库的变量名称syncList = ['posDict','eveningDict','bondDict']# ----------------------------------------------------------------------def __init__(self, ctaEngine, setting):"""Constructor"""super(multiATR_Strategy, self).__init__(ctaEngine, setting)# ----------------------------------------------------------------------def onInit(self):"""初始化策略(必须由用户继承实现)"""self.writeCtaLog(u'策略%s:初始化' % self.className)self.adx_con = {s: 0 for s in self.symbolList}self.atr_con = {s: 0 for s in self.symbolList}self.cross = {s: 0 for s in self.symbolList}self.transactionPrice = {s: 0 for s in self.symbolList}self.Ma_exit = {s: 0 for s in self.symbolList}self.MA_CON = {s: 0 for s in self.symbolList}self.intraTradeHighDict = {s: 0 for s in self.symbolList}self.intraTradeLowDict ={s: 0 for s in self.symbolList}self.setArrayManagerSize(100)self.putEvent()'''在点击初始化策略时触发,载入历史数据,会推送到onbar去执行updatebar,但此时ctaEngine下单逻辑为False,不会触发下单.'''# ----------------------------------------------------------------------def onStart(self):"""启动策略(必须由用户继承实现)"""self.writeCtaLog(u'策略%s:启动' % self.className)# self.ctaEngine.loadSyncData(self) # 加载当前正确的持仓self.putEvent()'''在点击启动策略时触发,此时的ctaEngine会将下单逻辑改为True,此时开始推送到onbar的数据会触发下单.'''# ----------------------------------------------------------------------def onStop(self):"""停止策略(必须由用户继承实现)"""# self.writeCtaLog(u'策略%s:停止' % self.className)self.putEvent()# ----------------------------------------------------------------------def onRestore(self):"""从错误状态恢复策略(必须由用户集成实现)"""# self.writeCtaLog(u'策略%s:恢复策略状态成功' % self.Name)self.putEvent()# ----------------------------------------------------------------------def onTick(self, tick):"""收到行情TICK推送"""pass# ----------------------------------------------------------------------def onBar(self, bar):"""收到1分钟K线推送"""symbol = bar.vtSymbol# 无持仓状态,重置变量if self.posDict[symbol+"_LONG"] == 0 and self.posDict[symbol+"_SHORT"] == 0:self.intraTradeHighDict[symbol] = 0self.intraTradeLowDict[symbol] = 999999# 洗价器elif (self.posDict[symbol+"_LONG"] > 0):self.intraTradeHighDict[symbol] = max(self.intraTradeHighDict[symbol], bar.high)self.intraTradeLowDict[symbol] = bar.lowself.longStop = self.intraTradeHighDict[symbol]*(1-self.trailingPercent/100)if bar.close<=self.longStop or (bar.close > self.transactionPrice[symbol] * (1 + self.profitMultiplier * self.stopRatio)):self.cancelAll()self.sell(symbol, bar.close*0.98, self.fixsize)elif (self.posDict[symbol+"_SHORT"] > 0):self.intraTradeLowDict[symbol] = min(self.intraTradeLowDict[symbol], bar.low)self.intraTradeHighDict[symbol] = bar.highself.shortStop = self.intraTradeLowDict[symbol]*(1+self.trailingPercent/100)if (bar.close>=self.shortStop) or (bar.close < self.transactionPrice[symbol] * (1 - self.profitMultiplier * self.stopRatio)):self.cancelAll()self.cover(symbol, bar.close*1.02, self.fixsize)self.putEvent()# ----------------------------------------------------------------------def on15MinBar(self, bar):"""60分钟K线推送"""symbol = bar.vtSymbolam15 = self.getArrayManager(symbol, "15m")if not am15.inited:return### 计算波动率指标atr20 = ta.ATR(am15.high,am15.low,am15.close,self.Window1)atr50 = ta.ATR(am15.high,am15.low,am15.close,self.Window2)self.upband = ta.MAX(am15.close,self.up_value)self.downband = ta.MIN(am15.close,self.down_value)if am15.close[-2]<self.upband[-2] and am15.close[-1]>self.upband[-2]:self.cross[symbol] = 1elif am15.close[-2]>self.downband[-2] and am15.close[-1]<self.downband[-2]:self.cross[symbol] = -1else:self.cross[symbol] = 0if atr20[-1]>atr50[-1]:self.atr_con[symbol] = 1else:self.atr_con[symbol] = 0def on25MinBar(self, bar):"""60分钟K线推送"""symbol = bar.vtSymbolam25 = self.getArrayManager(symbol, "25m")if not am25.inited:returnMA6 = ta.MA(am25.close,self.Window3)MA22 = ta.MA(am25.close,self.Window4)#加入均线过滤条件if MA6[-1]>MA6[-2] and MA22[-1]>MA22[-2]:self.MA_CON[symbol] = 1elif MA6[-1]<MA6[-2] and MA22[-1]<MA22[-2]:self.MA_CON[symbol] = -1else:self.MA_CON[symbol] = 0#print('cross:%s,adx:%s,atr:%s,MACON:%s'%(self.cross[symbol],self.adx_con[symbol],self.atr_con[symbol],self.MA_CON[symbol]))if (self.cross[symbol] == 1 and self.atr_con[symbol] == 1 and self.MA_CON[symbol] == 1):# 如果金叉时手头没有持仓,则直接做多if (self.posDict[symbol+"_LONG"]==0) and (self.posDict[symbol+"_SHORT"]==0):self.buy(symbol,bar.close*1.015, self.fixsize)# 如果有空头持仓,则先平空,再做多elif self.posDict[symbol+"_SHORT"] == 1:self.cover(symbol,bar.close, self.fixsize)self.buy(symbol,bar.close, self.fixsize)# 空头开仓elif (self.cross[symbol] == -1 and self.atr_con[symbol] == 1 and self.MA_CON[symbol] == -1) :if (self.posDict[symbol+"_LONG"]==0) and (self.posDict[symbol+"_SHORT"]==0):self.short(symbol,bar.close, self.fixsize)elif self.posDict[symbol+"_LONG"] == 1:self.sell(symbol,bar.close, self.fixsize)self.short(symbol,bar.close, self.fixsize)def onOrder(self, order):"""收到委托变化推送(必须由用户继承实现)"""self.putEvent()# ----------------------------------------------------------------------def onTrade(self, trade):"""收到成交信息变化推送"""symbol = trade.vtSymbol#print("\n\n\n\n stg onTrade", trade.vtSymbol)self.transactionPrice[symbol] = trade.price#print('trade direction',trade.direction,'offset',trade.offset,'price',trade.price, trade.dt)# self.writeCtaLog('onTrade price:%s'%trade.price)# self.saveSyncData()pass# ---------------------------------------------------------------------def onStopOrder(self, so):"""停止单推送"""pass
from __future__ import divisionfrom vnpy.trader.app.ctaStrategy import BacktestingEnginefrom vnpy.trader.app.ctaStrategy.ctaBase import *if __name__ == '__main__':# 创建回测引擎engine = BacktestingEngine()# 设置引擎的回测模式为K线engine.setBacktestingMode(engine.BAR_MODE)# 设置使用的历史数据库engine.setDatabase('VnTrader_1Min_Db')# 设置回测用的数据起始日期,initHours 默认值为 0engine.setStartDate('20180605 01:00', initHours=10)engine.setEndDate('20181030 12:00')# 设置产品相关参数engine.setCapital(100000) # 设置起始资金,默认值是1,000,000engine.setSlippage(0.002) # 股指1跳engine.setRate(0.3 / 10000) # 万0.3engine.setSize(300) # 股指合约大小engine.setPriceTick(0.002) # 股指最小价格变动# 策略报告默认不输出,默认文件夹生成于当前文件夹下engine.setLog(True, "D:\\log\\") # 设置是否输出日志和交割单, 默认值是不输出Falseengine.setCachePath("D:\\vnpy_data\\") # 设置本地数据缓存的路径,默认存在用户文件夹内# 在引擎中创建策略对象d = {'symbolList': ['EOSUSDT:binance']}engine.initStrategy(multiATR_Strategy, d)# 开始跑回测engine.runBacktesting()# 显示回测结果engine.showBacktestingResult()engine.showDailyResult()
2018-12-03 01:12:51.063547 第一笔交易: 2018-06-05 18:12:00
2018-12-03 01:12:51.063547 最后一笔交易: 2018-10-30 11:58:00
2018-12-03 01:12:51.064546 总交易次数: 113
2018-12-03 01:12:51.064546 总盈亏: 767.36
2018-12-03 01:12:51.064546 最大回撤: -541.01
2018-12-03 01:12:51.064546 平均每笔盈利: 6.79
2018-12-03 01:12:51.064546 平均每笔滑点: 1.2
2018-12-03 01:12:51.064546 平均每笔佣金: 0.13
2018-12-03 01:12:51.064546 胜率 39.82%
2018-12-03 01:12:51.064546 盈利交易平均值 98.0
2018-12-03 01:12:51.064546 亏损交易平均值 -53.57
2018-12-03 01:12:51.064546 盈亏比: 1.83
2018-12-03 01:12:51.856062 策略回测统计图已保存

2018-12-03 01:12:52.505662 计算按日统计结果
2018-12-03 01:12:52.548636 ------------------------------
2018-12-03 01:12:52.548636 首个交易日: 2018-06-05 00:00:00
2018-12-03 01:12:52.548636 最后交易日: 2018-10-30 00:00:00
2018-12-03 01:12:52.548636 总交易日: 148
2018-12-03 01:12:52.548636 盈利交易日 48
2018-12-03 01:12:52.548636 亏损交易日: 74
2018-12-03 01:12:52.548636 起始资金: 100000
2018-12-03 01:12:52.548636 结束资金: 100,768.01
2018-12-03 01:12:52.548636 总收益率: 0.77%
2018-12-03 01:12:52.548636 年化收益: 1.25%
2018-12-03 01:12:52.548636 总盈亏: 768.01
2018-12-03 01:12:52.548636 最大回撤: -527.52
2018-12-03 01:12:52.548636 百分比最大回撤: -0.52%
2018-12-03 01:12:52.548636 总手续费: 14.78
2018-12-03 01:12:52.548636 总滑点: 135.0
2018-12-03 01:12:52.548636 总成交金额: 492,704.55
2018-12-03 01:12:52.548636 总成交笔数: 225
2018-12-03 01:12:52.549634 日均盈亏: 5.19
2018-12-03 01:12:52.549634 日均手续费: 0.1
2018-12-03 01:12:52.549634 日均滑点: 0.91
2018-12-03 01:12:52.549634 日均成交金额: 3,329.08
2018-12-03 01:12:52.549634 日均成交笔数: 1.52
2018-12-03 01:12:52.549634 日均收益率: 0.01%
2018-12-03 01:12:52.549634 收益标准差: 0.09%
2018-12-03 01:12:52.549634 Sharpe Ratio: 0.97
2018-12-03 01:12:54.623435 策略回测绩效图已保存

1、target='sharpeRatio'为优化指标
2、setting.addParameter('Window1', 5, 20, 5)为优化的参数
优化结果得到排序结果如下:
