跳转至

容错

容错一词指的是自动化系统在遇到故障时继续运行的能力。 对于 cTrader 算法来说,容错意味着托管 cBots、插件和指标的进程即使在面对错误时也能继续运行。

本文解释了容错的工作原理,并描述了这一功能为算法交易者提供的主要优势。

一分钟了解容错!

  • 根据容错规则,当面对异常时,算法将继续运行。 这一功能使 cTrader 算法更加稳定,并为改进代码执行方式提供了机会。
  • 算法现在可以自动在操作日志中输出它们遇到的异常,提供有价值的信息,您可以用这些信息来改进您的代码。
  • 您可以使用 OnException(Exception exception) 方法来自定义算法对异常的反应。 使用这个事件处理程序来创建可靠和有效的扩展。

容错规则

简而言之,容错确保所有算法遵循以下详细规则:

  • 当遇到异常时,算法必须继续运行。
  • 算法运行时发生的每个异常都必须被记录。
  • 用户必须有机会引入自定义规则,决定算法如何处理各种异常。

容错允许算法基本上忽略所有不会导致其进程崩溃的错误。 虽然异常可能仍然会阻止代码执行,但容错大大减少了算法可能意外崩溃的次数。

OnException()` 方法

根据容错规则,算法必须忽略异常。 然而,您也可以自定义算法对某些异常的反应,或完全重写默认的容错行为。

为此,请使用 OnException() 方法。 它作为任何未处理异常的专用处理程序。 其默认签名如下:

1
2
3
4
protected virtual void OnException(Exception exception)
{
    /// Introduce your custom exception handling logic here.
}

考虑以下示例,其中使用 OnException() 方法来改变 cBot 对 NullReferenceException 异常的反应。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class SampleExceptionBot : Robot
    {
        private const string label = "Sample Exception Bot";
        protected override void OnStart()
        {
                var shortPosition = Positions.Find(label, SymbolName, TradeType.Sell);
                ClosePosition(shortPosition);
        }

        protected override void OnException(Exception exception)
        {
            if (exception is NullReferenceException)
            {
                MessageBox.Show("The position does not exist", "Error!");
            }
        }
    }
}

为了抛出 NullReferenceException 异常,我们让 cBot 关闭一个可能不存在的空头仓位。 当遇到指定的异常时,我们的 cBot 应显示一个 MessageBox,显示解释性文本,这样我们就可以快速对这个异常做出反应并调整 cBot 的行为。

请注意,OnException() 处理程序不应处理在调用此方法时发生的异常。 尽管如此,这些异常仍会记录在事件日志中。

容错的好处

容错是 cTrader 算法交易工作方式的一个关键方面,它提供以下好处。

  • 容错极大地提高了算法的可靠性,并为改进自动化交易方法提供了新的机会。
  • 由于算法可以在事件日志中显示它们遇到的异常,您可以轻松确定算法遇到特定错误的条件。
  • 通过允许处理异常事件,OnException() 方法可用于完善算法的行为并提高其可靠性。

处理崩溃

如前所述,几种错误可能会导致整个进程崩溃。 它们如下:

  • OutOfMemoryException 异常。
  • StackOverflowException 异常。
  • 在单独线程中发生的任何未处理异常。
  • 任何其他可能威胁到算法运行进程崩溃的错误。

当面对上述任何错误时,指标实例将被停止;它不会自动重启。 但是,异常仍会记录在日志中。

相比之下,当托管 cBot 实例的进程崩溃时,它将自动重启(异常会记录在日志中)。

单个进程中的多个实例

在某些情况下,单个进程可能托管多个 cBot 实例。 如果其中一个实例遇到导致崩溃的异常,整个进程也会崩溃。 重启时,该进程将重启它原本托管的所有 cBot 实例。

总结

容错为使算法更加稳定和有效提供了几个宝贵的机会。 OnException() 处理程序为控制算法对异常的反应提供了额外的控制层。