Closed myz8110 closed 7 years ago
配置文件有比较大的改动,包括系统Mod的配置。
请参考 http://rqalpha.readthedocs.io/zh_CN/stable/api/config.html#rqalpha
或者您把你的配置信息贴出来 我帮您看一下哪里出错了也OK
我今天再试了一次,C:\Users\Administrator.rqalpha目录下的config.yml和C:\Anaconda3目录下的config.yml配置相同,我仅修改了
stock_starting_cash: 100000
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 指定了相关配置.
你可以直接用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不会报错的.
注:我现在的config.yml是2.0.6版本的,不是0.3.14版本的.
@myz8110 http://rqalpha.readthedocs.io/zh_CN/latest/history.html#id4
RQAlpha不再默认选择 ~/.rqalpha/config.yml 作为用户配置文件了。这种默认的方式不太好。取而代之的是RQAlpha 会根据用户 通过 --config
指定的配置文件来读取自定义配置。或者会寻找 当前执行命令的目录下是否包含 config.yml
寻找 当前执行命令的目录下是否包含 config.yml,我把config.yml放到example下,确实可以了.但是报错name error:name 'logger' is not defined,把我代码中的logger.info改成print就没有报错了.logger是改了吗?
@myz8110 这个很奇怪哎 logger 我这里运行没有问题呀
logger 是在 main.py
中的 create_base_scope
函数中 注入的,没理由无法使用啊... 你能帮忙调试一下 看看问题出在哪里吗?
是这样,我有个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 我怀疑是有别的报错 导致初始化没有完成,从而产生了logger没有初始化的问题。您看一下是否是错误日志您只看了最后的报错,但是没有看完整。
您直接执行 rqalpha run -f test.py
但是没有指定策略类型,起始资金之类的,除非你当前目录下有相应的配置文件。 你再仔细看看,或者把完整的配置信息 以及 错误堆栈贴出来,才能比较明确的找到问题。
我已经把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)).
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
运行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>
我觉得如果是config设置有问题,那rsi.py也应该报错才对,但是并没有.
@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兼容性,以及一些由于上下文而产生的问题。
而 logger
和 print
作为类似的输出函数,所以以同样的方式注入了。
也就是说,您额外写的文件通过 from rqalpha.api import *
的方式是无法直接使用logger的。
在下一个版本中,我们将 logger 通过API 暴露出去了,下一个小版本更新后您就可以使用这种方式来输出日志信息了。
如果您现在就想使用的话,也可以通过如下方式引入 logger
from rqalpha.utils.logger import user_log as logger
我原先用的是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命令行里复制过来的):