TradingView的PineScript-如何评估动态数据“系列”变量?

问题描述

简介

Pinescript是用于回测交易算法的一种专有编程语言。该语言一直以来对我来说很有趣,因为它围绕系列而定,因此某些功能的工作方式不同于正常语言。

四个主要系列变量openhighlowclose指向形成条形数据的数组,因此如果要编写代码,则>

plot(close)

它将在图表上绘制收盘价。这很容易理解,因为变量close只是指向浮动价格数据数组,而plot方法正在绘制该数组。

类似的代码

plotchar(close > open,'A')

将绘制字符“ A”,其闭合值大于数组中的打开值。

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

1。

if (close > open)
     strategy.entry(id="EL",long=true,qty=5)

等同于

2。

strategy.entry(id="EL",when = close > open,qty=5)

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

上面的示例与我的问题没有直接关系,但我坚持强调了Pinescript如何以与传统编程语言不同的方式工作。

动态数据

我不了解的部分是某些特殊变量混入正则表达式时。在调用某些函数之前,这些变量的数据不存在,但是,似乎可以按照直觉期望的方式对它们进行评估,而不考虑解析器读取输入代码时它们的数据不存在的事实。 例如,系列变量strategy.position_size是(浮动)系列变量,其中包含在评估订单时的整体头寸规模。例如

strategy.entry(id="EL",qty=5)
plot(strategy.position_size)

这将在图表上绘制头寸大小。这很简单,除了下面的代码也将产生相同的结果:

plot(strategy.position_size)
strategy.entry(id="EL",qty=5)

这表明positon_size变量被视为某种特殊变量,在执行任何顺序函数strategy.entry)之前不会对其进行评估。也许编译器将检测到此时无法评估代码plot(strategy.position_size),因此将其保存直到运行影响该变量(strategy.entry)的任何代码

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

strategy.entry(id="EL",when = strategy.position_size==0,qty=5)

当编译器到达strategy.entry方法时,看到它应该只在position_size == 0处输入位置。但是,position_size变量数据直接取决于何时调用strategy.entry。这似乎是一个陷阱22场景,我不确定编译器如何处理此代码

您是否知道Pinescript编译器如何处理这些特殊的“动态”变量? 是否有记录在案的示例,以不同的编程语言出现?

很抱歉,如果我的术语不正确或令人困惑。我进入口译器设计已经只有一年了,但我还有很多东西要学习。

解决方法

这里没有魔术。您需要了解一下strategy.entry / exit / etc只会放置该订单,并且该订单将在以后执行,并且只有在该头寸将打开或关闭且strategy.position_size的值才会更改。