我正在尝试编写一个指标,该指标绘制每个移动平均交叉线之间的最高价和最低价。就像ZigZag指标一样。
例如,如果快速移动平均线从下方穿过慢速移动平均线,则指标应仅寻找最高高线,并且交叉之间应该只有一个值。对于从上方进行的交叉来说,指标也应该仅绘制一个值,该值是自上次交叉以来的最低最低值。
我是Pine脚本的新手,但对于编码一般不是新手。我发现用Pine脚本编写最简单的代码具有挑战性。我正在学习如何用这种语言编写代码。
请帮助指导我如何找到正确的答案。谢谢
//@version=4
study(title="MA Cross", overlay=true, max_bars_back=3000)
MA1 = sma(close, 20)
MA2 = sma(close, 100)
Highest(src, len) =>
max = high
for i = 1 to len
if src[i] > max
max := src[i]
max
Lowest(src, len) =>
min = src[0]
for i = 1 to len
if src[i] < min
min := src[i]
min
HH = 0.0
HH := Highest(high, barssince(cross(MA1, MA2)))
LL = 0.0
LL := Lowest(low, barssince(cross(MA1, MA2)))
HighLow = 0.0
if(MA1 > MA2)
HighLow := HH
else
if(MA1 < MA2)
HighLow := LL
else
HighLow := na
plot(series=HighLow, color = color.red, linewidth=3)
plot(series=MA1, color = color.aqua, linewidth=1)
plot(series=MA2, color = color.orange, linewidth=1)
答案 0 :(得分:0)
我不确定100%,但是问题似乎与barssince()
返回series[integer]
的事实有关,并且在for
条件下使用它会导致问题。
因此,您需要实现自己的barssince()
。我为此使用了一个简单的计数器。
//@version=4
study(title="MA Cross Debug", overlay=false, max_bars_back=3000)
MA1 = sma(close, 20)
MA2 = sma(close, 100)
var cntA1LessThanA2 = 0
HighestCross = 0.0
MovingAverage_Long = crossover(MA1, MA2)
Highest(src, len) =>
max = high
for i = 1 to len
if (src[i] > max)
max := src[i]
max
if (MA1 > MA2)
cntA1LessThanA2 := cntA1LessThanA2 + 1
else
cntA1LessThanA2 := 0
if (MA1 > MA2)
HighestCross := Highest(high, cntA1LessThanA2)
else
HighestCross := na
plot(series=barssince(MA1<MA2), title="barssince", color=color.green, linewidth=3)
plot(series=cntA1LessThanA2, title="cntA1LessThanA2", color=color.red, linewidth=3)
在屏幕截图下方的指示器中,我绘制了计数器(红色)并返回了barssince()
(绿色)的值,以向您展示计数器的工作原理。
plot(series=barssince(MA1<MA2), title="barssince", color=color.green, linewidth=3)
plot(series=cntA1LessThanA2, title="cntA1LessThanA2", color=color.red, linewidth=3)
请注意,您的指标将没有有效的输出if MA >= M1
,因为在这种情况下您将na
分配给HighestCross
。但是我想你已经知道了。
if (MA1 > MA2)
HighestCross := Highest(high, cntA1LessThanA2)
else
HighestCross := na
plot(HighestCross, color = color.red, linewidth = 3)
我相信您可以从这里拿走它。