Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

在0.3.14版本可用的代码,在2.0.6不可以用了,如何解决? #79

Closed
myz8110 opened this issue Mar 31, 2017 · 16 comments
Closed

Comments

@myz8110
Copy link

myz8110 commented Mar 31, 2017

我原先用的是0.3.14版本,,为了方便重复使用,不必每次都敲一大堆字,我修改了C:\Users\Administrator.rqalpha目录下的config.yml很多参数,cmd命令行下直接cd example,rqalpha run -f XXX.py,这样是不会报错的.但是更新到2.0.6之后,报错了.但是cd example,rqalpha run -f XXX.py -s 2014-01-01 -e 2016-01-01 -o result.pkl --plot --progress --stock-starting-cash 100000 这样又不会了.我尝试了以下几种方法都不行:1.修改C:\Anaconda3目录下的config.yml;2.把C:\Anaconda3目录下的config.yml和C:\Users\Administrator.rqalpha目录下的config.yml都删除掉.以上方法都不起效.
我想问下有什么解决方法??每次运行代码都要在后面敲一大堆参数觉得很麻烦.其中甚至有个name error:name 'logger' is not defined.
报错如下,以前报错是红字,我还会修改自己的代码,而现在报错的是白字.完全看不懂.(抱歉下面显示乱码的都是空格,我在cmd命令行里复制过来的):

C:\Anaconda3\examples>rqalpha run -f rqrun.py
Traceback (most recent call last):
  File "c:\anaconda3\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "c:\anaconda3\lib\runpy.py", line 85, in _run_code
    [35;1mexec[m(code, run_globals)
    [36m {'__name__': '__main__', '__doc__': None, '__package__':
 '', '__loader__': <zipimporter object "C:\Anaconda3\Scripts\rqalpha.exe...[m
    [36m <code object <module> at 0x000000000236E030, file "C:\Anaconda3
\Scripts\rqalpha.exe\__main__.py", line 2>[m
  File "C:\Anaconda3\Scripts\rqalpha.exe\__main__.py", line 9, in <module>
    sys.exit(entry_point())
    [36m    <function entry_point at 0x00000000023A8598>[m
    [36m <module 'sys' (built-in)>[m
  File "c:\anaconda3\lib\site-packages\rqalpha\__main__.py", line 67, in entry_p
oint
    cli(obj={})
    [36m <click.core.Group object at 0x0000000006DF8C88>[m
  File "c:\anaconda3\lib\site-packages\click\core.py", line 722, in __call__
    [33;1mreturn[m self.main(*args, **kwargs)
    [36m          {'obj': {'VERBOSE': 0}}[m
    [36m        ()[m
    [36m   <click.core.Group object at 0x0000000006DF8C88>[m
  File "c:\anaconda3\lib\site-packages\click\core.py", line 697, in main
    rv = self.invoke(ctx)
    [36m       <click.core.Context object at 0x0000000006E18278>
[m
    [36m <click.core.Group object at 0x0000000006DF8C88>[m
  File "c:\anaconda3\lib\site-packages\click\core.py", line 1066, in invoke
    [33;1mreturn[m _process_result(sub_ctx.command.invoke(sub_ctx))
    [36m                              <click.core.Context
object at 0x0000000006E18320>[m
    [36m             <click.core.Context object at 0x0000000006E1
8320>[m
    [36m   <function MultiCommand.invoke.<locals>._process_result at 0x0
000000001DF67B8>[m
  File "c:\anaconda3\lib\site-packages\click\core.py", line 895, in invoke
    [33;1mreturn[m ctx.invoke(self.callback, **ctx.params)
    [36m                   <click.core.Context object at 0
x0000000006E18320>[m
    [36m        <click.core.Command object at 0x0000000006E09D30>
[m
    [36m   <click.core.Context object at 0x0000000006E18320>[m
  File "c:\anaconda3\lib\site-packages\click\core.py", line 535, in invoke
    [33;1mreturn[m callback(*args, **kwargs)
    [36m         {'base__strategy_file': 'rqrun.py', 'base
__data_bundle_path': None, 'base__start_date': None, 'base__end_date': None, 'ba
se__sto...[m
    [36m       ()[m
    [36m   <function run at 0x0000000006E13488>[m
  File "c:\anaconda3\lib\site-packages\rqalpha\__main__.py", line 119, in run
    main.run(parse_config(kwargs, config_path))
    [36m             None[m
    [36m           {'base__strategy_file': 'rqrun.py', 'base__d
ata_bundle_path': None, 'base__start_date': None, 'base__end_date': None, 'base_
_sto...[m
    [36m    <function parse_config at 0x0000000006E0E268>[m
    [36m <module 'rqalpha.main' from 'c:\\anaconda3\\lib\\site-packages\\rqal
pha\\main.py'>[m
  File "c:\anaconda3\lib\site-packages\rqalpha\utils\config.py", line 208, in pa
rse_config
    [33;1mraise[m patch_user_exc([35;1mValueError[m(_([31m'stock starting c
ash and future starting cash can not be both 0.'[m)))
    [36m                      <function gettext at 0x0000000002F3
E378>[m
    [36m  <function patch_user_exc at 0x0000000002F27488>
@wh1100717
Copy link
Member

配置文件有比较大的改动,包括系统Mod的配置。

请参考 http://rqalpha.readthedocs.io/zh_CN/stable/api/config.html#rqalpha

或者您把你的配置信息贴出来 我帮您看一下哪里出错了也OK

@myz8110
Copy link
Author

myz8110 commented Apr 1, 2017

我今天再试了一次,C:\Users\Administrator.rqalpha目录下的config.yml和C:\Anaconda3目录下的config.yml配置相同,我仅修改了

股票起始资金,默认为0

stock_starting_cash: 100000

期货起始资金,默认为0

future_starting_cash: 100000

cmd:rqalpha run -f rsi.py -s 2014-01-01 -e 2016-01-01 -o result.pkl --plot --progress --stock-starting-cash 100000
这样是不会报错的.
cmd:rqalpha run -f rsi.py
这样就会报错.您可以试一下,用的就是example的原生代码rsi.py,没做任何修改.

而在rqalpha2.0文档中说到:
通过配置 config.yml 的方式
除了在启动策略的时候传入参数,还可以通过指定配置文件的方式来进行参数的配置, 配置文件的配置信息优先级低于启动参数,也就是说启动参数会覆盖配置文件的配置项,配置文件的格式如下:

注1: 如果没有指定 config.yml, RQAlpha 在运行时会自动在当前目录下寻找 config.yml 文件作为用户配置文件,如果没有寻找到,则按照默认配置运行。 注2: 您只需要指定需要修改的配置信息,您没有指定的部分,会按照默认配置项来运行。

优先级
RQAlpha 在启动时会读取 ~/.rqalpha/config.yml 作为用户配置文件,用于覆盖默认配置信息,您也可以通过 –config 来指定用户配置文件路径。

策略代码中配置优先级 > 启动策略命令行传参 > 用户配置文件 > 系统配置文件

我认为出错的原因可能是系统配置文件> 用户配置文件,导致用户配置文件不起作用.因为报错的代码,我发现有stock starting cash and future starting cash can not be both 0的字眼,而我已经在config.yml 指定了相关配置.

@myz8110
Copy link
Author

myz8110 commented Apr 1, 2017

你可以直接用example的原生代码buy_and_hold.py和rsi.py,在cmd里rqalpha run -f buy_and_hold.py或者rqalpha run -f rsi.py都会报错,报错代码是一样的.而在0.3.14版本中,我配置好了C:\Users\Administrator.rqalpha目录下的config.yml,我直接cmd运行rqalpha run -f xxx.py不会报错的.

@myz8110
Copy link
Author

myz8110 commented Apr 1, 2017

注:我现在的config.yml是2.0.6版本的,不是0.3.14版本的.

@wh1100717
Copy link
Member

@myz8110 http://rqalpha.readthedocs.io/zh_CN/latest/history.html#id4

image

RQAlpha不再默认选择 ~/.rqalpha/config.yml 作为用户配置文件了。这种默认的方式不太好。取而代之的是RQAlpha 会根据用户 通过 --config 指定的配置文件来读取自定义配置。或者会寻找 当前执行命令的目录下是否包含 config.yml

@wh1100717
Copy link
Member

@myz8110
Copy link
Author

myz8110 commented Apr 1, 2017

寻找 当前执行命令的目录下是否包含 config.yml,我把config.yml放到example下,确实可以了.但是报错name error:name 'logger' is not defined,把我代码中的logger.info改成print就没有报错了.logger是改了吗?

@wh1100717
Copy link
Member

@myz8110 这个很奇怪哎 logger 我这里运行没有问题呀

logger 是在 main.py 中的 create_base_scope 函数中 注入的,没理由无法使用啊... 你能帮忙调试一下 看看问题出在哪里吗?

@myz8110
Copy link
Author

myz8110 commented Apr 2, 2017

是这样,我有个testpp.py,代码如下:

#coding=utf-8
from rqalpha.api import *
#------判断类--------
class judge(object):
    min={}
        #储存指数最高点
    max={}
        #储存指数涨幅
    rate={}
    quotation={}
    net_point={}
    cash={}
#---------判断牛熊-------------  
    def cow_bear(self,context,bar_dict,index,date,x=1.5,y=1.5):
        dt=context.now
        logger.info(dt)


在另一个test.py,代码如下:
import testpp as mc

def initialize(context):
    mc.judge()
def before_trading(context):
    pass
def after_trading(context):
    pass
def handle_bar(context, bar_dict):
    index='000300.XSHG'
    date='date2'
    mc.judge().cow_bear(context,bar_dict,index,date)

然后我在cmd运行rqalpha run -f test.py时就会报错:name 'logger' is not defined

@myz8110
Copy link
Author

myz8110 commented Apr 2, 2017

而在之前的版本并没有这个问题.

@wh1100717
Copy link
Member

@myz8110 我怀疑是有别的报错 导致初始化没有完成,从而产生了logger没有初始化的问题。您看一下是否是错误日志您只看了最后的报错,但是没有看完整。

您直接执行 rqalpha run -f test.py 但是没有指定策略类型,起始资金之类的,除非你当前目录下有相应的配置文件。 你再仔细看看,或者把完整的配置信息 以及 错误堆栈贴出来,才能比较明确的找到问题。

@myz8110
Copy link
Author

myz8110 commented Apr 5, 2017

我已经把C:\Users\Administrator.rqalpha目录下的的config,C:\Anaconda3目录下的config删除掉,仅保留C:\Anaconda3\examples目录下的config.
testpp.py放在C:\Anaconda3目录下,test.py和唯一的config放在C:\Anaconda3\examples目录下,直接执行 rqalpha run -f test.py报错.
同样的条件下,运行C:\Anaconda3\examples目录下原生的rsi.py,直接执行 rqalpha run -f rsi.py,可以正常运行.rsi.py代码就有logger.info("target available cash caled: " + str(target_available_cash)).

@myz8110
Copy link
Author

myz8110 commented Apr 5, 2017

config全配置如下:

# see more config
# http://rqalpha.readthedocs.io/zh_CN/stable/api/config.html
version: 0.1.5

# 白名单,设置可以直接在策略代码中指定哪些模块的配置项目
whitelist: [base, extra, validator, mod]

base:
  # 数据源所存储的文件路径
  data_bundle_path: ~
  # 启动的策略文件路径
  strategy_file: strategy.py
  # 回测起始日期
  start_date: 2015-06-01
  # 回测结束日期(如果是实盘,则忽略该配置)
  end_date: 2050-01-01
  # 股票起始资金,默认为0
  stock_starting_cash: 100000
  # 期货起始资金,默认为0
  future_starting_cash: 100000
  # 设置策略可交易品种,目前支持 `stock` (股票策略)、`future` (期货策略)tst
  securities: [stock]
  # 设置保证金乘数,默认为1
  margin_multiplier: 1
  # 运行类型,`b` 为回测,`p` 为模拟交易, `r` 为实盘交易。
  run_type: b
  # 目前支持 `1d` (日线回测) 和 `1m` (分钟线回测),如果要进行分钟线,请注意是否拥有对应的数据源,目前开源版本是不提供对应的数据源的。
  frequency: 1d
  # Benchmark,如果不设置,默认没有基准参照。
  benchmark: ~
  # 在模拟交易和实盘交易中,RQAlpha支持策略的pause && resume,该选项表示开启 resume 功能
  resume_mode: false
  # 在模拟交易和实盘交易中,RQAlpha支持策略的pause && resume,该选项表示开启 persist 功能呢,
  # 其会在每个bar结束对进行策略的持仓、账户信息,用户的代码上线文等内容进行持久化
  persist: false
  persist_mode: real_time
  # 选择是否开启自动处理, 默认不开启
  handle_split: false

extra:
  # 选择日期的输出等级,有 `verbose` | `info` | `warning` | `error` 等选项,您可以通过设置 `verbose` 来查看最详细的日志,
  # 或者设置 `error` 只查看错误级别的日志输出
  log_level: info
  user_system_log_disabled: false
  # 通过该参数可以将预定义变量传入 `context` 内。
  context_vars: ~
  # force_run_init_when_pt_resume: 在PT的resume模式时,是否强制执行用户init。主要用于用户改代码。
  force_run_init_when_pt_resume: false
  # enable_profiler: 是否启动性能分析
  enable_profiler: false
  is_hold: false
  locale: zh_Hans_CN

validator:
  # cash_return_by_stock_delisted: 开启该项,当持仓股票退市时,按照退市价格返还现金
  cash_return_by_stock_delisted: false
  # close_amount: 在执行order_value操作时,进行实际下单数量的校验和scale,默认开启
  close_amount: true

@myz8110
Copy link
Author

myz8110 commented Apr 5, 2017

运行test.py报错如下:
Microsoft Windows [版本 6.1.7601]
版权所有 (c) 2009 Microsoft Corporation。保留所有权利。

C:\Anaconda3\examples>rqalpha run -f test.py
2015-06-01 ERROR Traceback (most recent call last):
File test.py, line 13 in handle_bar
mc.judge().cow_bear(context,bar_dict,index,date)
--> date = 'date2'
--> index = '000300.XSHG'
--> bar_dict = BarMap()
--> context = Context({})

NameError: name 'logger' is not defined
Traceback (most recent call last):
File "c:\anaconda3\lib\site-packages\rqalpha\core\strategy.py", line 84, in ha
ndle_bar
self._handle_bar(self._user_context, bar_dict)
�[36m�� �� �� BarMap()�[m
�[36m�� �� <rqalpha.core.strategy.Strategy object at 0x000000
0015881780>�[m
�[36m�� <rqalpha.core.strategy.Strategy object at 0x0000000015881780>�[m
File "test.py", line 13, in handle_bar
mc.judge().cow_bear(context,bar_dict,index,date)
�[36m�� �� �� �� �� 'date2'�[m
�[36m�� �� �� �� '000300.XSHG'�[m
�[36m�� �� �� BarMap()�[m
�[36m�� �� Context({})�[m
�[36m�� <module 'testpp' from 'c:\anaconda3\testpp.py'>�[m
File "c:\anaconda3\testpp.py", line 16, in cow_bear
logger.info(dt)
�[36m �� datetime.datetime(2015, 6, 1, 15, 0)�[m
NameError: name 'logger' is not defined

C:\Anaconda3\examples>

@myz8110
Copy link
Author

myz8110 commented Apr 5, 2017

我觉得如果是config设置有问题,那rsi.py也应该报错才对,但是并没有.

@wh1100717
Copy link
Member

wh1100717 commented Apr 6, 2017

@myz8110 原因是这样的,logger API并没有直接在 from rqalpha.api import * 中暴露。

是通过如下方式注入进去的:

def create_base_scope():
    import copy

    from . import user_module
    scope = copy.copy(user_module.__dict__)
    scope.update({
        "logger": user_log,
        "print": user_print,
    })

    return scope

之所以这么做的原因是不想覆盖用户 print 函数,我们重写了print函数,但仅限于用户的"策略代码" 中。 而如果直接通过API 暴露的话,会引起Python 2兼容性,以及一些由于上下文而产生的问题。
loggerprint 作为类似的输出函数,所以以同样的方式注入了。

也就是说,您额外写的文件通过 from rqalpha.api import * 的方式是无法直接使用logger的。

在下一个版本中,我们将 logger 通过API 暴露出去了,下一个小版本更新后您就可以使用这种方式来输出日志信息了。

如果您现在就想使用的话,也可以通过如下方式引入 logger

from rqalpha.utils.logger import user_log as logger

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants