用Stop函数停止一个策略单元后无法触发公式的OnExit

Stop函数的帮助文档地址: https://tbq3.tbquant.net/helper?product_id=991&keyword=1122&content_id=1094&type=article#stop-%E5%81%9C%E6%AD%A2%E4%BA%A4%E6%98%93%E5%8D%95%E5%85%83 试了一下Stop帮助文档中的代码如下:Events OnInit() { Print("OnInit"); } OnReady() { Print("OnReady"); } OnBar(ArrayRef<Integer> indexs) { Print("OnBar,CurrentBar:" + Text(CurrentBar)); if(CurrentBar == 10) { Print("Stop Begin"); Stop(); Print("Stop End"); } } OnExit() { Print(" ------ OnExit"); }在一个图表上加载了100根K线,第一次运行结果如下:然后点击了刷新按钮,公式会先输出OnExit,然后继续运行请问这是怎么回事,如何解决?

在开拓者量化软件(TradeBlazer)中,使用 Stop 函数停止一个策略单元后,确实不会触发 OnExit 事件。这是因为 Stop 函数是强制停止策略单元的运行,而 OnExit 事件通常是在策略正常结束时触发的。如果你希望在停止策略单元时执行一些清理操作或记录日志,可以通过以下方法实现:1. 手动调用清理函数在调用 Stop 函数之前,手动执行清理操作。示例代码:pascal复制// 自定义清理函数 Function CleanUp() Begin // 执行清理操作,例如记录日志、保存数据等 FileAppend("C:\\Logs\\strategy_log.txt", "策略单元已停止,时间: " + Text(DateTime) + "\n"); End; // 停止策略单元 If (ConditionToStop) Then Begin CleanUp(); // 手动调用清理函数 Stop; // 停止策略单元 End;2. 使用全局变量标记停止状态通过全局变量标记策略单元的停止状态,并在 OnBar 或其他事件中检查该状态,执行清理操作。示例代码:pascal复制Vars: Bool isStopped(False); // 标记策略单元是否已停止 // 自定义清理函数 Function CleanUp() Begin // 执行清理操作 FileAppend("C:\\Logs\\strategy_log.txt", "策略单元已停止,时间: " + Text(DateTime) + "\n"); End; // OnBar事件 OnBar(ArrayRef<Integer> indexs) Begin // 检查是否需要停止 If (ConditionToStop And Not isStopped) Then Begin CleanUp(); // 执行清理操作 isStopped = True; // 标记为已停止 Stop; // 停止策略单元 End; // 正常策略逻辑 If (Not isStopped) Then Begin // 策略逻辑代码 End; End;3.使用OnExit 事件如果希望保留 OnExit 事件的功能,可以避免使用 Stop 函数,而是通过设置标志位让策略自然结束。示例代码:pascal复制Vars: Bool isStopped(False); // 标记策略单元是否已停止 // OnBar事件 OnBar(ArrayRef<Integer> indexs) Begin // 检查是否需要停止 If (ConditionToStop And Not isStopped) Then Begin isStopped = True; // 标记为已停止 End; // 正常策略逻辑 If (Not isStopped) Then Begin // 策略逻辑代码 End; End; // OnExit事件 OnExit() Begin // 执行清理操作 FileAppend("C:\\Logs\\strategy_log.txt", "策略单元已停止,时间: " + Text(DateTime) + "\n"); End;4. 注意事项Stop 函数的作用:Stop 是强制停止策略单元,不会触发 OnExit 事件。清理操作的时机:在调用 Stop 之前,确保所有必要的清理操作已经完成。日志记录:建议将停止策略单元的时间和原因记录到日志中,便于后续分析。总结如果你希望在停止策略单元时执行清理操作,可以通过手动调用清理函数或使用全局变量标记停止状态来实现。如果必须使用 OnExit 事件,可以避免使用 Stop 函数,而是通过设置标志位让策略自然结束。根据你的需求选择合适的方法即可。

回复:回答的驴头不对马嘴

已注意到这个问题。已提交研发同事测试。可能需要节后才能答复了。祝新年快乐

回复:没关系,这个不着急,祝新年快乐