风格指南

介绍

本风格指南提供了有关如何以标准方式命名变量和组织 Pine 脚本的建议。遵循我们最佳实践的脚本将更易于阅读、理解和维护。

您可以看到从平台上的TradingViewPineCoders账户发布的使用这些指南的脚本 。

命名约定

我们建议使用:

  • camelCase对于所有标识符,即变量或 函数名称ma,,,,,,maFastmaLengthInputmaColorroundedOHLC()pivotHi()
  • SNAKE_CASE常量全部大写: BULL_COLORBEAR_COLORMAX_LOOKBACK
  • 当限定后缀 能够提供关于变量的类型或来源有价值的线索时使用:maShowInput,,,,,,,bearColorbearColorInputvolumesArraymaPlotIDresultsTablelevelsColorArray

脚本组织

Pine Script™ 编译器对脚本中特定语句的位置或版本 编译器注释非常宽容。虽然其他安排在语法上是正确的,但我们建议按以下方式组织脚本:

<license>
<version>
<declaration_statement>
<import_statements>
<constant_declarations>
<inputs>
<function_declarations>
<calculations>
<strategy_calls>
<visuals>
<alerts>

<许可证>

如果您在 TradingView 上公开发布您的开源脚本(脚本也可以私下发布),您的开源代码默认受 Mozilla 许可证保护。您可以选择您喜欢的任何其他许可证。

这些脚本代码的重复使用受到我们的《脚本出版内部规则》的管辖 ,该规则优先于作者的许可。

脚本开头出现的标准许可证注释是:

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © username

<版本>

这是 编译器注释,定义脚本将使用的 Pine Script™ 版本。如果没有,则使用 v1。对于 v5,请使用:

//@version=5

<声明语句>

这是强制声明语句,用于定义脚本的类型。它必须是对indicator()strategy()library()的调用

<导入语句>

如果您的脚本使用一个或多个 Pine Script™ ,则您的 导入 语句属于此处。

<常量声明>

脚本可以声明限定为“const”的变量,即引用常量值的变量。

当变量满足以下条件时,我们将其称为“常量”:

  • 它们的声明使用了可选const关键字(有关更多信息,请参阅我们的用户手册中有关 类型限定符的部分)。
  • 它们使用文字(例如100"AAPL")或限定为“const”的内置函数(例如color.green)进行初始化。
  • 它们的值在脚本执行期间不会改变。

我们使用SNAKE_CASE这些变量来命名它们,并将它们的声明分组放在脚本的顶部附近。例如:

// ————— Constants
int     MS_IN_MIN   = 60 * 1000
int     MS_IN_HOUR  = MS_IN_MIN  * 60
int     MS_IN_DAY   = MS_IN_HOUR * 24

color   GRAY        = #808080ff
color   LIME        = #00FF00ff
color   MAROON      = #800000ff
color   ORANGE      = #FF8000ff
color   PINK        = #FF0080ff
color   TEAL        = #008080ff
color   BG_DIV      = color.new(ORANGE, 90)
color   BG_RESETS   = color.new(GRAY, 90)

string  RST1        = "No reset; cumulate since the beginning of the chart"
string  RST2        = "On a stepped higher timeframe (HTF)"
string  RST3        = "On a fixed HTF"
string  RST4        = "At a fixed time"
string  RST5        = "At the beginning of the regular session"
string  RST6        = "At the first visible chart bar"
string  RST7        = "Fixed rolling period"

string  LTF1        = "Least precise, covering many chart bars"
string  LTF2        = "Less precise, covering some chart bars"
string  LTF3        = "More precise, covering less chart bars"
string  LTF4        = "Most precise, 1min intrabars"

string  TT_TOTVOL     = "The 'Bodies' value is the transparency of the total volume candle bodies. Zero is opaque, 100 is transparent."
string  TT_RST_HTF    = "This value is used when '" + RST3 +"' is selected."
string  TT_RST_TIME   = "These values are used when '" + RST4 +"' is selected.
  A reset will occur when the time is greater or equal to the bar's open time, and less than its close time.\nHour: 0-23\nMinute: 0-59"
string  TT_RST_PERIOD = "This value is used when '" + RST7 +"' is selected."

在此示例中:

  • RST*常量LTF*将用作options调用参数中的元组元素input.*()
  • 常量TT_*将用作调用tooltip中的参数 input.*()。请注意我们如何对长字符串文字使用行延续。
  • 我们不使用 var 来初始化常量。Pine Script™ 运行时经过优化,可处理每个条形图上的声明,但仅在第一次声明时使用 var 来初始化变量会对脚本性能造成轻微影响,因为 var 变量需要在后续条形图上进行维护。

注意:

  • 脚本中多处使用的文字应始终声明为常量。如果赋予了有意义的名称,则使用常量而不是文字会使其更具可读性,并且这种做法使代码更易于维护。即使一天中的毫秒数将来不太可能发生变化,也 MS_IN_DAY比更有意义1000 * 60 * 60 * 24
  • 仅在函数的局部块或 ifwhile等语句中使用的常量可以在该局部块中声明。

<输入>

当所有输入都位于同一代码段中时,脚本的阅读会变得容易得多。将该段放在脚本的开头也反映了它们在运行时(即在执行脚本的其余部分之前)的处理方式。

在输入变量名后面加上后缀,使得input它们在脚本中稍后使用时更容易识别:maLengthInput,,, 等等。bearColorInputshowAvgInput

// ————— Inputs
string  resetInput              = input.string(RST2,        "CVD Resets",                       inline = "00", options = [RST1, RST2, RST3, RST4, RST5, RST6, RST7])
string  fixedTfInput            = input.timeframe("D",      "  Fixed HTF:  ",                   tooltip = TT_RST_HTF)
int     hourInput               = input.int(9,              "  Fixed time hour:  ",             inline = "01", minval = 0, maxval = 23)
int     minuteInput             = input.int(30,             "minute",                           inline = "01", minval = 0, maxval = 59, tooltip = TT_RST_TIME)
int     fixedPeriodInput        = input.int(20,             "  Fixed period:  ",                inline = "02", minval = 1, tooltip = TT_RST_PERIOD)
string  ltfModeInput            = input.string(LTF3,        "Intrabar precision",               inline = "03", options = [LTF1, LTF2, LTF3, LTF4])

<函数声明>

所有用户定义的函数都必须在脚本的全局范围内定义;Pine Script™ 中不允许嵌套函数定义。

最佳函数设计应尽量减少函数范围内全局变量的使用,因为它们会破坏函数的可移植性。当无法避免时,这些函数必须遵循代码中的全局变量声明,这意味着它们不能总是放在 <function_declarations> 部分中。理想情况下,对全局变量的这种依赖关系应记录在函数的注释中。

如果您记录函数的目标、参数和结果,这也将对读者有所帮助。库中使用的相同语法也 可用于记录您的函数。如果您决定这样做,这可以更轻松地将您的函数移植到库中:

//@version=5
indicator("<function_declarations>", "", true)

string SIZE_LARGE  = "Large"
string SIZE_NORMAL = "Normal"
string SIZE_SMALL  = "Small"

string sizeInput = input.string(SIZE_NORMAL, "Size", options = [SIZE_LARGE, SIZE_NORMAL, SIZE_SMALL])

// @function        Used to produce an argument for the `size` parameter in built-in functions.
// @param userSize  (simple string) User-selected size.
// @returns         One of the `size.*` built-in constants.
// Dependencies     SIZE_LARGE, SIZE_NORMAL, SIZE_SMALL
getSize(simple string userSize) =>
    result = 
      switch userSize
        SIZE_LARGE  => size.large
        SIZE_NORMAL => size.normal
        SIZE_SMALL  => size.small
        => size.auto

if ta.rising(close, 3)
    label.new(bar_index, na, yloc = yloc.abovebar, style = label.style_arrowup, size = getSize(sizeInput))

<计算>

这是脚本的核心计算和逻辑应该放置的地方。当变量声明放置在使用变量的代码段附近时,代码可以更容易阅读。一些程序员喜欢将所有非常量变量声明放在此部分的开头,但对于所有变量来说,这并不总是可行的,因为有些变量可能需要在声明之前执行一些计算。

<策略调用>

当策略调用分组在脚本的同一部分时,策略更易于阅读。

<图片>

理想情况下,本节应包括生成脚本视觉效果的所有语句,无论是情节、绘图、背景颜色、蜡烛图等。 有关如何确定视觉效果相对深度的更多信息,请参阅此处的 Pine Script™ 用户手册部分。

<警报>

警报代码通常需要在它之前执行脚本的计算,因此将它放在脚本的末尾是有意义的。

间距

除一元运算符 ( ) 外,所有运算符的两侧都应使用空格-1。建议在所有逗号后以及使用命名函数参数时都使用空格,如下所示plot(series = close)

int a = close > open ? 1 : -1
var int newLen = 2
newLen := min(20, newlen + 1)
float a = -b
float c = d > e ? d - e : d
int index = bar_index % 2 == 0 ? 1 : 2
plot(close, color = color.red)

换行可以使长行更易于阅读。换行是使用非四倍数的缩进级别来定义的,因为四个空格或一个制表符用于定义局部块。这里我们使用两个空格:

plot(
   series = close,
   title = "Close",
   color = color.blue,
   show_last = 10
 )

垂直对齐

使用制表符或空格进行垂直对齐在包含许多类似行(如常量声明或输入)的代码段中很有用。它们可以使用 Pine Editor 的多光标功能 ( ctrl++ ) 更轻松地进行批量编辑:alt🠅

// Colors used as defaults in inputs.
color COLOR_AQUA  = #0080FFff
color COLOR_BLACK = #000000ff
color COLOR_BLUE  = #013BCAff
color COLOR_CORAL = #FF8080ff
color COLOR_GOLD  = #CCCC00ff

显式类型

在声明变量时包含变量类型并不是必需的。但是,它有助于使脚本更易于阅读、导航和理解。它有助于在脚本执行的每个点明确预期的类型,并区分变量的声明(使用=)和变量的重新赋值(使用:=)。使用显式类型化还可以使脚本更易于调试

Original text
Rate this translation
Your feedback will be used to help improve Google Translate