Compiler construction TradingView&x27;Pines脚本-动态数据是如何使用的;“系列”;评估的变量?

Compiler construction TradingView&x27;Pines脚本-动态数据是如何使用的;“系列”;评估的变量?,compiler-construction,interpreter,pine-script,Compiler Construction,Interpreter,Pine Script,导言 Pinescript是一种用于回溯测试交易算法的适当编程语言。这种语言对我来说一直很有趣,因为它是以系列为导向的,因此某些功能的工作方式不同于普通语言 四个主要系列变量,open、high、low和close指向形成条形数据的数组,因此如果要编写代码 plot(close) 它会在图表上画出收盘价。这很容易理解,因为在幕后变量close只是指向一个浮动价格数据数组,而plot方法正在绘制该数组 类似地,代码 plotchar(close > open, 'A') 将打印字符“A”

导言

Pinescript是一种用于回溯测试交易算法的适当编程语言。这种语言对我来说一直很有趣,因为它是以系列为导向的,因此某些功能的工作方式不同于普通语言

四个主要系列变量,
open
high
low
close
指向形成条形数据的数组,因此如果要编写代码

plot(close)
它会在图表上画出收盘价。这很容易理解,因为在幕后变量
close
只是指向一个浮动价格数据数组,而
plot
方法正在绘制该数组

类似地,代码

plotchar(close > open, 'A')
将打印字符“A”,其中数组中的关闭值大于打开值

当比较两个系列时,如果语句以独特的方式工作:

一,

这相当于

二,

在示例1中,if语句结果应用于
strategy.entry
方法的所有参数(只要在该if语句范围内引用任何序列)。在这种情况下,它们的关键参数是
when
参数。未定义时,参数指向充满真值的数组时的
。但是,由于它位于只能在
close>open
处计算序列值的范围内,因此其工作方式与示例2完全相同

上面的例子与我的问题没有直接关系,但我保留它是为了强调Pinescript的工作方式与传统编程语言的工作方式不同

动态数据

我不理解的部分是当某些特殊变量混合到正规表达式中时。在调用某些函数之前,这些变量的数据并不存在,但是,不管解析器读取输入代码时它们的数据是否不存在,这些变量的计算结果似乎与我们直观的预期一致。 例如,序列变量
strategy.position\u size
是一个序列变量(浮动数),它包含订单评估时的总体头寸大小。例如

strategy.entry(id="EL", when = close > open, long=true, qty=5)
plot(strategy.position_size)
这将在图表上绘制出位置大小。这很简单,只是下面的代码也会产生相同的结果:

plot(strategy.position_size)
strategy.entry(id="EL", when = close > open, long=true, qty=5)
这表明
position\u size
变量被视为某种特殊变量,在执行任何订单函数(
strategy.entry
)之前不会对其求值。可能编译器会检测到,此时无法计算代码行
绘图(strategy.position\u size)
,因此在运行影响此变量(
strategy.entry
)的任何代码之前,都会保存该行代码

然而,令人困惑的是,您可以在表达式中使用这些特殊变量,这些变量将直接影响该变量的结果。例如:

strategy.entry(id="EL", when = strategy.position_size==0, long=true, qty=5)
当编译器到达
strategy.entry
方法时,它看到只有在
position\u size==0
时才应该输入一个位置。但是,
位置\u大小
变量数据直接取决于何时调用
策略。条目
。这看起来像是第22条军规,我不确定编译器将如何处理这段代码

你知道Pinescript编译器如何处理这些特殊的“动态”变量吗? 在不同的编程语言中是否有类似的场景的文档示例


如果我的术语不恰当或令人困惑,请道歉。我从事翻译设计只有一年了,我还有很多东西要学。

这里没有魔法。您需要了解strategy.entry/exit/etc只会下订单,订单将在稍后执行,并且只有在这之后,位置才会打开或关闭,strategy.position\u size的值才会更改

plot(strategy.position_size)
strategy.entry(id="EL", when = close > open, long=true, qty=5)
strategy.entry(id="EL", when = strategy.position_size==0, long=true, qty=5)