cTrader自定义指标绘制多条趋势线异常:新线覆盖旧线求助
问题原因
你每次调用Chart.DrawTrendLine时都用了固定的标识符"line",cTrader中同名的绘图对象会被新创建的对象覆盖,所以旧的趋势线会消失。另外原代码里的绘制触发逻辑也有问题,无法准确实现每20根K线绘制一次的需求。
修正方案
- 给每条趋势线生成唯一的标识符,比如用
"line_" + index来区分不同的线 - 调整绘制触发条件,确保每20根K线(第20、40、60...根)触发一次绘制
修正后的代码
using System; using cAlgo.API; namespace cAlgo { [Indicator(AccessRights = AccessRights.None)] public class testdrawline : Indicator { [Output("Main")] public IndicatorDataSeries Result { get; set; } // 记录上次绘制趋势线的K线索引,初始值确保第一次在第20根K线触发 private int _lastDrawnIndex = -20; protected override void Initialize() { } public override void Calculate(int index) { // 跳过前5根K线,避免index-5出现负数索引报错 if (index < 5) return; // 每间隔20根K线绘制一次趋势线 if (index - _lastDrawnIndex >= 20) { // 用当前K线索引作为ID后缀,保证每条趋势线的标识唯一 var lineUniqueId = $"line_{index}"; var trendLine = Chart.DrawTrendLine(lineUniqueId, Bars[index].OpenTime, Bars[index].Close, Bars[index - 5].OpenTime, Bars[index - 5].Close, "Yellow"); trendLine.IsInteractive = true; // 更新上次绘制的索引,确保下次间隔20根才触发 _lastDrawnIndex = index; } } } }
代码说明
- 用
"line_" + index作为趋势线的唯一ID,彻底解决同名覆盖问题 - 通过
_lastDrawnIndex控制绘制间隔,确保严格每20根K线绘制一次 - 增加
index < 5的判断,避免访问Bars[index-5]时出现索引越界错误
内容的提问来源于stack exchange,提问作者Ihsan
相关产品推荐
相关产品推荐

