[英]Plotting shapes where condition is met first, but not on consecutive candles?
我正在尝试编写一个指标,为绘制的形状生成多个真实条件。 例如,MACD 交叉与 ADX 条件相结合,如下所示:
study("MACD on chart", shorttitle="MACD on Chart", overlay=true)
// MACD
// Inputs
fast_length = input(title="Fast Length", type=input.integer, defval=6)
slow_length = input(title="Slow Length", type=input.integer, defval=13)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 4)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)
// Calculation
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
// hist = macd - signal
// DMI
// Inputs
lensig = input(14, title="ADX Smoothing", minval=1, maxval=50)
len = input(14, minval=1, title="DI Length")
// Calculation
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / trur)
minus = fixnan(100 * rma(minusDM, len) / trur)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)
longCondition = macd >= signal and adx >= 20
plotshape(longCondition, style=shape.labelup, size=size.tiny, color=color.new(color.green, 60), location=location.belowbar)
shortCondition = signal <= macd and adx >= 20
plotshape(shortCondition, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 60), location=location.abovebar)
不幸的是,这会在图表上产生多个绘制的形状,因为该条件适用于多个蜡烛。 相反,它只希望重新满足新条件的第一次出现具有形状。
为了防止一个问题:不,在这种情况下我不能使用crossover
,因为我在脚本中使用它的方式会产生错误的结果。 交叉仅在它实际交叉的蜡烛上是正确的,但条件是以某种方式设置的,即实际交叉不会是正确的触发蜡烛。 我希望这是有道理的。
这是一个视觉示例:
这段代码会做你正在寻找的。
我看到您正在计算macd和dmi ,它们也作为内置函数存在。
您可以在Pine Script Language Reference 中找到更多内容。
此外,你并不需要创建一个color.new()
来获得在transparancy plotshape()
因为它可以作为一个参数。
//@version=4
study("MACD on chart", shorttitle="MACD on Chart", overlay=true)
var bool longCondition = na
var bool shortCondition = na
var bool showLong = na
var bool showShort = na
var bool showOnlyFirstSignal = input(true, "Show only first signal", input.bool)
// MACD
// Inputs
fast_length = input(title="Fast Length", type=input.integer, defval=6)
slow_length = input(title="Slow Length", type=input.integer, defval=13)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, defval= 4, minval = 1, maxval = 50)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)
// Calculation
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
// hist = macd - signal
// DMI
// Inputs
lensig = input(14, title="ADX Smoothing", minval=1, maxval=50)
len = input(14, minval=1, title="DI Length")
// Calculation
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / trur)
minus = fixnan(100 * rma(minusDM, len) / trur)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)
longCondition := macd >= signal and adx >= 20
shortCondition := signal <= macd and adx >= 20
showLong := showOnlyFirstSignal ? longCondition and not longCondition[1] : longCondition
showShort := showOnlyFirstSignal ? shortCondition and not shortCondition[1] : shortCondition
plotshape(showLong, style=shape.labelup, size=size.tiny, color=color.green, transp=60, location=location.belowbar)
plotshape(showShort, style=shape.labeldown, size=size.tiny, color=color.red, transp=60, location=location.abovebar)
编辑:评论中要求的额外解释。
精简版
showLong := showOnlyFirstSignal ? longCondition and not longCondition[1] : longCondition
长版
if showOnlyFirstSignal
// To show Long on the chart, the longCondition on the current bar must be true, but the longCondition on the previous bar must be false.
// So, as long as the longCondition on the previous bar stays true, showLong will be false, resulting in it not showing on the chart.
// The reverse is also true: showLong can only become true, if the longCondition on the previous bar was false.
showLong := longCondition and not longCondition[1]
else
showLong := longCondition
您可能还想看看三元条件运算符,它可能会为您进一步清理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.