模拟交易时在收盘后的函数里调用g报错g的对象未定义

用户头像大福hu子
2025-10-27 发布

我给全局对象加了属性lastday_returns,在回测里跑没事,跑模拟交易就报错无对象了,是g对象在模拟里不能用还是写法需要调整呢,初始化是在init方法里

3db0747316b5e5ebf5579432d342017f.png

def init(context):
    g.lastday_returns =0

def after_trading(context):
    g.lastday_returns =1

请问是初始化的定义有问题吗

评论

用户头像
2025-10-27 21:20:25

您的代码中在 after_trading 函数里直接修改了全局对象 g 的属性,但是似乎您遇到了在模拟交易时无法访问该属性的问题。这可能是因为 g 对象未被正确初始化或作用域没有按照预期工作。根据您的描述和提供的示例图片:

  1. 全局变量使用:确保全局变量只存在于策略框架中可用的范围内(即代码文件中),并且在需要的地方有适当的初始化。

  2. 初始化阶段:您提到您在 init 方法里为 g.lastday_returns 添加了一个初始值。这是正确的做法,但确认这个方法被调用并执行了才是关键。确保策略启动时会正确运行 init 函数。

  3. 作用域问题:如果您的代码片段是分隔的,且您使用的是多文件结构(例如主脚本与策略函数分开),确保所有需要共享全局变量的函数都在正确的文件中,并通过适当的方式访问全局对象。在 PyCharm 等 IDE 中运行整个项目的场景下,这通常不是问题。

  4. 模拟交易时的初始化:虽然您提到 g.lastday_returns 在回测里跑没事,但在模拟交易时出现问题。这可能是由于某些特定于模拟环境的行为或限制导致的。确保您的全局变量不会被模拟策略框架所影响或者在策略运行前没有额外设置。

解决方案

  • 检查 init() 函数:确认 init 方法确实被调用,并且没有任何异常阻止它执行。
# 确保在主函数或入口点中调用init方法,如果使用模块导入:
from mindgo_api import *
import your_strategy_file

def main():
    context = create_context()
    your_strategy_file.init(context)
    # 运行策略代码...
    
if __name__ == "__main__":
    main()
  • 全局变量是否被覆盖:如果您的策略在某些地方有逻辑或方法可以意外地修改 g,您可能需要检查这些部分是否存在覆盖 g 的行为。确保在修改 g 时,不会影响到全局变量的初始值或者引起不可预期的行为。

  • 考虑使用上下文管理器或函数局部:如果您的代码结构允许,使用局部变量可能会避免全局作用域的混淆和问题。

def handle_bar(context, bar_dict):
    local_var = 0  # 使用局部变量替代g
    
    # 进行策略计算...

确保您已经检查了所有初始化步骤和调用流。如果上述建议没有解决您的问题,那么可能需要进一步的代码审查或更具体的错误信息来确定具体原因。

如果您可以提供更详细的代码片段或者错误详细信息(例如错误类型、消息),我可能能给出更精确的指导和解决方案。

评论
用户头像
2025-10-28 01:20:25

您的代码中在 after_trading 函数里直接修改了全局对象 g 的属性,但是似乎您遇到了在模拟交易时无法访问该属性的问题。这可能是因为 g 对象未被正确初始化或作用域没有按照预期工作。根据您的描述和提供的示例图片:

  1. 全局变量使用:确保全局变量只存在于策略框架中可用的范围内(即代码文件中),并且在需要的地方有适当的初始化。

  2. 初始化阶段:您提到您在 init 方法里为 g.lastday_returns 添加了一个初始值。这是正确的做法,但确认这个方法被调用并执行了才是关键。确保策略启动时会正确运行 init 函数。

  3. 作用域问题:如果您的代码片段是分隔的,且您使用的是多文件结构(例如主脚本与策略函数分开),确保所有需要共享全局变量的函数都在正确的文件中,并通过适当的方式访问全局对象。在 PyCharm 等 IDE 中运行整个项目的场景下,这通常不是问题。

  4. 模拟交易时的初始化:虽然您提到 g.lastday_returns 在回测里跑没事,但在模拟交易时出现问题。这可能是由于某些特定于模拟环境的行为或限制导致的。确保您的全局变量不会被模拟策略框架所影响或者在策略运行前没有额外设置。

解决方案

  • 检查 init() 函数:确认 init 方法确实被调用,并且没有任何异常阻止它执行。
# 确保在主函数或入口点中调用init方法,如果使用模块导入:
from mindgo_api import *
import your_strategy_file

def main():
    context = create_context()
    your_strategy_file.init(context)
    # 运行策略代码...
    
if __name__ == "__main__":
    main()
  • 全局变量是否被覆盖:如果您的策略在某些地方有逻辑或方法可以意外地修改 g,您可能需要检查这些部分是否存在覆盖 g 的行为。确保在修改 g 时,不会影响到全局变量的初始值或者引起不可预期的行为。

  • 考虑使用上下文管理器或函数局部:如果您的代码结构允许,使用局部变量可能会避免全局作用域的混淆和问题。

def handle_bar(context, bar_dict):
    local_var = 0  # 使用局部变量替代g
    
    # 进行策略计算...

确保您已经检查了所有初始化步骤和调用流。如果上述建议没有解决您的问题,那么可能需要进一步的代码审查或更具体的错误信息来确定具体原因。

如果您可以提供更详细的代码片段或者错误详细信息(例如错误类型、消息),我可能能给出更精确的指导和解决方案。

评论
用户头像
2025-10-28 02:20:31

您的代码中在 after_trading 函数里直接修改了全局对象 g 的属性,但是似乎您遇到了在模拟交易时无法访问该属性的问题。这可能是因为 g 对象未被正确初始化或作用域没有按照预期工作。根据您的描述和提供的示例图片:

  1. 全局变量使用:确保全局变量只存在于策略框架中可用的范围内(即代码文件中),并且在需要的地方有适当的初始化。

  2. 初始化阶段:您提到您在 init 方法里为 g.lastday_returns 添加了一个初始值。这是正确的做法,但确认这个方法被调用并执行了才是关键。确保策略启动时会正确运行 init 函数。

  3. 作用域问题:如果您的代码片段是分隔的,且您使用的是多文件结构(例如主脚本与策略函数分开),确保所有需要共享全局变量的函数都在正确的文件中,并通过适当的方式访问全局对象。在 PyCharm 等 IDE 中运行整个项目的场景下,这通常不是问题。

  4. 模拟交易时的初始化:虽然您提到 g.lastday_returns 在回测里跑没事,但在模拟交易时出现问题。这可能是由于某些特定于模拟环境的行为或限制导致的。确保您的全局变量不会被模拟策略框架所影响或者在策略运行前没有额外设置。

解决方案

  • 检查 init() 函数:确认 init 方法确实被调用,并且没有任何异常阻止它执行。
# 确保在主函数或入口点中调用init方法,如果使用模块导入:
from mindgo_api import *
import your_strategy_file

def main():
    context = create_context()
    your_strategy_file.init(context)
    # 运行策略代码...
    
if __name__ == "__main__":
    main()
  • 全局变量是否被覆盖:如果您的策略在某些地方有逻辑或方法可以意外地修改 g,您可能需要检查这些部分是否存在覆盖 g 的行为。确保在修改 g 时,不会影响到全局变量的初始值或者引起不可预期的行为。

  • 考虑使用上下文管理器或函数局部:如果您的代码结构允许,使用局部变量可能会避免全局作用域的混淆和问题。

def handle_bar(context, bar_dict):
    local_var = 0  # 使用局部变量替代g
    
    # 进行策略计算...

确保您已经检查了所有初始化步骤和调用流。如果上述建议没有解决您的问题,那么可能需要进一步的代码审查或更具体的错误信息来确定具体原因。

如果您可以提供更详细的代码片段或者错误详细信息(例如错误类型、消息),我可能能给出更精确的指导和解决方案。

评论