0

有谁知道我如何在某个日期之后绘制定义变量的每次出现?因此,在某个时间帧输入之前忽略所有事件。我能够找到这个:How to plot only the last x period 但是,这似乎只在输入日期绘制了变量的一次出现。

例如和简单如何在用户输入日期之后绘制每个十字星:

//@version=5
indicator('Plot all Doji after input date and ignore before input date', overlay=true)
monthsBack = input.int(3, minval=0)

doji = close == open

targetDate = time >= timestamp(year(timenow), month(timenow) - monthsBack, 1, 0, 0, 0)
beginMonth = not targetDate[1] and targetDate

var float valueToPlot = doji
if beginMonth
    valueToPlot := high
    valueToPlot
plot(valueToPlot)
bgcolor(beginMonth ? color.green : na, transp=90)

更新:

哇,谢谢你,我没想到会有这么彻底的答案。阅读您的回复后,现在对我来说很有意义。

我主要是一名交易员,而不是程序员,所以我很高兴看到我的交易策略开始以更自动化的方式结合在一起。这个脚本只是我最有利可图的交易策略的一部分,它将帮助我节省大量用于识别水平的时间。这也将帮助我转移到一个新的符号,其级别准备好更快,因为我在过去两年一直在手绘我的级别,这很耗时。

我应该在我原来的帖子中说“测试蜡烛”而不是“十字星”。我只是想为蜡烛类型使用占位符,因为为我正在寻找的实际条件编写代码会有些复杂。但是,我想确保我能够在开始之前绘制我需要看到的内容。

截屏

这是我通常如何手绘价格水平的屏幕截图。现在自动完成一个脚本!

图片链接

这是我在 shanem 的帮助下得到的脚本,它仍在进行中,但要到达那里:

//@version=5
// with help from shanem it works!
indicator("Identify [a specific kind of candle] in past N months", shorttitle = "Auto Price Levels", overlay = true)

// 1) Define inputs used in the script
monthsBack = input.int(8, minval=0, title="How many months back should we scan for [candle type]?")

// 2) Declare variables used in the script, and set defaults (once per chart)
var tn = timenow
var firstDate = timestamp(year(tn), month(tn) - monthsBack, 1, 0, 0, 0)
var testCandle = false
var okayToPlot = false

// 3) Calculations. 
okayToPlot := time > firstDate

// A note about the candle type. For the purpose of this script I plugged in a quick candle description to limit the number of 
    // candles that would appear on the chart, and to reduce the amount of code to deal with to focus on the 'plot' code. I first
    // wanted to see if it was possible to plot what I needed to see before I set out to create code for the specifi candle I'm 
    // looking for. I will either fully describe the candle in the future script, or import from a Pine Library since it is somewhat complex.  
testCandle := if close == open and barstate.isconfirmed and session.ismarket

    close

// 4) Output / Plotting
        // Plot a price line on the close of each occurance of the [candle type].
        // Also, highlight the high and low of the [candle type] and extend right. 
plot(okayToPlot and testCandle ? close : na, style = plot.style_circles, linewidth = 3, color = color.rgb(245, 66, 221))

if testCandle and okayToPlot
    line.new(bar_index - 1, close, bar_index, close, color = color.rgb(255, 164, 23), extend = extend.right, width = 1)
    box.new(bar_index - 1, high, bar_index, low, border_color = na, bgcolor = color.rgb(135, 135, 135, 80), extend = extend.right)

// To do next, working on now:
    // 1.   Define the candle and limit the timeframe (or resolution) the price level is calculated on. 
    //      Perhaps 30 minute. But, allow the price levels to be seen on all other timeframes.
    //      Seen on 1m, 5m, 4hr, daily, etc., but derived from 30m (just example).
    // 2.   Alerts. Send JSON payload via webhook if current price in range. Found this and modified version works good: 
    //      User "wlhm" - https://www.tradingview.com/script/FPq2xKyZ-DiscordWebhookFunction/
4

1 回答 1

0

好问题 Josiah,这里发生了很多事情:

  • 您可能已经发现了这一点,但beginMonth上面代码示例中的测试,如所写,只会标记您允许的日期范围内的第一个完整月份的第一天。我们将在下面解决这个问题。
  • Pine v5 中对颜色的设置方式进行了一些相关的更改,从 v4 中对变量的声明和更新方式进行了一些相关的更改,因此我也利用了以下这些更改。
  • 你有两个测试正在进行:时间框架和十字星,所以为了清楚起见,我在下面把它们分开了。

这是一个很好的例子,因为它突出了我在自己的 Pine 脚本中经常遇到的问题,寻找机会或条件:

为什么我没有看到我的规则标记的任何机会?我的代码有问题吗?它甚至跑了吗?或者是我正在查看的数据,没有任何匹配的蜡烛,但代码很好?(哦,我是否阅读了错误版本的文档,使用了正确版本的函数,是否更新了每个条上的值......)

即使我们成功地制作了正确的测试并成功地将它们正确组合,仍然很难有效地绘制十字星。部分是因为它们很少见,部分是因为它们在图表上的样子。这也使得我们很难判断我们的代码是否正常工作,即使它是。

所以我试着确保我的代码能帮助我看到哪里出了问题,什么不是。并且希望这个例子对那个级别的其他人也有用。

下面的代码应该做你想做的事。为了回答您的标题问题,它使用一个名为的变量okayToPlot来将您的指标的呈现限制在过去 N 个月内的几天内。

它还展示了如何找到并有效地突出显示十字星,因此您不会因为试图看到在另一条细黑线之上呈现的细黑线而发疯。

我曾经overlay=false帮助你(好吧,我)更好地了解发生了什么。一旦您对您的工作脚本感到满意,只需将其改回即可overlay=true

如果您将其复制/粘贴到您的 Pine 编辑器中作为新指标并在日线图上尝试一些缓慢移动的大盘股,如果您扫描足够长的时间,您应该会发现十字星。

我于 2021 年底在 TSX 的 BCE 上使用了 8 个月,它发现 2 天的十字星形成,它以黄色背景和亮绿色+符号突出显示。

//@version=5
indicator("Highlight Any Doji In Past N Months", overlay=false)

// 1) Define inputs used in the script
monthsBack = input.int(8, minval=0, title="How many months back should we scan for dojis?")

// 2) Declare variables used in the script, and set defaults (once per chart)
var tn = timenow
var firstDate = timestamp(year(tn), month(tn) - monthsBack, 1, 0, 0, 0)
var doji = false
var okayToPlot = false

// 3) Calculations. The := notation below updates the variable on each bar of the chart.
okayToPlot := time > firstDate

doji := close == open

// 4) Output / Plotting

plot(okayToPlot and doji ? close : na, style = plot.style_cross, linewidth = 3, color = color.new(color.green, 40))

bgcolor(okayToPlot ? doji ? color.new(color.yellow, 60) : color.new(color.green, 80) : na)

截屏

我在图表中使用深色主题。希望您仍然可以区分 8 个月前日期的黑色背景(不会以黄色突出显示十字星)和过去 8 个月的日期(将以黄色突出显示任何十字星日)——如果有的话成立。

Pine Script 以深绿色突出显示扫描的日期,以黄色突出显示带有十字星的日期

相关:什么是十字星?

起初我认为问题中的这一行是一个错误:

doji = close == open

但事实证明,直到今天我才真正知道十字星是什么。我必须查一下,这样未来的读者就不会被这个特定的例子弄糊涂了,这个快速的旁注:

当开盘价和收盘价相等时形成十字星。

(通过https://commodity.com/technical-analysis/doji/

因此,在烛台图表上,它可能看起来像 + 或更高的十字。

通过浏览上面的链接,我不确定从技术上讲,高点和低点相等的一天是否算作十字星。在烛台图表上,它看起来像一个减号,一个破折号。如果您想从过滤器中排除这些,请将上面的十字星测试行更改为:

doji := close == open and high > low

奖金回合:plotchar()

这是另一个屏幕截图,颜色更亮,绘图技术略有不同,更适合这种情况。

我们可能并不想绘制收盘价,只是吸引观众的眼球。我还将这个屏幕截图放大到我之前图像中最相关的几个月(在将月份输入更改为 5 后,它只搜索到 7 月 1 日)。

十字星!

// Since plotting anything (a line, a cross, whatever) directly at the close
// price of a doji will hide it, here's a version that uses plotchar() to
// place a question mark directly above the doji.
plotchar(okayToPlot and doji, char='?', location = location.abovebar, color = color.new(color.black, 0))
bgcolor(okayToPlot ? doji ? color.new(color.yellow, 40) : color.new(color.green, 20) : na)

受铁拳启发的绿色和黄色颜色,因为十字星让我想起了道场,而我的某些部分仍然是七岁。问号是因为十字星代表不确定性,优柔寡断的市场......绝不是对同样穿着绿色的谜语人的参考。这肯定是巧合吧?

于 2021-12-29T22:45:13.183 回答