如何在 cBot 中使用指标 VIDEO
在本文及其对应的视频中,我们解释了如何在您的 cBot 中使用内置指标。 在 cBot 中使用指标通常用于多种目的,最显著的是使 cBot 根据指标输出做出交易决策。 为了演示这一点,我们将基于相对强弱指数 (RSI) 开发一个简单的 自动交易策略 。
创建一个新的 cBot 要创建一个新的 cBot,请切换到 Algo 选项卡并点击 新建 cBot 。
我们将我们的 cBot 重命名为“RSI cBot”。 以下是我们的自动交易策略的运作方式。
当 RSI 指标低于预定义阈值时,机器人将进入买入头寸。 当 RSI 指标高于预定义阈值时,机器人将进入卖出头寸。 定义并初始化指标 我们需要做的第一件事是在 cBot 类中定义 RSI 指标。 为此,我们声明一个新字段。
private RelativeStrengthIndicator rsi ;
使用私有类成员
我们可以安全地将 rsi 字段设为私有,因为它只会在我们的 cBot 中使用。
所有 cTrader 指标在使用之前都需要进行初始化。 最好在 OnStart () 方法的主体中进行初始化,以便 cBot 在开始运行后可以访问指标输出。 cTrader 提供了一个方便的类,允许您使用现成的构造函数轻松初始化内置指标。 在我们了解如何操作之前,我们将添加初始化 RSI 指标所需的两个参数。
[Parameter("Source", Group = "RSI")]
public DataSeries Source { get ; set ; }
[Parameter("Periods", Group = "RSI", DefaultValue = 14)]
public int Periods { get ; set ; }
现在我们已经添加了参数,我们准备好初始化指标了。
protected override void OnStart ()
{
rsi = Indicators . RelativeStrengthIndex ( Source , Periods );
}
实现交易逻辑 由于我们已经初始化了指标,我们可以调用它并在我们的交易逻辑中使用它。 对于 RSI 指标,我们可以使用 Results 集合读取输出。
为此,我们将使用 OnBar () 方法并实现以下条件。
如果当前 RSI 值低于 RSI 买入阈值,则进入新的买入头寸。 如果当前 RSI 值高于 RSI 卖出阈值,则进入新的卖出头寸。 因为我们依赖预定义的阈值来执行我们的交易逻辑,所以我们将在 cBot 中添加两个参数。
[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 代码中实现我们的条件。
protected override void OnBarClosed ()
{
if ( rsi . Result . LastValue < BuyLevel )
{
// Enter buy position
}
else if ( rsi . Result . LastValue > SellLevel )
{
// Enter sell position
}
}
现在是时候实现执行交易订单的辅助方法了。 这样做是为了在代码中创建额外的抽象层,提高可读性和可重用性。
我们首先添加一个 cBot 参数,允许您设置交易量。
[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 执行的交易是否与预期的入场点匹配。