目标:
公式运行到某一个Bar时根据这个Bar之前的历史图形挑选的两个点(x1,y1),(x2, y2) 根据公式y=ax+b 计算出 a,b两个数值,然后从这个Bar之后根据公式计算出y值,然后将这个y值计算出来并画在图表上,当公式运行到之后某一个K线,价格突破趋势线后,清空a,b参数,停止计算,也停止画线,直到下一次条件满足重新计算出a,b
问题:
用PlotNumeric画图时如果没有值也会将有值的点连接起来,但不需要。下图给出了一个例子,从出现绿色笑脸之后的第一根Bar开始画,遇到红色脸就停止,直到遇到下一个绿色脸才继续; 如果遇到红色脸之前遇到另一个绿色脸,则改变斜率继续。图中只有红色框里的部分是需要的,连接红框的线不需要。
请问这种线段要如何画出?
亲测有效😀,谢谢老师指点👍👍
样本代码供有相同问题的伙伴参考
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 回答的。我只是转抄。老师看这个回答如何。
--------------------------------------------------------------------------------------
要实现你描述的功能,可以在开拓者量化软件中使用以下方法:
在满足条件时,根据历史图形中的两个点 (x1, y1)
和 (x2, y2)
计算趋势线的斜率 a
和截距 b
。
使用 PlotNumeric
绘制趋势线,并在价格突破趋势线时停止绘制。
在遇到红色脸(停止条件)时,清空 a
和 b
,并停止绘制趋势线。直到下一次满足条件时重新计算并绘制。
以下是一个示例代码,实现你描述的功能:
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
通过以上方法,你可以实现根据历史图形计算趋势线,并在满足条件时绘制趋势线,同时在价格突破趋势线时停止绘制。如果仍有疑问,欢迎继续交流!
老师好,使用AI辅助用TB开发是个好主意,之前我只用过GitHub CoPilot辅助开发,没想到现在AI也能直接辅助TB的编程语言了。
具体到我的问题,似乎代码没有贴全,比如
4. DeletePlot:停止绘制趋势线。
这个函数哪里来的呢?能否把代码贴全给我看看?