You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

cTrader自定义指标绘制多条趋势线异常:新线覆盖旧线求助

问题原因

你每次调用Chart.DrawTrendLine时都用了固定的标识符"line",cTrader中同名的绘图对象会被新创建的对象覆盖,所以旧的趋势线会消失。另外原代码里的绘制触发逻辑也有问题,无法准确实现每20根K线绘制一次的需求。

修正方案
  1. 给每条趋势线生成唯一的标识符,比如用"line_" + index来区分不同的线
  2. 调整绘制触发条件,确保每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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:54:52