风格指南
介绍
本风格指南提供了有关如何以标准方式命名变量和组织 Pine 脚本的建议。遵循我们最佳实践的脚本将更易于阅读、理解和维护。
您可以看到从平台上的TradingView 和 PineCoders账户发布的使用这些指南的脚本 。
命名约定
我们建议使用:
camelCase
对于所有标识符,即变量或 函数名称:ma
,,,,,,。maFast
maLengthInput
maColor
roundedOHLC()
pivotHi()
SNAKE_CASE
常量全部大写:BULL_COLOR
,BEAR_COLOR
,MAX_LOOKBACK
。- 当限定后缀
能够提供关于变量的类型或来源的有价值的线索时使用:
maShowInput
,,,,,,,。bearColor
bearColorInput
volumesArray
maPlotID
resultsTable
levelsColorArray
脚本组织
Pine Script™ 编译器对脚本中特定语句的位置或版本 编译器注释非常宽容。虽然其他安排在语法上是正确的,但我们建议按以下方式组织脚本:
<许可证>
如果您在 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
。 - 仅在函数的局部块或 if、 while等语句中使用的常量可以在该局部块中声明。
<输入>
当所有输入都位于同一代码段中时,脚本的阅读会变得容易得多。将该段放在脚本的开头也反映了它们在运行时(即在执行脚本的其余部分之前)的处理方式。
在输入变量名后面加上后缀,使得input
它们在脚本中稍后使用时更容易识别:maLengthInput
,,,
等等。bearColorInput
showAvgInput
// ————— 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
显式类型
在声明变量时包含变量类型并不是必需的。但是,它有助于使脚本更易于阅读、导航和理解。它有助于在脚本执行的每个点明确预期的类型,并区分变量的声明(使用=
)和变量的重新赋值(使用:=
)。使用显式类型化还可以使脚本更易于调试。