第二章:量化策略入门

第一节:MindGo 量化交易平台 






    MindGo 量化交易平台是同花顺旗下的人工智能投资平台,拥有高质海量的金融数据, 


零延迟的回测引擎,最接近真实市场环境的仿真交易平台,干净、完整的API 文档,同时支 


持目前广泛使用的脚本语言——Python 语言,致力打造国内一流的专业在线量化交易平台, 


帮助广大投资者和高校师生实现量化策略,开启AI 时代,让投资变得更简单! 






MindGo 提供以下服务: 






1.数据 






    MindGo 数据基于 2014 年至今完整的Level-2 数据,包括完整的停牌、复权数据,且会 


在第二 日早晨更新。除此之外,MindGo 还提供上市公司财务数据、场外基金数据、行业指 


数数据、股指期货数据等等。 






2. 回测引擎 






    MindGo 提供了高效快捷的回测环境和简洁的API 文档,支持对沪深A 股、ETF 的日级 


或分钟级回测,回测结果实时显示、快速响应、数据全面,方便用户随时检验和优化策略。 






3.模拟交易 






    MindGo 提供实时的沪深A 股和 ETF 模拟交易工具,并支持分钟和日级运行,实时呈现 


策略表现。为量化交易爱好者提供全面、及时、专业、个性的一站式服务。 






4.研究平台 






    MindGo 提供IPython Notebook 研究平台,初学者可在研究平台上学习 Python 语言,专 


业研究者可获取数据,进行研究,最终研究结果支持文件导出和策略应用。 






5.量化交流社区 






    MindGo 提供线上交流社区,便于量化爱好者交流量化策略,学习量化知识,一起成长。 




----------------------- Page 10-----------------------


第二节:MindGo API 介绍 






一、回测引擎介绍 






回测环境 






    MindGo 提供的回测引擎运行在Python 3.5 之上, 因此策略代码必须兼容Python3.5 ,整个 


回测环境支持所有的Python 标准库和部分常用第三方库。 






回测过程 






1.您的策略必须在initilize 函数框架下实现: 






   A.initilize 为初始化函数,用于初始一些全局变量,在整个回测过程最开始执行一 


次。 


   B.handle_data 为时间驱动函数,用于设置买卖条件等,每个回测时间频率 (每日/ 


分钟/tick )调用一次。 


    以下是一个简单的策略,每日开盘买入 100 股贵州茅台,让我们体验一下整个回 


测过程 ! 






#  初始化账户        


def initialize(account): 


    #  定义要交易的股票:贵州茅台 


    account.security = '600519.SH' 


# 设置买卖条件,每个交易频率 (日/ 分钟/tick )调用一次    


def handle_data(account,data): 


    # 每天开盘买入 100 股贵州茅台 


    order(account.security,100) 






2. 完成策略编写后,选定回测开始日期和结束日期,选择初始资金、调仓频率(每日或每 


分钟) 等参数, 点击"进行回测" ,即开始回测。 






3. 回测引擎根据您选择的调仓频率调用 handle_data 函数,也就是执行该函数下的代 


码。回测引擎会实时显示策略当前时间的数据,如收益、风险指标、持仓等信息。 




----------------------- Page 11-----------------------


4. 回测引擎会根据您所使用的下单方式进行下单,并根据后续实际成交情况进行订单处 


理; 




----------------------- Page 12-----------------------


5.您可以在任何时候调用 log 函数来打印需要输出的日志;通过 record  函数输出自定义 


图形。添加log.info 函数与 record 函数后的代码如下: 






#  初始化账户        


def initialize(account): 


    #  定义要交易的股票:贵州茅台 


    account.security = '600519.SH' 


# 设置买卖条件,每个交易频率 (日/ 分钟/tick )调用一次    


def handle_data(account,data): 


    # 每天开盘买入 100 股贵州茅台 


    order(account.security,100) 


    # 获取账户可用资金 


    money=account.cash 


    # 获取账户已用资金 


    used_money=account.capital_used*(-1) 


    #log.info() 函数打印信息 


    log.info(' 已使用资金'+str(used_money)) 


    #record 函数进行 自定义画图,分别为可用资金与已用资金 


    record(money=money,used_money=used_money) 






策略运行结果,回测结果页面上分别显示了可用资金和 已用资金曲线: 




----------------------- Page 13-----------------------


运行时间 






回测引擎通过以下方法对您的策略进行回测 






1.开盘前(9:00)运行: 


  before_trading_start  函数 






2. 盘中运行: 


  handle_data 函数 


   > 日回测(9:30:00)运行一次 


   > 分钟回测(9:30:00-11:30,13:00:00-15:00:00) ,每分钟运行一次 






3.盘后(15:30)运行: 


  after_trading_end 函数 






订单处理 






    对于你的策略在某个单位时间下的单,回测引擎会做如下处理: 






1.按每日回测 






 A. 交易价格: 


 > 市价单:开盘价+滑点。 


 > 限价单:委托价+滑点。 






 B.最大成交量: 


 > 默认为下单个股当日总成交量的 25% 。 


 > 若下单量低于最大成交量,则按下单量成交;若下单量大于最大成交量,则按最大 


成交量成交。 






 C.撮合方式: 


 > 市价单:开盘下单,一次性撮合,不成交或未成交部分即刻取消委托。若开盘价为 


涨停价,则买入不成交;若开盘价为跌停价,则卖出不成交。 


 > 限价单:开盘下单,之后每分钟均按分钟价量撮合一次,未成交部分顺延至下一分 


钟进行撮合,直到完全成交或者当天收盘为止。 






2.分钟回测 






 A. 交易价格: 


 > 市价单:当前分钟起始价+滑点 


 > 限价单:委托价 + 滑点,如不符合则不成交 






 B.最大成交量: 


 > 默认为下单个股当前分钟总成交量的 50% 。 


 > 若下单量低于最大成交量,则按下单量成交;若下单量大于最大成交量,则按最大 


成交量成交。 






  




----------------------- Page 14-----------------------


  C.撮合方式: 


 > 市价单:分钟起始点下单,一次性撮合,不成交或未成交部分即刻取消委托。若分 


钟起始价为当日涨停价,则买入不成交;若分钟起始价为当日跌停价,则卖出不成交 


 > 限价单:分钟起始点下单,之后每分钟均按分钟价量撮合一次,未成交部分顺延至 


下一分钟进行撮合,直到完全成交或者当天收盘为止。  






二、函数 API 介绍 






    MindGo 量化交易平台有80 多个函数,每个函数都有其功能,本节主要介绍三类函数, 


并针对该类函数中的最常用 1 至2 个函数做简要介绍,并在下一节中,能完成第一个量化策 


略。 






    第一类量化策略框架函数,为了驱动策略回测、规范量化策略编写,MindGo 提供以下 


两个函数: 






1.初始化函数:initialize  






函数调用方法: 


    def initialize(account):  


函数功能: 


    def initialize(account): 是初始化函数,整个回测只在最开始时执行一次,用于初始化 


账户信息、回测参数、全局变量等.  


注意事项: 


     1.该函数用于初始化账户,任何一个策略都必须有该函数,相当于开户.  


    2.在该函数下,你可以设置很多初始条件,例如:基准指数,交易佣金,滑点,股票池等 


等.  


    3.该函数不能写成initialize(account) ,而必须写成python  的函数形式:def  


initialize(account) :(温馨提示:不能落下冒号.)  


示例: 


def initialize(account): 


    #初始化策略时设置股票池 


    account.security='000001.SZ' 






2.定时运行函数:handle_data 






函数调用方法: 


     def handle_data(account, data): 


函数功能 


     def handle_data(account, data):函数用来定时执行买卖条件,每个交易频率 (日/分 


钟/tick )自动调用一次. 






注意事项: 


1.该函数在回测中的非交易日是不会触发的.(例如1 月1 日至3 日是非交易日,则handle_data 


在1 日至3 日不触发,直到下一个交易日4 号触发) 


2.该函数的交易频率根据策略的交易频率,在盘中运行: 


    i. 日回测(9:30:00),每日运行一次. 


    ii.分钟回测(9:30:00-11:30,13:00:00-15:00:00),每分钟运行一次. 




----------------------- Page 15-----------------------


3.在该函数中,可以传入其他函数的运行结果,用来判断买卖条件. 


4.该函数不能写成handle_data(account, data) ,而必须写成python 语言中规范的函数形式: 


def handle_data(account, data):(温馨提示:不能落下冒号) 


示例: 


# 每个交易频率下单买 100 股的平安银行股票. 


def handle_data(account, data): 


    order('000001.SZ', 100) 






    第二类获取数据函数,以函数形式,通过参数设置以满足您数据获取: 






1.行情数据获取函数:history 






调用方法: 


    history(symbol_list, fields, bar_count, fre_step, skip_paused = False, fq = 'pre', is_panel=0) 


函数功能:获取多只股票多属性的历史行情数据。 


函数参数: 






 参数         含义                      参数举例 






 symbol_list 股票、指数或基金代码列表 填写需要获取数据的股票代码,可多个股票 


                                    同时获取,例如:['600519.SH'] 






 fields      数据字段                   填写需要获取的数据字段,例如:收盘价为 


                                    close,最高价为high ,['close','high'] 






bar_count    历史长度                   填写需要获取的数据历史长度,例如:20 






 fre_step    时间步长                   填写获取数据的时间步长,例如:按天则 


                                    为’1d’, 按x 分钟则为’xm’ 。 






 skip_paused 是否跳过停牌数据               填写获取数据是是否跳过停牌,例如:不跳过 


                                    为 skip_paused=False,跳过为 


                                    skip_paused=True 。 






 fq          复权选项                   填写获取数据的复权选项,fq=None 为不复权, 


                                    fq='post'为后复权,fq='pre'为前复权。 






 is_panel   返回数据格式                  选择返回的数据格式,is_panel=1 为 


                                    pandas.panel 格式,is_panel=0 为 dict 格式。 






注意事项: 


1.该函数没有起始日期,结束日期默认为上一个交易日或上一分钟。 


您只需要在策略代码中调用相该函数,并确定函数内的参数,即可获取到相应数据,详细参 


考以下两个示例。 


 【示例1】 


def initialize(account): 


    pass 


def handle_data(account,data): 


    #获取万科 A 与平安银行过去 10 日的收盘价与最高价,并且输出数据 


    price=history(['000001.SZ','000002.SZ'], ['close','high'], 10, '1d', False, 'pre', is_panel=1) 


    log.info('收盘价:'+str(price['close'])) 


    log.info('最高价:'+str(price['high'])) 




----------------------- Page 16-----------------------


 【示例2 】 


def initialize(account): 


    pass 


def handle_data(account,data): 


    #获取万科 A 与平安银行过去 10 个 60 分钟级的开盘价,并且输出数据 


    price=history(['600519.SH','300033.SZ'], ['open'] , 10, '60m', False, 'pre', is_panel=0) 


    log.info('300033.SZ 开盘价:'+str(price['300033.SZ'])) 


    log.info('600519.SH 开盘价:'+str(price['600519.SH'])) 






示例返回结果: 


 【示例1】返回结果: 


2017-01-03 09:30:00 - INFO 


收盘价:        000001.SZ  000002.SZ 


2016-12-19       9.20      21.10 


2016-12-20       9.11      20.33 


2016-12-21       9.16      20.48 


2016-12-22       9.14      20.61 


2016-12-23       9.08      20.30 


2016-12-26       9.12      20.65 


2016-12-27       9.08      21.42 


2016-12-28       9.06      21.20 


2016-12-29       9.08      20.84 


2016-12-30       9.10      20.55 


2017-01-03 09:30:00 - INFO 


最高价:        000001.SZ  000002.SZ 


2016-12-19       9.23      22.00 


2016-12-20       9.20      21.00 


2016-12-21       9.16      20.70 


2016-12-22       9.16      20.77 


2016-12-23       9.14      20.67 


2016-12-26       9.13      20.69 


2016-12-27       9.13      21.98 


2016-12-28       9.11      21.48 


2016-12-29       9.09      21.32 


2016-12-30       9.10      20.96 


 【示例2 】返回结果: 


2017-01-03 09:30:00 - INFO 


300033.SZ 开盘价:    open 


2016-12-27 13:59:00  69.00 


2016-12-27 14:59:00  68.50 


2016-12-28 10:29:00  68.12 


2016-12-28 11:29:00  68.69 


2016-12-28 13:59:00  68.49 


2016-12-28 14:59:00  68.55 


2016-12-29 10:29:00  68.90 


2016-12-29 11:29:00  68.81 


2016-12-29 13:59:00  70.20 


2016-12-29 14:59:00  70.11 


2017-01-03 09:30:00 - INFO 


600519.SH 开盘价:    open 


2016-12-27 13:59:00  328.30 




----------------------- Page 17-----------------------


2016-12-27 14:59:00  326.55 


2016-12-28 10:29:00  326.99 


2016-12-28 11:29:00  326.00 


2016-12-28 13:59:00  325.19 


2016-12-28 14:59:00  325.40 


2016-12-29 10:29:00  324.01 


2016-12-29 11:29:00  323.70 


2016-12-29 13:59:00  325.80 


2016-12-29 14:59:00  325.80 






    第三类下单函数,以函数形式,通过参数设置以满足您策略下单交易: 






1.按金额下单函数:order_value 






函数调用方法: 


    order_value (symbol, amount) 


函数功能 


    order_value 是下单函数,根据股数下单,交易股票. 


函数参数: 






 参数       含义                      参数举例 






 symbol   股票、指数或基金代码列表 填写需要下单交易的股票代码,不可多个股票 


                                  同时获取,例如:'600519.SH' 






value     下单金额                    填写需要下单的交易的金额,正数表示买入,负 


                                  数表示卖出 






注意事项: 


1. 由于股票单次买入必须以 1 手 (100 股 )为单位,实际成交金额小于等于下单金额。 


示例: 


def initialize(account): 


    pass 


def handle_data(account,data): 


    #买入 10000 元平安银行 


    order_value(symbol='000001.SZ',value=10000) 






2.按股数下单函数:order 






函数调用方法: 


    order(symbol, amount) 


函数功能 


    order 是下单函数,根据股数下单,交易股票. 


函数参数: 






 参数       含义                      参数举例 






 symbol   股票、指数或基金代码列表 填写需要下单交易的股票代码,不可多个股票 


                                  同时获取,例如:'600519.SH' 






amount    下单股数                    填写需要下单交易的股票数量,正数表示买入, 


                                  负数表示卖出 




----------------------- Page 18-----------------------


示例: 


def initialize(account): 


    pass 


def handle_data(account,data): 


    #买入 100 股平安银行 


    order(symbol='000001.SZ',amount=100) 




----------------------- Page 19-----------------------


第三节:我的第一个量化策略 






    对于大部分人来说,量化交易是非常陌生与神秘的。本节内容将带你开启第一个量化策 


略! 


  本节内容摘要:1.理解量化策略的基本框架。2.学会编写一个简单的量化交易策略。3. 


学会将量化交易策略绑定实盘模拟交易,并实时收到交易策略的买卖信号。 






1.理解量化策略的基本框架 






  通常情况下,完整的量化交易策略至少需要确定两件事: 


   A.交易标的,即买什么; 


   B.确定交易时机,即怎么买卖。 


  让我们来设计一个简单完整的量化交易策略: 


   策略交易标的:贵州茅台; 


   策略交易时机:5 日均线与 20  日均线金叉时,买入;5 日均线与 20  日均线死叉时, 


卖出。 




----------------------- Page 20-----------------------


2.学会编写一个简单的量化交易策略 






第一步:打开MindGo 量化交易平台,先在上方导航栏点击 “我的策略”—“策略编译”, 


再点击蓝色按钮 “+新建策略”,接着点击已创建的策略进入策略编译器页面,如下: 






温馨提示:“回测列表”下方三个按钮,可以设置编译器字体大小,背景颜色,开启全屏编 


译,查看 API 文档,如下: 






第二步:理解量化交易策略框架对应的代码框架。 






def initialize(account): 


    #初始化函数:确定交易标的 


def handle_data(account,data):     


    #定时运行函数:确定交易时机 




----------------------- Page 21-----------------------


  框架理解: 


  1.def initialize(account)与 def handle_data(account,data)是两个函数,函数格式固定为:def 


函数名 (参数),其中def 后面带空格键,函数末尾必须带冒号。 


  2.def initialize(account) 函数是初始化函数,只运行一次,确定初始化条件;def  


handle_data(account,data) 函数是定时运行函数,平台默认该函数定时运行。日级策略,每日 


9 :30 ;分钟级策略,交易期间内的每分钟。 


  3.“#”后面为注释内容,用于注释代码,便于编写和阅读。 






第三步:确定交易标的:account.security = '600519.SH' 。 






  温馨提示: 


  1.account 是账户对象,该对象存放所有账户相关信息,持仓、可用现金、资产盈亏。 


  2.account.security 是在账户对象下,设置security 变量,存放在账户内,这里我们需要确 


定交易标的,即:account.security = '600519.SH' 。 


def initialize(account): 


    account.security = '600519.SH'# 已确定交易标的 


def handle_data(account,data):     


    #定时运行函数:确定交易时机 






第四步:确定交易时机,即为:5 日均线与 20  日均线金叉时,买入;5 日均线与 20  日均线 


死叉时,卖出。 






  从交易时机出发,我们需要计算交易标的 5 日和 20  日均线,那么5、20  日均线需要用 


历史行情数据的收盘价来计算。 






  整个流程即:获取历史行情20 日的收盘价数据———计算 5、20 日均线———判断 


5、20 日均线,进行买卖交易。 






   A.获取历史行情20 日的收盘价数据: 


    1.找到函数历史数据函数:history 


    2.填写函数参数,获取到数据: 


     i.交易标的,即:获取那个股票的数据。 


     ii.数据字段:['close']收盘价,即:获取哪个数据。 


     iii.输入历史长度,即:获取多长时间的数据。 


     iv.获取数据的时间步长,即:获取日线级步长数据。 


          v.填写是否跳过停牌数据,复权选项,返回数据格式。 


     最终结果即为:history(account.security, ['close'], 20, '1d', False, 'pre', is_panel=1) 


    3.将获取到的数据储存,便于计算,即:close = history(account.security, ['close'], 20,  


'1d', False, 'pre', is_panel=1) 






#获取证券过去 20  日的收盘价数据             


close = history(account.security, ['close'], 20, '1d', False, 'pre', is_panel=1) 






   B.计算 5、20 日均线: 


    1.获取数据值,即:close.values,values 可以直接获取储存中的数据值,格式为 


close.values 。温馨提示:close 是我们刚才获取的数据,但是数据有股票、时间、数值,我们 


直接用values 获取值用于计算即可。 




----------------------- Page 22-----------------------


    2.选取数据长度,即:close.values[-5:] 。[]用于取值,我们之前获取20 个数据,但5 


日均线只需要过去 5 日的收盘价,因此[-5:]即为获取倒数第五个到最后一个数据。温馨提 


示: 


     i.[:]是获取所有数据。 


     ii.[:x]是从第一个获取到第 x 个,不包括第 x 个。 


     iii.[x:y]是从第x 个到第 y 个,包括x ,但不包括y 。 


     iv.[-x:]获取倒数第x 个到最后一个数据。 


    3.计算均值,即close.values[-5:].mean(),赋值给MA5 。同理 


MA20=close.values.mean() ,即对所有值取平均,相当于MA20=close.values[:].mean() 。 






#计算五 日均线价格         


MA5 = close.values[-5:].mean()             


#计算二十 日均线价格             


MA20 = close.values.mean() 






   C.判断 5、20 日均线,进行买卖交易: 


    1.if 判断条件,即为 if MA5 > MA20: 。温馨提示if 判断函数的格式为 if +添加判断 


+:,其中if 后面必须带一个空格键,其次末尾必须带冒号。  


    2.当MA5 小于 MA20 时,我们再对持仓市值判断,如果有持仓,那么持仓市值必 


然大于 0,需要进行卖出交易,我们直接通过 account 账户对象来获取持仓市值,即 


为:account.positions_value。 


    3.下单买入交易: 


     i.当触发MA5 大于MA20 时,我们需要买入股票,这时候我们可以使用 


order_value 下单函数,该函数以金额下单。 


     ii.输入下单函数的参数,order_value 函数需要输入两个参数: 


      1.下单的股票,即为 account.security,我们之前将交易标的传入进去,可以直 


接用。 


      2.下单的金额,即account.cash,这里的account 是账户对象,我们从账户中获 


取可用资金,即为 account.cash 。 


     iii.触发条件后程序提醒,当代码执行完下单函数后,我们用log.info()来打印日 


志,这样我们也可以看到程序下单了。 


      温馨提示:log.info() 内你可以直接输入中文,例如:log.info('条件满足!买入贵 


州茅台啦!') 






    if MA5 > MA20:             


        #使用所有现金买入证券             


        order_value(account.security,account.cash)     


        #记录这次买入             


        log.info("买入 %s" % (account.security)) 






    4.下单卖出交易: 


     i.当触发MA5 小于MA20 时,我们需要卖出股票,这时候我们可以使用 


order_target 下单函数,该函数以目标股数下单。 


     ii.输入下单函数的参数,order_target 函数需要输入两个参数: 


      1.下单的股票,即为 account.security,我们之前将交易标的传入进去,可以直 


接用。 


      2.下单的目标股数,即0,因为我们需要将持仓股票卖出,卖到0 股为止。 




----------------------- Page 23-----------------------


     iii.触发条件后程序提醒,当代码执行完下单函数后,我们同log.info()来打印日 


志,这样我们也可以看到程序下单了。 


    #如果五日均线小于二十日均线,并且目前有头寸             


    if MA5 < MA20 and account.positions_value > 0:             


        #卖出所有证券             


        order_target(account.security,0)             


        #记录这次卖出             


        log.info("卖出 %s" % (account.security)) 


   


最终结果: 






# 双均线策略 


# 策略逻辑:当五日均线与二十日均线金叉时买入,当五日均线与二十日均线死叉时卖出。 


#初始化账户             


def initialize(account):             


    #设置要交易的证券(600519.SH 贵州茅台)             


    account.security = '600519.SH'             


#设置买卖条件,每个交易频率 (日/分钟/tick )调用一次             


def handle_data(account,data):             


    #获取证券过去 20  日的收盘价数据             


    close = history(account.security, ['close'], 20, '1d', False, 'pre', is_panel=1)            


    #计算五 日均线价格         


    MA5 = close.values[-5:].mean()             


    #计算二十 日均线价格             


    MA20 = close.values.mean()             


    #如果五日均线大于二十日均线             


    if MA5 > MA20:             


        #使用所有现金买入证券             


        order_value(account.security,account.cash)             


        #记录这次买入             


        log.info("买入 %s" % (account.security))             


    #如果五日均线小于二十日均线,并且目前有头寸             


    if MA5 < MA20 and account.positions_value > 0:             


        #卖出所有证券             


        order_target(account.security,0)             


        #记录这次卖出             


        log.info("卖出 %s" % (account.security)) 




----------------------- Page 24-----------------------


第五步 回测量化交易策略 






  通过以上 4 步,我们已经完成了量化交易策略编写,那么接下来我们需要进行量化交易 


策略回测。 






  A.首先,我们尝试去跑通整个历史行情,排查代码错误。 


   i.右上角设置回测历史长度,设置资金,设置交易频率。 






   ii.点击左上角 “编译运行”按钮,右边出现量化交易策略在历史行情中的表现情况 






  B. 当量化交易策略能跑通整个历史行情后,我们可以确定该代码正确无误,随后点击右 


上角蓝色按钮 “进行回测”。页面跳转至回测页面,在回测详情界面,您可以查看策略收益 


曲线,风险指标,每日持仓,交易明细,输出日志等信息,如下: 




----------------------- Page 25-----------------------


3.学会将量化交易策略绑定实盘模拟交易,并实时收到交易策略的买卖信号 






1.在回测显示结果页面,右上角点击蓝色按钮开启仿真交易.如下图: 






2.在账户类型一栏,有股票型、期货型、混合型三种交易账户,选择股票型账户如下图: 






3.为账户选择相应的资金配置,一旦确定就无法更改,如下图: 






   






4.至此,我们成功开启了模拟交易。点击模拟交易账户下绑定的策略,开启交易信号实时推 


送,即可将策略的买卖信号发送至同花顺手机 APP 上。如下图: 




----------------------- Page 26-----------------------


5.您可以为您模拟交易账户重命名、删除账户、暂停策略运行、发布策略至社区、重启策 


略、查看策略运行 日志、查看策略代码。注意:重启按钮只会在策略运行错误后显示,如果 


策略运行正常,显示暂停按钮。如下图: 




----------------------- Page 27-----------------------


6.您可以查看您的模拟交易账户详细情况:交易明细、持仓、盈亏情况、账户风险指标等等。 






  


 7.当您的模拟交易策略运行出错时,您可以在模拟交易账户的状态栏看到 “错误”提示, 


如下图: 






   




----------------------- Page 28-----------------------


8.策略运行出错还可能跟系统有关,如果你没发现代码层面的错误,直接点击重启按钮,策 


略就会继续运行啦。 




----------------------- Page 29-----------------------

猜你喜欢

转载自blog.csdn.net/wuyusheng314/article/details/80279258