ricequant / rqalpha

A extendable, replaceable Python algorithmic backtest && trading framework supporting multiple securities
http://rqalpha.io
Other
5.41k stars 1.62k forks source link

发现一枚bug #857

Closed chechi closed 7 months ago

chechi commented 8 months ago

提 ISSUE 须知

请先阅读文档 rqalpha文档

如果仍有问题的话请在 issue列表 中寻找是否有相关问题的解决方案

如果没有的话 麻烦开一个issue 描述以下问题:

1. RQAlpha的版本 5.0

2. Python的版本 3.10

3. 是Windows/Linux/MacOS or others? mac

4. 您出现问题对应的源码/或者能复现问题的简易代码 以及对应的配置

5. 您出现的错误堆栈日志信息

trad.py 有这样一段代码 for value in (price, amount, commission, tax, frozenprice): if value != value: raise RuntimeError(( "price, amount, commission, tax and frozen_price of trade {trade_id} is not supposed to be nan, " "current_value is {price}, {amount}, {commission}, {tax}, {frozen_price}" ).format( trade_id=trade_id, price=price, amount=amount, commission=commission, tax=tax, frozen_price=frozen_price ))

if value != value: 这个判断是什么意思?提个建议,基于事件的整体架构不错,订单提交和撮合的逻辑有重复逻辑,多处地方重复查找h5文件,逻辑有点不清晰,没有zipline的简单清晰

Cuizi7 commented 8 months ago

value != value 是判断 nan, 重复查找 h5 文件请问具体是哪里,谢谢。

chechi commented 8 months ago

environment.py 142 行 def get_instrument(self, order_book_id): return self.data_proxy.instrument(order_book_id) 这个函数调用了14次,建议通过参数或者是集中在业务上下文的对赋值一次。 资金充足的验证和交易费用的计算或许应该集中在一起一次性计算 订单的提交拆分了多次,可以在一个事件中集中处理,zipline的处理方式很简洁. 交易风控和一些验证也比较分散,没有集中处理,代码有很多人编写,有冗余的地方,响应on_bar事件的业务有一些混乱

Cuizi7 commented 7 months ago
  1. get_instrument 这个被多次调用似乎没有什么问题?这些调用并不是在同一个业务逻辑中。
  2. 资金充足的验证是在 CashValidator 中做的,会在下单时通过 env.can_submit_order 调用,交易费用的计算通过 env.get_trade_commission 调用,通常在 trading 对象实例化之后调用,似乎也不存在重复调用的情况。
  3. 订单通过 env.submit_order 提交,不太理解拆分多次是指的哪里
  4. 交易风控的代码在 mod_sys_risk 和 mod_sys_accounts 中,根据业务逻辑的需要也可能出现在其他 mod 中,但这些风控逻辑是被集中调用的,似乎也没发现冗余的情况。
Cuizi7 commented 7 months ago

如果我有遗漏或者误解麻烦给出代码位置及更具体的描述,亦欢迎提交pr。