跳转至

如何在 cBot 中使用指标

在本文及其对应的视频中,我们解释了如何在您的 cBot 中使用内置指标。 在 cBot 中使用指标通常用于多种目的,最显著的是使 cBot 根据指标输出做出交易决策。 为了演示这一点,我们将基于相对强弱指数 (RSI) 开发一个简单的 自动交易策略

创建一个新的 cBot

要创建一个新的 cBot,请切换到 Algo 选项卡并点击 新建 cBot

我们将我们的 cBot 重命名为“RSI cBot”。 以下是我们的自动交易策略的运作方式。

  • 当 RSI 指标低于预定义阈值时,机器人将进入买入头寸。
  • 当 RSI 指标高于预定义阈值时,机器人将进入卖出头寸。

定义并初始化指标

我们需要做的第一件事是在 cBot 类中定义 RSI 指标。 为此,我们声明一个新字段。

1
private RelativeStrengthIndicator rsi;

使用私有类成员

我们可以安全地将 rsi 字段设为私有,因为它只会在我们的 cBot 中使用。

所有 cTrader 指标在使用之前都需要进行初始化。 最好在 OnStart() 方法的主体中进行初始化,以便 cBot 在开始运行后可以访问指标输出。 cTrader 提供了一个方便的类,允许您使用现成的构造函数轻松初始化内置指标。 在我们了解如何操作之前,我们将添加初始化 RSI 指标所需的两个参数。

1
2
3
4
5
[Parameter("Source", Group = "RSI")]
public DataSeries Source { get; set; }

[Parameter("Periods", Group = "RSI", DefaultValue = 14)]
public int Periods { get; set; }

现在我们已经添加了参数,我们准备好初始化指标了。

1
2
3
4
protected override void OnStart()
{
    rsi = Indicators.RelativeStrengthIndex(Source, Periods);
}

实现交易逻辑

由于我们已经初始化了指标,我们可以调用它并在我们的交易逻辑中使用它。 对于 RSI 指标,我们可以使用 Results 集合读取输出。

为此,我们将使用 OnBar() 方法并实现以下条件。

  • 如果当前 RSI 值低于 RSI 买入阈值,则进入新的买入头寸。
  • 如果当前 RSI 值高于 RSI 卖出阈值,则进入新的卖出头寸。

因为我们依赖预定义的阈值来执行我们的交易逻辑,所以我们将在 cBot 中添加两个参数。

1
2
3
4
5
[Parameter("Buy Level", Group = "RSI", DefaultValue = 30)]
public int BuyLevel { get; set; }

[Parameter("Sell Level", Group = "RSI", DefaultValue = 70)]
public int SellLevel { get; set; }

接下来,我们将在 cBot 代码中实现我们的条件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override void OnBarClosed()
{
    if (rsi.Result.LastValue < BuyLevel)
    {
    // Enter buy position
    }
    else if (rsi.Result.LastValue > SellLevel)
    {
    // Enter sell position
    }
}

现在是时候实现执行交易订单的辅助方法了。 这样做是为了在代码中创建额外的抽象层,提高可读性和可重用性。

我们首先添加一个 cBot 参数,允许您设置交易量。

1
2
[Parameter("Quantity (Lots)", Group = "Volume", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Quantity { get; set; }

之后,我们将添加 Open()Close() 方法,用于进入新头寸和关闭 cBot 在给定方向打开的所有头寸。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
private void Open(TradeType tradeType)
{
    var position = Positions.Find("SampleRSI", SymbolName, tradeType);
    var volumeInUnits = Symbol.QuantityToVolumeInUnits(Quantity);

    if (position == null)
        ExecuteMarketOrder(tradeType, SymbolName, volumeInUnits, "RSI cBot");
}

private void Close(TradeType tradeType)
{
    foreach (var position in Positions.FindAll("SampleRSI", SymbolName, tradeType))
        ClosePosition(position);
}

我们可以使用我们的辅助方法来完成自动交易策略。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
protected override void OnTick()
{
    if (rsi.Result.LastValue < BuyLevel)
    {
        Close(TradeType.Sell);
        Open(TradeType.Buy);
    }
    else if (rsi.Result.LastValue > SellLevel)
    {
        Close(TradeType.Buy);
        Open(TradeType.Sell);
    }
}

回测 cBot

在我们完成 cBot 编码后,我们可以构建它并切换到 回测 选项卡,查看它在历史数据上的 表现

我们还可以将 RSI 指标附加到当前图表上,查看 cBot 执行的交易是否与预期的入场点匹配。

Image title