创建了一个使用 CRTIndicator 来设置止损和止盈水平的 cBot。
这个想法是使用前一个蜡烛(由 CandleIndex 指定)的 CRT 水平(高、中、低)来为新交易设置止损和止盈。
步骤:
- 我们将创建一个 cBot,根据某些条件(我们将定义为测试参数)打开交易(买入或卖出)。
- 我们将使用 CRTIndicator 获取前一个蜡烛的水平(蜡烛索引由用户设置)。
- 对于买入交易,我们将在参考蜡烛的 CRT 低点设置止损,在 CRT 高点设置止盈。
- 对于卖出交易,我们将在参考蜡烛的 CRT 高点设置止损,在 CRT 低点设置止盈。
但是,请注意我们拥有的 CRTIndicator 仅计算每根蜡烛的水平并绘制它们。
我们需要从 cBot 访问该指标,并获取我们感兴趣的特定蜡烛的值。
让我们设计这个 cBot:
参数:
- CandleIndex:使用哪根之前的蜡烛(0 = 当前,1 = 前一个,依此类推)
- TradeType:我们可以设置一个参数来选择买入或卖出以进行测试,或者使用信号(如移动平均交叉)来决定。
为简单起见,我们设置一个参数来选择交易类型。
但请注意:在实盘交易中,我们会使用一些条件来入场。我们将制作一个简单的 cBot,如果当前没有持仓,则在当前蜡烛打开交易。
我们假设交易的时间框架是图表的时间框架。
cBot 中的步骤:
- 检查是否有持仓。如果没有,则考虑开仓。
- 获取指定 CandleIndex 的 CRTIndicator 值(相对于当前的过去蜡烛)。
- 对于买入交易:
止损 = 参考蜡烛的 CRT 低点
止盈 = 参考蜡烛的 CRT 高点 - 对于卖出交易:
止损 = 参考蜡烛的 CRT 高点
止盈 = 参考蜡烛的 CRT 低点
但是,请注意指标是为每个索引计算的。我们为每个索引绘制相同的值(因为我们使用了固定的 CandleIndex 偏移)。
但在 cBot 中,我们想要获取指标在当前时间(最近完成的蜡烛)对应指定 CandleIndex 的水平。
重要:指标的 Calculate 方法为每个索引调用,并在当前索引存储参考蜡烛(索引 - CandleIndex)的值。
所以如果我们想获取特定历史蜡烛的 CRT 水平,我们可以简单地读取该蜡烛索引处指标的输出序列?
但请注意:指标输出与当前索引对齐。实际上,指标为每根柱绘制相同的值,因为我们设置了:
CRTHigh[index] = crtHigh; // crtHigh 是 (index - CandleIndex) 蜡烛的高点
所以如果我们在索引 100 且 CandleIndex=1,那么我们获取的是索引 99 的高点,并将其绘制在索引 100。
这意味着如果我们想要 CandleIndex 根蜡烛之前的 CRT 水平,我们可以在当前柱(索引)获取指标输出,这将给我们 CandleIndex 根蜡烛之前的水平。
但是等等,在 cBot 中,我们将运行 OnBar 或 OnTick。我们关注的是最近完成的柱(索引 = MarketSeries.Close.Count - 2),而我们想要的蜡烛是(当前索引 - CandleIndex)。
或者,我们可以更改指标,使其在与参考蜡烛相同的索引输出水平,但那样我们必须将绘图向后移动 CandleIndex。
然而,当前指标设计为从前一个柱绘制当前柱的水平。所以如果设置 CandleIndex=1,那么每根柱绘制的是前一个柱的水平。
我们如何在 cBot 中使用它:
我们将把指标添加到 cBot,然后获取最近柱的值(索引 = MarketSeries.Close.Count - 1),这将给我们 CandleIndex 根柱之前的水平。
示例:
当前柱索引 = 最后一根柱(索引 = MarketSeries.Close.Count - 1)
那么该索引处的指标输出(CRTHigh[MarketSeries.Close.Count-1])是(当前索引 - CandleIndex)柱的高点。
但请注意:指标的 Calculate 方法为每个历史柱和每个新柱调用。因此最后一根柱的输出序列将有我们想要的值。
让我们编写 cBot 代码:
我们将有以下参数:
[Parameter("Candle Index", DefaultValue = 1, MinValue = 0)]
public int CandleIndex { get; set; }
[Parameter("Trade Type", DefaultValue = TradeType.Buy)]
public TradeType SelectedTradeType { get; set; }
[Parameter("Volume (Lots)", DefaultValue = 1, MinValue = 0.01, Step = 0.01)]
public double Volume { get; set; }
我们还将创建一个 CRTIndicator 的实例。
OnBar 中的步骤:
如果没有持仓,则根据指标输出为当前柱(对应 CandleIndex 根柱之前的水平)设置止损和止盈并开仓。
但是,请注意:指标当前柱(最后一根柱)的输出设置为(当前柱索引 - CandleIndex)的水平。但当我们处于最开始时,必须确保有足够的柱。