zhulong1111 2025-03-28 10:33 采纳率: 0%
浏览 16

关于#c##的问题:QuantConnect.Lean 量化策略框架 改api 不能多次调用Engine.Run

QuantConnect.Lean 量化策略框架 改api 不能多次调用Engine.Run

请教下,那位使用过此框架的,改api 多次调用Engine.Run 运行回测策略,只能第一次输出结果,第二次会出现异常

20250328 02:23:57.716 ERROR:: Engine.Run(): System.InvalidOperationException: The collection has been marked as complete with regards to additions.

 // 动态配置BacktestNodePacket
 var backtest = new BacktestNodePacket
 {
     BacktestId = Guid.NewGuid().ToString(),
     Language = Language.CSharp,
     ProjectId = 1,
     SessionId = "1",
     Type = PacketType.AlgorithmNode,
     ProjectName = "AccordVectorMachinesAlgorithm",
     HostName = "localhost",
     CashAmount = new CashAmount(100000, Currencies.USD),
     ServerType = QuantConnect.ServerType.Server2048,
     CompileId = Guid.NewGuid().ToString(),
     Algorithm =System.IO.File.ReadAllBytes("F:\\code\\Lean-master(new)\\Lean-master\\Chinahoo.BasicTemplateFrameworkAlgorithm\\bin\\Debug\\net9.0\\Chinahoo.BasicTemplateFrameworkAlgorithm.dll")
 };
 
 // 初始化系统和算法处理程序
 var leanEngineSystemHandlers = LeanEngineSystemHandlers.FromConfiguration(Composer.Instance);
 var leanEngineAlgorithmHandlers = LeanEngineAlgorithmHandlers.FromConfiguration(Composer.Instance, false);
 
 try
 {
     // 创建AlgorithmManager
     var algorithmManager = new AlgorithmManager(QuantConnect.Globals.LiveMode, backtest);
 
     // 初始化LeanManager
     leanEngineSystemHandlers.LeanManager.Initialize(leanEngineSystemHandlers, leanEngineAlgorithmHandlers, backtest, algorithmManager);
 
 
   
     // 创建并运行引擎
     var engine = new Engine(leanEngineSystemHandlers, leanEngineAlgorithmHandlers, QuantConnect.Globals.LiveMode);
     engine.Run(backtest, algorithmManager, "F:\\code\\Lean-master(new)\\Lean-master\\Chinahoo.BasicTemplateFrameworkAlgorithm\\bin\\Debug\\net9.0\\Chinahoo.BasicTemplateFrameworkAlgorithm.dll", WorkerThread.Instance);
 
   
 
       // 获取统计结果
       var statisticsResults = leanEngineAlgorithmHandlers.Results.StatisticsResults;
     var statistics = statisticsResults.Target;
 
     // 获取回测图表
     var charts = leanEngineAlgorithmHandlers.Results;
     var chartImage = "";// GenerateChartImage(charts);
 
     // 返回测试数据和测试图片
     return Json(new { Statistics = statistics, ChartImage = chartImage });
 }
 finally
 {
     // 清理资源
     leanEngineSystemHandlers.Dispose();
     leanEngineAlgorithmHandlers.Dispose();
     
    
 }

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2025-03-28 10:33
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题解答

    你遇到的问题是 QuantConnect.Lean 量化策略框架中,Engine.Run 方法只能被调用一次,如果多次调用,第二次及以后的调用将不能输出结果。

    这是因为 QuantConnect.Lean 使用了一个单例模式来管理策略的运行环境, Engine.Run 方法将策略的状态保存在这个单例中。每次调用 Engine.Run 方法时,QuantConnect.Lean 都会检查当前的策略状态,如果已经运行过了,就不会再次运行。

    如果你需要多次调用 Engine.Run 方法,可以考虑使用 QuantConnect.Lean 提供的其他方法,例如 Engine.RunOnceEngine.RunAsync,这些方法可以让你控制策略的运行次数。

    例如,你可以使用 Engine.RunOnce 方法来运行策略:

    for (int i = 0; i < 5; i++)
    {
        Engine.RunOnce();
    }
    

    这将运行策略 5 次,每次运行后,策略的状态将被保存在单例中。

    如果你需要在多个线程中运行策略,可以使用 Engine.RunAsync 方法:

    for (int i = 0; i < 5; i++)
    {
        Engine.RunAsync();
    }
    

    这将在 5 个线程中运行策略,每个线程将运行一次策略。

    总之,QuantConnect.Lean 提供了多种方法来控制策略的运行次数,你可以根据你的需求选择合适的方法。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月28日