ThinkScript 到 PineScript 的转换问题

ThinkScript to PineScript Conversion Question

我正在努力将 ThinkScript 指标转换为 PineScript。我目前在将 ThinkScript 的 barNumber() 函数转换为 PineScript 时遇到问题。我想我知道使用什么作为它的等价物,但我不确定我是否理解 barNumber() 即使在阅读了文档和示例之后。

该指标基本上用作 entry/exit 指标。我认为代码通过使用 barNumber() 所做的是在绘制新信号时删除信号,但如果新信号无效,则它会恢复到先前的信号。

这是我对前几个 defs 背后有更多实质内容感到困惑的代码部分,只是解释它们无关紧要,它们都应该 return 作为浮点数(def stateUp through def linDev):

def bar = barNumber();

def stateUp;
def stateDn;
def atrCCI;
def price;
def linDev;

def CCI = if linDev == 0 
  then 0 
else (price - avg(price, length)) / linDev / 0.05;

def MT1 = if CCI > 0
  then max(MT1[1], hl2 - ATRCCI)
else (min(MT1[1], hl2 + ATRCCI)

def state = if close > ST and close > MT1 then StateUp
else if close < ST and close < MT1 then StateDn
else State[1];

def newState = HighestAll(if state <> state[1] then bar else 0);

该代码使用了很多条件语句,以下是该代码的一些其他用法:

CSA = if bar >= newState then MT1 else Double.NaN;

signal = if bar >= newState and state == stateUp and. . .

在 PineScript 中有解决这个问题的简单方法吗?

感谢您的帮助!

相当于 thinkScript 的 BarNumber() is Pine-Script's bar_index


thinkScript 和 Pine-Script 都使用一个表示有效交易周期范围的循环。 BarNumber/bar_index 值表示通过循环计算的每个测量周期。

为了将此与其他类型的编码进行比较,您可能会考虑类似 for bar_index in 0 to 10 的 10 天交易期,其中 bar_index 将从 0 计数到 9(即,它的作用类似于for 循环中的刻板印象 i

指数代表的周期可以是一天、分钟、刻度等 - 无论您为图表或计算设置什么。并且,请注意:*“日”代表“交易日”,不是“日历日”。

一个令人困惑的问题是:条形图从哪里开始计数? BarNumber() 或 bar_index 从您时间框架的 最早 周期开始,并向您的最近交易周期计算 up 例如,0 的 bar_index 可能代表 10 天前,而 9 的 bar_index 可能代表今天。

这是来自 Kodify site (which provides Pine-Script tutorials) 的一些示例代码:

//@version=4
study("Example of bar_index variable", overlay=true)

// Make a new label once
var label myLabel = label.new(x=bar_index, y=high + tr,
     textcolor=color.white, color=color.blue)

// On the last bar, show the chart's bar count
if (barstate.islast)
    // Set the label content
    label.set_text(id=myLabel, text="Bars on\nthe chart:\n" +
         tostring(bar_index + 1))

    // Update the label's location
    label.set_x(id=myLabel, x=bar_index)
    label.set_y(id=myLabel, y=high + tr)

注意 tostring(bar_index + 1))。他们加一是因为,请记住,索引是从零开始的,因此从 0 到 9 的索引实际上是在计算 10 个柱。


我认为 BarNumber()/bar_index 概念令人困惑的原因是因为我们还以另一种方式考虑值。例如,如果我们将 closeclose[1] 进行比较,即当前期间的 close 值与上一期间的 close 值 (close[1]) 相比。这是条形码的 相反 close[1] 实际上会有一个 较低的 柱线 number/index 因为它来自 之前 close.

当我们使用 close[1] 之类的东西时,脚本实际上是从右向左计数(最近到更早的时期)——与 BarNumber()/[=68 相反=]概念.