繁体   English   中英

绘制首先满足条件而不是连续蜡烛的形状?

[英]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 ,因为我在脚本中使用它的方式会产生错误的结果。 交叉仅在它实际交叉的蜡烛上是正确的,但条件是以某种方式设置的,即实际交叉不会是正确的触发蜡烛。 我希望这是有道理的。

这是一个视觉示例:

在此处输入图片说明

这段代码会做你正在寻找的。
我看到您正在计算macddmi ,它们也作为内置函数存在。
您可以在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM