将计算出来的趋势线绘制到图表上时遇到的问题

目标:

公式运行到某一个Bar时根据这个Bar之前的历史图形挑选的两个点(x1,y1),(x2, y2) 根据公式y=ax+b 计算出 a,b两个数值,然后从这个Bar之后根据公式计算出y值,然后将这个y值计算出来并画在图表上,当公式运行到之后某一个K线,价格突破趋势线后,清空a,b参数,停止计算,也停止画线,直到下一次条件满足重新计算出a,b

问题:

用PlotNumeric画图时如果没有值也会将有值的点连接起来,但不需要。下图给出了一个例子,从出现绿色笑脸之后的第一根Bar开始画,遇到红色脸就停止,直到遇到下一个绿色脸才继续; 如果遇到红色脸之前遇到另一个绿色脸,则改变斜率继续。图中只有红色框里的部分是需要的,连接红框的线不需要。

请问这种线段要如何画出?

【文档中错误】 Uplot样例代码中少了一个参数
获取趋势线的最新价格
提取手工画的趋势线价格
套利合约对差价的K线如何绘制
如何写趋势线
关于一个新手刚刚准备入门学习编程时遇到的问题
如何绘制y轴上两个值之间的柱形或色块?
关于日线有夜盘的期货品种,止损时遇到的问题,求教解决
程序编写遇到的问题
在同根K线开仓+平仓,遇到问题

“line-break”-填充打断就可以了

亲测有效😀,谢谢老师指点👍👍


样本代码供有相同问题的伙伴参考

文档看这里:  https://tbq3.tbquant.net/helper?product_id=991&keyword=3794&content_id=2658&type=article#4.8-%E2%80%9Cline-break%E2%80%9D-%E7%94%BB%E7%BA%BF%E6%AE%B5

Vars
	Plot  plt1;
    Global Array<Integer> barsToSkip([3,4,5,6]);
    
Events
	OnBar(ArrayRef<Integer> indexs)
	{
        if(ArrayFind(barsToSkip, currentBar % 12)) { 
            Print(Text(CurrentBar));
            plt1.setOption("MA1","line-break",true);
        }
        plt1.line("MA1",Close);
	}


请老师回复前先试下编译能否通过,代码里有明显的语法错误,DeepSeek, Kimi,ChatGPT, 豆包, Perplexity, Github Copilot这些辅助的AI我都有,我也可以自己问,自己测试,如果只是随意转贴的画,就不麻烦老师做AI的搬运工了

用DeepSeek AI 回答的。我只是转抄。老师看这个回答如何。


--------------------------------------------------------------------------------------

要实现你描述的功能,可以在开拓者量化软件中使用以下方法:



1. 计算趋势线的斜率和截距

在满足条件时,根据历史图形中的两个点 (x1, y1) 和 (x2, y2) 计算趋势线的斜率 a 和截距 b。

计算公式:

  • 斜率:a = (y2 - y1) / (x2 - x1)
  • 截距:b = y1 - a * x1


2. 绘制趋势线

使用 PlotNumeric 绘制趋势线,并在价格突破趋势线时停止绘制。



3. 处理断点

在遇到红色脸(停止条件)时,清空 a 和 b,并停止绘制趋势线。直到下一次满足条件时重新计算并绘制。



4. 示例代码

以下是一个示例代码,实现你描述的功能:

pascal

复制

Vars:
    Numeric a(0); // 斜率
    Numeric b(0); // 截距
    Bool isDrawing(False); // 是否正在绘制趋势线
    Numeric startBar(0); // 开始绘制的Bar索引
    NumericArray xValues[100](0); // 存储x值
    NumericArray yValues[100](0); // 存储y值
    Numeric count(0); // 记录点数

Begin
    // 满足条件时计算斜率和截距
    If (ConditionForGreenFace) Then
    Begin
        // 获取两个点的坐标
        Numeric x1 = BarIndex - 10; // 假设第一个点是10根Bar之前
        Numeric y1 = Close[x1];
        Numeric x2 = BarIndex - 5; // 假设第二个点是5根Bar之前
        Numeric y2 = Close[x2];

        // 计算斜率和截距
        a = (y2 - y1) / (x2 - x1);
        b = y1 - a * x1;

        // 标记开始绘制
        isDrawing = True;
        startBar = BarIndex;
        count = 0; // 重置点数
    End;

    // 绘制趋势线
    If (isDrawing) Then
    Begin
        // 计算当前Bar的y值
        Numeric y = a * BarIndex + b;

        // 记录x和y值
        xValues[count] = BarIndex;
        yValues[count] = y;
        count = count + 1;

        // 绘制趋势线
        PlotNumeric("TrendLine", y, Default, Default, Default, True);

        // 检查是否突破趋势线
        If (Close > y And ConditionForRedFace) Then
        Begin
            // 清空斜率和截距
            a = 0;
            b = 0;
            isDrawing = False;

            // 停止绘制
            DeletePlot("TrendLine");
        End;
    End;

    // 处理断点
    If (Not isDrawing) Then
    Begin
        // 清空x和y值
        For Numeric i = 0 To count - 1
        Begin
            xValues[i] = 0;
            yValues[i] = 0;
        End;
        count = 0;
    End;
End


5. 代码说明

  1. ConditionForGreenFace:满足绿色笑脸的条件。
  2. ConditionForRedFace:满足红色笑脸的条件。
  3. PlotNumeric:绘制趋势线。
  4. DeletePlot:停止绘制趋势线。
  5. xValues 和 yValues:存储趋势线的点,用于处理断点。


6. 注意事项

  • 数据长度:确保 x1 和 x2 的索引在有效范围内。
  • 突破条件:根据实际需求调整价格突破趋势线的条件。
  • 性能优化:如果数据量较大,可以优化数组的存储和清理逻辑。


通过以上方法,你可以实现根据历史图形计算趋势线,并在满足条件时绘制趋势线,同时在价格突破趋势线时停止绘制。如果仍有疑问,欢迎继续交流!

老师好,使用AI辅助用TB开发是个好主意,之前我只用过GitHub CoPilot辅助开发,没想到现在AI也能直接辅助TB的编程语言了。

具体到我的问题,似乎代码没有贴全,比如

4. DeletePlot:停止绘制趋势线。

这个函数哪里来的呢?能否把代码贴全给我看看?