输入

介绍

输入接收用户可从脚本的“设置/输入”选项卡更改的值。通过利用输入,程序员可以编写脚本,让用户更轻松地适应自己的偏好。

以下脚本使用 ta.sma(close, 20)绘制了 20 周期简单移动平均线 (SMA)。虽然编写起来很简单,但代码不太灵活, 因为函数调用使用了特定的参数,用户如果不修改代码就无法更改这些参数:sourcelength

//@version=5
indicator("MA", "", true)
plot(ta.sma(close, 20))

如果我们以这种方式编写脚本,它会变得更加灵活,因为用户可以从“设置/输入”选项卡中选择他们想要使用的source值,length而无需更改源代码:

//@version=5
indicator("MA", "", true)
sourceInput = input(close, "Source")
lengthInput = input(20, "Length")
plot(ta.sma(sourceInput, lengthInput))

脚本在图表上运行时才可访问输入。用户可以从“设置”对话框访问脚本输入。要打开此对话框,用户可以:

  • 双击图表指标的名称
  • 右键单击脚本名称,然后从下拉菜单中选择“设置”项
  • 将鼠标悬停在图表上的指标名称上时,会出现“更多”菜单图标(三个点),从中选择“设置”项
  • 双击数据窗口中的指标名称(图表右下方第四个图标)

“设置”对话框始终包含“样式”和“可见性”选项卡,允许用户指定有关脚本视觉效果和可显示其输出的图表时间范围的偏好。

当脚本包含对input.*()函数的调用时,“设置”对话框中也会出现“输入”选项卡。

图像

当用户将输入添加到图表或更改脚本“设置/输入”选项卡中的值时,脚本会处理输入。对脚本输入的任何更改都会提示它使用新的指定值对所有可用数据重新执行。

输入函数

Pine Script™ 具有以下输入功能:

脚本在“输入”选项卡中创建输入小部件,这些小部件根据其input.*()函数调用接受不同类型的输入。默认情况下,每个输入按调用顺序显示在“输入”选项卡的新行上。程序员还可以通过使用函数 参数input.*()以不同的方式组织输入。有关更多信息,请参阅下面的这一节。input.*()groupinline

我们的风格指南 建议input.*()在脚本开始时拨打电话。

输入函数通常包含几个参数,允许程序员定义它们的默认值、值限制、它们在“输入”选项卡中的组织以及其他属性。

由于input.*()调用只是 Pine Script™ 中的另一个函数调用,因此程序员可以将它们与 算术比较逻辑三元运算符组合起来,将表达式分配给变量。这个简单的脚本将对input.string() 的调用结果 与“On”字符串进行比较,并将结果分配给变量plotDisplayInput 。这个变量属于“input bool”类型,因为 == 运算符返回“bool”值:

//@version=5
indicator("Input in an expression`", "", true)
bool plotDisplayInput = input.string("On", "Plot Display", options = ["On", "Off"]) == "On"
plot(plotDisplayInput ? close : na)

函数返回的所有值(除“源”值外)都是“输入”限定值。有关更多信息,input.*()请参阅我们的用户手册中有关 类型限定符的部分。

输入函数参数

所有输入函数共有的参数为:defvaltitletooltipinlinegroupdisplay。某些输入函数还包括其他参数:optionsminvalmaxvalstepconfirm

所有这些参数都需要“const”参数。唯一的例外是枚举defval输入的和options参数 ,因为 input.source() 使用“series float”值,而 input.enum() 使用枚举类型成员

由于input.*()参数在大多数情况下接受“const”参数,并且“input”和其他 限定符 比“const”更强,因此不能将一个input.*()调用的结果用作另一个input.*()调用的参数。

让我们来看看每个参数:

  • defval是所有输入函数的第一个参数。它是输入小部件中显示的默认值。它需要一个函数适用的输入值类型的参数。
  • title需要一个“const string”参数。它是字段的标签。
  • tooltip需要一个“const string”参数。使用该参数时,字段右侧会出现一个问号图标。当用户将鼠标悬停在它上面时,工具提示的文本就会出现。请注意,如果使用 将多个输入字段分组到一行中inline,则工具提示将始终出现在最右侧字段的右侧,并显示tooltip该行中使用的最后一个参数的文本。\n参数字符串中支持换行符 ( )。
  • inline需要一个“const string”参数。在多个调用中对参数使用相同的参数input.*()将把它们的输入小部件分组在同一行上。“输入”选项卡的宽度有限制,因此一行上只能容纳有限数量的输入字段。使用一个input.*()带有唯一参数的调用可以将输入字段移到标签后面的左侧,放弃不使用参数inline时使用的所有输入字段的默认左对齐。inline
  • group需要一个“const string”参数。使用它可以将任意数量的输入分组到一个有组织的部分中。用作参数的字符串 group将成为该部分的标题。input.*() 要分组在一起的所有调用必须使用相同的字符串作为其 group参数。
  • options需要用方括号括起来的逗号分隔元素列表(例如,["ON", "OFF"], [1, 2, 3], [myEnum.On, myEnum.Off])。输入使用指定的元素作为其生成的下拉小部件中的菜单选择。用户一次只能选择一个菜单项。提供列表时optionsdefval值必须是列表的元素之一。允许minvalmaxval或参数的输入不能同时step使用这些参数和参数。options
  • minval需要一个“const int/float”参数,具体取决于值的类型defval。它是输入字段的最小有效值。
  • maxval需要一个“const int/float”参数,具体取决于值的类型defval。它是输入字段的最大有效值。
  • step是使用小部件的向上/向下箭头时字段值移动的增量。
  • confirm需要一个“const bool”(truefalse)参数。此参数会影响脚本添加到图表时的行为。input.*()使用调用confirm = true将导致在将脚本添加到图表时弹出“设置/输入”选项卡。confirm有助于确保用户配置特定字段。

minvalmaxval参数step仅存在于 input.int()input.float() 函数的签名中。

输入类型

接下来的部分将解释每个输入函数的作用。接下来,我们将探索使用输入函数和组织其显示的不同方式。

通用输入

input() 是一个简单的通用函数,支持基本的 Pine Script™ 类型:“int”、“float”、“bool”、“color”和“string”。它还支持“源”输入,这些输入是与价格相关的值,例如 closehl2hlc3hlcc4,或者可用于接收另一个脚本的输出值。

其签名为:

input(defval, title, tooltip, inline, group) → input int/float/bool/color/string | series float

该函数通过分析函数调用中使用的参数类型来自动检测输入的类型defval。此脚本显示了所有支持的类型以及函数与defval不同类型的参数一起使用时返回的合格类型:

//@version=5
indicator("`input()`", "", true)
a = input(1, "input int")
b = input(1.0, "input float")
c = input(true, "input bool")
d = input(color.orange, "input color")
e = input("1", "input string")
f = input(close, "series float")
plot(na)

图像

整数输入

input.int()函数有两个签名 ;一个options是未使用时的签名,另一个是使用时的签名:

input.int(defval, title, minval, maxval, step, tooltip, inline, group, confirm) → input int
input.int(defval, title, options, tooltip, inline, group, confirm) → input int

此调用使用options参数为 MA 提出预定义的长度列表:

//@version=5
indicator("MA", "", true)
maLengthInput = input.int(10, options = [3, 5, 7, 10, 14, 20, 50, 100, 200])
ma = ta.sma(close, maLengthInput)
plot(ma)

这个使用参数minval来限制长度:

//@version=5
indicator("MA", "", true)
maLengthInput = input.int(10, minval = 2)
ma = ta.sma(close, maLengthInput)
plot(ma)

带列表的版本options使用下拉菜单作为其小部件。当options不使用该参数时,使用简单的输入小部件来输入值:

图像

浮点输入

input.float()函数有两个签名 ;一个options是未使用时的签名,另一个是使用时的签名:

input.float(defval, title, minval, maxval, step, tooltip, inline, group, confirm) → input int
input.float(defval, title, options, tooltip, inline, group, confirm) → input int

在这里,我们使用“浮点数”输入作为乘以标准差的因子,以计算布林带:

//@version=5
indicator("MA", "", true)
maLengthInput = input.int(10, minval = 1)
bbFactorInput = input.float(1.5, minval = 0, step = 0.5)
ma      = ta.sma(close, maLengthInput)
bbWidth = ta.stdev(ma, maLengthInput) * bbFactorInput
bbHi    = ma + bbWidth
bbLo    = ma - bbWidth
plot(ma)
plot(bbHi, "BB Hi", color.gray)
plot(bbLo, "BB Lo", color.gray)

浮点数的输入小部件与整数输入小部件类似:

图像

布尔输入

让我们继续开发我们的脚本,这次通过添加布尔输入来允许用户切换 BB 的显示:

图像

//@version=5
indicator("MA", "", true)
maLengthInput = input.int(10,    "MA length", minval = 1)
bbFactorInput = input.float(1.5, "BB factor", inline = "01", minval = 0, step = 0.5)
showBBInput   = input.bool(true, "Show BB",   inline = "01")
ma      = ta.sma(close, maLengthInput)
bbWidth = ta.stdev(ma, maLengthInput) * bbFactorInput
bbHi    = ma + bbWidth
bbLo    = ma - bbWidth
plot(ma, "MA", color.aqua)
plot(showBBInput ? bbHi : na, "BB Hi", color.gray)
plot(showBBInput ? bbLo : na, "BB Lo", color.gray)

注意:

  • 我们添加了一个输入,使用 input.bool() 来设置的值showBBInput
  • 我们使用inline该输入中的参数和 for 中的参数 bbFactorInput将它们放在同一行上。"01"在两种情况下,我们都使用 for 的参数。这就是 Pine Script™ 编译器识别它们属于同一行的方式。用作参数的特定字符串并不重要,不会出现在“输入”选项卡的任何地方;它仅用于识别哪些输入位于同一行。
  • 我们垂直对齐了调用title的参数input.*() ,以使其更易于阅读。
  • showBBInput我们在两个 plot()调用中使用变量 进行条件绘图。当用户取消选中输入的复选框时showBBInput,变量的值将变为false。当发生这种情况时,我们的 plot() 调用将绘制 na 值,但不显示任何内容。我们将true其用作输入的默认值,因此 BBs 默认绘图。
  • 因为我们使用 的inline参数作为变量,所以“输入”选项卡中的输入字段与未使用的 的 bbFactorInput 输入字段不垂直对齐maLengthInputinline

颜色输入

如颜色页面的部分所述 ,通过“设置/样式”选项卡选择脚本输出的颜色并不总是可行的。如果无法从“样式”选项卡中选择颜色,程序员可以使用 input.color () 函数创建颜色输入,以便从“设置/输入”选项卡自定义颜色。

假设我们想在高值低值 高于/低于 BB时绘制透明度较低的 BB 。我们可以使用这样的代码来创建颜色:

bbHiColor = color.new(color.gray, high > bbHi ? 60 : 0)
bbLoColor = color.new(color.gray, low  < bbLo ? 60 : 0)

当使用动态(“系列”)颜色组件(如transp 上述代码中的参数)时,“设置/样式”选项卡中的颜色小部件将不再出现。让我们创建自己的颜色选择输入,它将出现在“设置/输入”选项卡中:

图像

//@version=5
indicator("MA", "", true)
maLengthInput = input.int(10,           "MA length", inline = "01", minval = 1)
maColorInput  = input.color(color.aqua, "",          inline = "01")
bbFactorInput = input.float(1.5,        "BB factor", inline = "02", minval = 0, step = 0.5)
bbColorInput  = input.color(color.gray, "",          inline = "02")
showBBInput   = input.bool(true,        "Show BB",   inline = "02")
ma      = ta.sma(close, maLengthInput)
bbWidth = ta.stdev(ma, maLengthInput) * bbFactorInput
bbHi    = ma + bbWidth
bbLo    = ma - bbWidth
bbHiColor = color.new(bbColorInput, high > bbHi ? 60 : 0)
bbLoColor = color.new(bbColorInput, low  < bbLo ? 60 : 0)
plot(ma, "MA", maColorInput)
plot(showBBInput ? bbHi : na, "BB Hi", bbHiColor, 2)
plot(showBBInput ? bbLo : na, "BB Lo", bbLoColor, 2)

注意:

  • 我们添加了两次对 input.color()maColorInput的调用,以收集和变量 的值bbColorInput 。我们maColorInputplot(ma, "MA", maColorInput)调用中直接使用,并使用bbColorInput构建bbHiColor和变量,它们使用价格相对于 BB 的位置来调节透明度。我们对调用 color.new() 的bbLoColor值使用条件值 ,以生成相同基色的不同透明度。transp
  • 我们没有title对新的颜色输入使用参数,因为它们与其他输入位于同一行,从而允许用户了解它们适用于哪些图。
  • 我们已经重新组织了我们的inline论点,以便它们能够反映出我们将输入分为两条不同线路的事实。

时间范围输入

当您想要更改用于计算脚本中的值的时间范围时,时间范围输入会很有用。

让我们废除前几节中的 BB,并向简单的 MA 脚本添加时间范围输入:

图像

//@version=5
indicator("MA", "", true)
tfInput = input.timeframe("D", "Timeframe")
ma = ta.sma(close, 20)
securityNoRepaint(sym, tf, src) =>
    request.security(sym, tf, src[barstate.isrealtime ? 1 : 0])[barstate.isrealtime ? 0 : 1]
maHTF = securityNoRepaint(syminfo.tickerid, tfInput, ma)
plot(maHTF, "MA", color.aqua)

注意:

  • 我们使用 input.timeframe() 函数来接收时间范围输入。
  • 该函数会创建一个下拉窗口小部件,其中会提供一些标准时间范围。时间范围列表还包括您在图表用户界面中喜欢的任何时间范围。
  • 我们tfInputrequest.security() 调用中使用。我们还在gaps = barmerge.gaps_on调用中使用,因此该函数仅在较高时间范围完成后才返回数据。

符号输入

input.symbol () 函数创建一个小部件,允许用户像在图表的用户界面中一样搜索和选择符号。

让我们在脚本中添加一个符号输入:

//@version=5
indicator("MA", "", true)
tfInput = input.timeframe("D", "Timeframe")
symbolInput = input.symbol("", "Symbol")
ma = ta.sma(close, 20)
securityNoRepaint(sym, tf, src) =>
    request.security(sym, tf, src[barstate.isrealtime ? 1 : 0])[barstate.isrealtime ? 0 : 1]
maHTF = securityNoRepaint(symbolInput, tfInput, ma)
plot(maHTF, "MA", color.aqua)

注意:

  • 我们使用的参数defval是一个空字符串。这会导致 request.security()(我们使用symbolInput包含该输入的变量)默认使用图表的符号。如果用户选择另一个符号并希望使用图表的符号返回默认值,则需要使用“输入”选项卡的“默认值”菜单中的“重置设置”选项。
  • 我们使用securityNoRepaint()用户定义函数来使用 request.security() ,使其不会重新绘制;它仅在更高的时间范围完成时返回值。

会话输入

会话输入可用于收集一段时间内的开始和结束值。input.session () 内置函数可创建一个输入小部件,允许用户指定会话的开始和结束时间。可以使用下拉菜单进行选择,也可以输入“hh:mm”格式的时间值。

input.session()返回的值 是会话格式的有效字符串。有关更多信息,请参阅手册中的会话 页面 。

会话信息还可以包含会话有效日期的信息。我们在这里使用 input.string () 函数调用来输入当天的信息:

//@version=5
indicator("Session input", "", true)
string sessionInput = input.session("0600-1700", "Session")
string daysInput = input.string("1234567", tooltip = "1 = Sunday, 7 = Saturday")
sessionString = sessionInput + ":" + daysInput
inSession = not na(time(timeframe.period, sessionString))
bgcolor(inSession ? color.silver : na)

注意:

  • 该脚本建议默认会话为“0600-1700”。
  • input.string () 调用使用工具提示为用户提供有关输入日期信息的格式的帮助。
  • 通过连接脚本作为输入接收的两个字符串来构建完整的会话字符串。
  • 我们用string关键字明确声明两个输入的类型, 以明确这些变量将包含字符串。
  • 我们通过使用会话字符串 调用time()来检测图表条是否在用户定义的会话中 。如果当前条的时间值(条的打开 时间 )不在会话中,则 time() 返回 na,因此只要 time() 返回的值不是 nainSession ,就会返回na true

图像

输入

源输入可用于提供两种类型的源的选择:

  • 价格值,即: 开盘价最高价最低价收盘价hl2hlc3ohlc4
  • 其他脚本在图表上绘制的值。通过将一个脚本的输出作为另一个脚本的输入发送,这可以用于将两个或多个脚本“链接”在一起。

此脚本只是绘制了用户对源的选择。我们建议将 高值 作为默认值:

//@version=5
indicator("Source input", "", true)
srcInput = input.source(high, "Source")
plot(srcInput, "Src", color.new(color.purple, 70), 6)

这显示了一个图表,除了我们的脚本之外,我们还加载了“Arnaud Legoux 移动平均线”指标。在这里查看我们如何使用脚本的源输入小部件来选择 ALMA 脚本的输出作为我们脚本的输入。由于我们的脚本以浅紫色粗线绘制该源,因此您会看到两个脚本的绘图重叠,因为它们绘制的是相同的值:

图像

时间输入

时间输入使用 input.time() 函数。该函数返回以毫秒为单位的 Unix 时间( 有关详细信息, 请参阅时间页面)。这种类型的数据还包含日期信息,因此input.time() 函数返回时间日期。这就是其小部件允许同时选择两者的原因。

在这里,我们根据输入值测试条形图的时间,并在输入值较大时绘制箭头:

//@version=5
indicator("Time input", "T", true)
timeAndDateInput = input.time(timestamp("1 Aug 2021 00:00 +0300"), "Date and time")
barIsLater = time > timeAndDateInput
plotchar(barIsLater, "barIsLater", "🠆", location.top, size = size.tiny)

请注意,我们使用的值是对timestamp()defval函数的调用

枚举输入

input.enum()函数 创建一个下拉输入,显示与枚举类型的 不同成员(可能的值) 相对应的字段标题。该函数返回声明的枚举中唯一的命名值之一,脚本可以在需要更严格控制允许的值和操作的计算和逻辑中使用这些值。向参数提供枚举成员列表 以指定用户可以从下拉列表中选择的成员。如果没有指定枚举字段的标题,则其标题是其名称的“字符串”表示形式options

此示例声明了一个SignalType枚举,其中四个字段代表命名信号显示模式:longshortbothnone。脚本使用此 枚举类型的成员作为input.enum()defval调用中的参数 ,在“输入”选项卡中生成一个下拉列表,允许用户选择枚举的标题之一来控制它在图表上显示哪些信号:

图像

//@version=5
indicator("Enum input demo", overlay = true)

//@enum         An enumeration of named values representing signal display modes.
//@field long   Named value to specify that only long signals are allowed.
//@field short  Named value to specify that only short signals are allowed.
//@field both   Named value to specify that either signal type is allowed.
//@field none   Named value to specify that no signals are allowed. 
enum SignalType
    long  = "Only long signals"
    short = "Only short signals"
    both  = "Long and short signals"
    none 

//@variable An enumerator (member) of the `SignalType` enum. Controls the script's signals. 
SignalType sigInput = input.enum(SignalType.long, "Signal type")

// Calculate moving averages.
float ma1 = ta.sma(ohlc4, 10)
float ma2 = ta.sma(ohlc4, 200)
// Calculate cross signals. 
bool longCross  = ta.crossover(close, math.max(ma1, ma2))
bool shortCross = ta.crossunder(close, math.min(ma1, ma2))
// Calculate long and short signals based on the selected `sigInput` value.
bool longSignal = (sigInput == SignalType.long or sigInput == SignalType.both) and longCross
bool shortSignal = (sigInput == SignalType.short or sigInput == SignalType.both) and shortCross

// Plot shapes for the `longSignal` and `shortSignal`.
plotshape(longSignal, "Long signal", shape.triangleup, location.belowbar, color.teal, size = size.normal)
plotshape(shortSignal, "Short signal", shape.triangledown, location.abovebar, color.maroon, size = size.normal)
// Plot the moving averages.
plot(ma1, "Fast MA")
plot(ma2, "Slow MA") 

注意:

  • sigInput值是SignalType字段包含所选标题的成员。
  • 由于我们没有为none枚举字段指定标题,因此它的标题是其名称的“字符串”表示形式(“无”),如我们在上图的枚举输入下拉列表中看到的那样。

默认情况下,枚举输入会在其下拉列表中显示枚举所有成员的标题。如果我们optionsinput.enum() 调用提供一个参数,它将仅允许用户选择该列表中包含的成员,例如:

SignalType sigInput = input.enum(SignalType.long, "Signal type", options = [SignalType.long, SignalType.short])

上述参数指定用户只能查看和选择枚举中的字段options的标题 。不允许使用其他选项:longshortSignalType

图像

影响输入的其他功能

indicator()strategies()函数的一些参数 会用附加输入填充脚本的“设置/输入”选项卡。这些参数是timeframetimeframe_gapscalc_bars_count。例如:

//@version=5
indicator("MA", "", true, timeframe = "D", timeframe_gaps = false)
plot(ta.vwma(close, 10))

图像

提示

脚本输入的设计对脚本的可用性有重要影响。设计良好的输入更直观易用,并能带来更好的用户体验:

  • 选择清晰简洁的标签(您的输入的title论点)。
  • 谨慎选择您的默认值。
  • 提供minvalmaxval值以防止您的代码产生意外结果,例如,将长度的最小值限制为 1 或 2,具体取决于您使用的 MA 类型。
  • 提供step与要捕获的值一致的值。例如,在 0-200 范围内,步长为 5 可能更有用,在 0.0-1.0 范围内,步长为 0.05 可能更有用。
  • 将相关输入分组在同一行上inline;例如牛市和熊市的颜色,或线的宽度和颜色。
  • 当您有许多输入时,使用 将它们分组为有意义的部分 group。将最重要的部分放在顶部。
  • 对部分内的各个输入执行相同操作

input.*()在代码中垂直对齐多个调用的不同参数会非常有利。当您需要进行全局更改时,这将允许您使用编辑器的多光标功能同时对所有行进行操作。

因为有时需要使用 Unicode 空格来实现输入的最佳对齐。这是一个例子:

//@version=5
indicator("Aligned inputs", "", true)

var GRP1 = "Not aligned"
ma1SourceInput   = input(close, "MA source",     inline = "11", group = GRP1)
ma1LengthInput   = input(close, "Length",        inline = "11", group = GRP1)
long1SourceInput = input(close, "Signal source", inline = "12", group = GRP1)
long1LengthInput = input(close, "Length",        inline = "12", group = GRP1)

var GRP2 = "Aligned"
// The three spaces after "MA source" are Unicode EN spaces (U+2002).
ma2SourceInput   = input(close, "MA source   ",  inline = "21", group = GRP2)
ma2LengthInput   = input(close, "Length",        inline = "21", group = GRP2)
long2SourceInput = input(close, "Signal source", inline = "22", group = GRP2)
long2LengthInput = input(close, "Length",        inline = "22", group = GRP2)

plot(ta.vwma(close, 10))

图像

注意:

  • 我们使用group参数来区分两部分输入。我们使用一个常量来保存组的名称。这样,如果我们决定更改组的名称,我们只需要在一个地方更改它。
  • 第一部分输入小部件未垂直对齐。我们使用inline,将输入小部件放置在标签的右侧。由于ma1SourceInputlong1SourceInput输入的标签长度​​不同,因此标签位于不同的y位置。
  • 为了弥补错位,我们title在行中用三个 Unicode EN 空格 (U+2002) 填充参数 。Unicode 空格是必需的,因为普通空格会从标签中剥离。您可以通过组合不同数量和类型的 Unicode 空格来实现精确对齐。请参阅此处查看不同宽度的Unicode 空格ma2SourceInput列表 。
Original text
Rate this translation
Your feedback will be used to help improve Google Translate