如何在特定日期之后绘制并忽略之前的任何内容 - Pine Script v5 - TradingView

How to plot after a certain date and ignore anything prior to - Pine Script v5 - TradingView

有谁知道如何绘制特定日期后定义变量的每次出现?因此,在某个时间范围输入之前忽略所有事件。我找到了这个: 但是,这似乎只绘制了输入日期变量的一次出现。

举个简单的例子,我如何在用户输入日期后绘制每个十字星:

//@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 我没想到会有这么详尽的答案。阅读您的回复后,我现在明白了。

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

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

截图

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

link to image

这是我在 if 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/

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

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

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

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

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

因此,我尝试确保我的代码能帮助我了解哪里出了问题,什么没有。希望这个例子对那个级别的其他人也有用。

下面的代码应该可以满足您的需求。为了回答您的标题问题,它使用一个名为 okayToPlot 的变量将您的指标的呈现限制在过去 N 个月的几天内。

它还展示了如何找到并有效地突出十字星,这样您就不会疯狂地试图看到一条呈现在另一条细黑线之上的细黑线。

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

如果您 copy/paste 将其作为新指标放入您的 Pine 编辑器中,并在一些 slow-moving 大盘股的日线图上试用它,如果您扫描长线,您应该会发现十字星足够的时间。

我在 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 个月的日期之间的区别,黑色背景不会以黄色突出显示十字星,这将以黄色突出显示任何十字星日 - 如果有的话找到了。

相关:什么是十字星?

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

doji = close == open

但事实证明,直到今天我才真正知道什么是十字星。我不得不查找它,只是为了让同一条船上的未来读者不会被这个特定的例子搞糊涂,这个简短的旁注:

A doji is formed when the opening price and the closing price are equal.

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

所以在烛台图表上,它可能看起来像一个 + 或一个更高的十字。

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

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)

绿色和黄色的灵感来自铁拳,因为 doji 让我想起了 dojo 而我的某些部分仍然是七岁.问号是因为十字星代表不确定性,一个优柔寡断的市场……并且绝不是指同样穿着绿色衣服的谜语人。这肯定是巧合吧?