保持敬畏之心
交易是一场持久战

Pine Script(105):syminfo.mintick最小变动价位,tick输入选项实战

#Pine Script入门教学

syminfo.mintick:获取品种的最小价格变动单位

Pine Script 的 syminfo.mintick 变量,会返回当前图表交易品种的 tick 大小

tick 大小(或称最小变动价位),是一个交易品种可能发生的最小价格变化量。换句话说,当一个品种的价格波动时,其变动的幅度总是至少一个tick的整数倍。

股票的 tick 大小通常是一美分 (0.01)。大多数现货外汇品种以 0.00001 为单位进行交易。E-mini标普500指数期货的 tick 大小为0.25,而欧洲斯托克50指数期货则为0.5。


syminfo.mintick 在不同品种上的返回值

下表展示了 syminfo.mintick 变量针对不同 TradingView 交易品种所返回的值:

交易代码 (Symbol) 品种名称 (Instrument name) syminfo.mintick 返回值
EURONEXT:AD Ahold Delhaize (荷兰阿霍德德尔海兹集团) 0.01
COINBASE:BTCUSD 比特币 / 美元 0.01
CME_MINI:NQM2021 E-mini 纳斯达克100指数期货 – 2021年6月到期 0.25
CME_MINI:ESU2020 E-mini 标普500指数期货 – 2020年9月到期 0.25
FX:EURUSD 欧元/美元 (现货) 0.00001
SAXO:EURJPY 欧元/日元 0.001
OANDA:EU50EUR 欧洲50指数 CFD 0.1
INDEX:SX5E 欧洲斯托克50指数 0.01
EUREX:FESX1! 欧洲斯托克50指数连续期货 1
HKEX:HSIN2020 恒生指数期货 – 2020年7月到期 1
NASDAQ:QQQ Invesco QQQ 信托基金 (纳指100ETF) 0.01
NYMEX:CL1! 轻质原油期货 – 连续期货 0.01
CME_MINI:MESZ2020 微型E-mini标普500指数期货 – 2020年12月到期 0.25
NASDAQ:MSFT Microsoft Corporation (微软公司) 0.01
FX:SPX500 标普500指数 FXCM CFD 0.01
AMEX:SPY SPDR 标普500 ETF 0.01
NSE:TATASTEEL Tata Steel Ltd (塔塔钢铁有限公司) 0.05
CBOE:VIX 波动率标普500指数 (恐慌指数) 0.01
HITBTC:XRPBTC XRP / 比特币 0.000000001

完整示例脚本

下面的这个简短指标,会通过一个文本标签在图表上显示当前品种的 tick 大小:

//@version=5
indicator(title="Show 'syminfo.mintick' on chart", overlay=true)

// 在最后一根已确认的历史K线上,显示该品种的
// 最小可能价格变动单位
if barstate.islastconfirmedhistory
    label.new(x=bar_index + 1, y=hl2, style=label.style_label_left,
         color=color.aqua, textcolor=color.white, size=size.large,
         text=syminfo.ticker + " has a tick size of\n" + 
             str.tostring(syminfo.mintick))

代码解析

脚本首先使用 indicator() 函数来定义其设置。这行代码为脚本命名,并将其叠加显示在主图的交易品种上。

然后,一个 if 语句判断 barstate.islastconfirmedhistory 的值。该变量只在图表的最后一根已确认的历史K线上才为 true。当脚本运行到该K线时,我们使用 label.new() 函数来创建一个新的文本标签。

这个标签被显示在最后一根历史K线的中点价格 (hl2) 处,并向右移动一根K线 (bar_index + 1) 的位置。标签的箭头指向左边 (label.style_label_left),并拥有一个水蓝色 (color.aqua) 的背景和白色的文字。

标签的文本内容由几个字符串片段拼接而成。其中,syminfo.ticker 变量用于包含品种的交易代码。然后是一个描述性的文本,最后是我们通过 syminfo.mintick 变量获取的品种tick大小。

因为 syminfo.mintick 变量返回的是一个数字,我们需要先用 str.tostring() 函数将其转换为文本值,这样它才能与其他字符串片段正确地拼接在一起。

当我们在一个E-mini标普500指数期货图表上运行这个指标时,它会告诉我们该品种的tick大小是0.25:

如果我们切换到一个不同的交易品种,标签内容也会相应地更新。这里,它显示了 EURUSD 货币对的tick大小是0.00001:

如何应用 syminfo.mintick

我们可以通过多种方式来应用 syminfo.mintick,包括:

  • 计算订单价格:基于指定数量的tick来计算止盈或止损订单的具体价格。
  • 计算价格距离:通过将一个价格差除以tick大小,来确定这个价格距离相当于多少个tick。然后,我们可以将这个计算出的tick数与 strategy.exit() 函数结合使用,来提交一个基于tick的止损或止盈订单。
  • 计算品种的tick价值:通过将tick大小 (syminfo.mintick) 与该品种的点值 (syminfo.pointvalue) 相乘,可以得出该品种每波动一个tick所代表的货币价值
  • 获取任何品种的tick大小:当我们将 syminfo.mintickrequest.security() 函数结合使用时,可以在后台加载并获取任何其他品种的tick大小。

大多数时候,我们直接使用 syminfo.mintick 的原始值即可。但对于外汇货币对,我们常常需要将其返回值乘以 10。这样,我们处理的就是完整的点 (pip),而不是通常所说的“步”或小数点的点。


syminfo.mintick 的特性

  • 我们无法通过代码改变一个品种的tick大小,这是由 TradingView 为我们预先配置好的。
  • 我们可以在指标 (study) 和策略脚本中使用 syminfo.mintick,并且这个变量对于 TradingView 提供的每一个交易品种都可用。
  • 虽然我们可以对 syminfo.mintick 使用历史引用运算符 ([]) 来获取之前K线上的值,但这没有太大意义,因为该变量在每一根K线上的值都是相同的。
  • 这个变量在 Pine Script 第3版及更早版本 中也同样可用。

内容总结

  • syminfo.mintick 变量返回一个交易品种的 tick 大小,即其最小可能的价格变动单位
  • 当一个交易品种的价格发生变化时,其变动的幅度总是至少一个tick的整数倍。
  • 大多数股票的tick大小是0.01,E-mini标普500指数期货是0.25,而大多数外汇货币对则是0.00001。

如何制作基于tick的输入选项

我们知道,tick 大小 (tick size) 指的是一个交易品种最小的可能价格变化。当我们的脚本需要处理以“tick”为单位的数值时,我们既可以在代码中硬编码这个数量,也可以通过一个输入选项来灵活设定。

一个能够配置tick数量的输入选项,使用起来要方便得多。我们的脚本可以在多种场景下应用这样的输入。例如,可以将其用作突破过滤器(仅当价格突破了特定数量的tick时才进行交易),或者用作止损偏移量、止盈目标距离等。

要创建一个基于tick的输入,通常需要以下两个步骤:

  1. 创建并准备输入项
    • 创建一个整数输入框,用于设定tick的数量。
    • 将这个输入值与 syminfo.mintick 变量相乘,从而将tick数量转换成该品种价格坐标上等效的数值。
  2. 在脚本中使用该值:在代码中需要处理tick数量的地方,使用上一步计算出的结果。

接下来,让我们看看具体的代码实现!


第一步:创建Tick输入项

首先,我们创建一个用于设置tick数量的输入框。然后,我们将它的值转换成对应的价格变化量。

这一步的代码如下:

// 步骤 1. 创建一个指定tick数量的输入项。
// 然后将其值与 syminfo.mintick 相乘,
// 从而将tick数量转换为该品种的价格标度。
tickOffsetInput = input.int(1, title="Ticks Offset", minval=0) * syminfo.mintick

代码解析

这里,input.int() 函数创建了一个整数类型的输入选项。它的默认值为 1title 参数将该输入命名为 ‘Ticks Offset’ (Tick偏移量)。通过 minval 参数,我们为该输入设置了最小值 0

现在,我们有了一个可以指定使用多少tick的输入框。但这个数量本身还不能直接用于代码中的价格计算。为此,我们需要将这个tick数量,转换成该品种价格坐标上等效的数值。

要实现这一点,我们将 input.int() 的返回值与 syminfo.mintick 变量相乘。syminfo.mintick 变量返回的是该品种的最小可能价格变化量。当它与我们设定的tick数量相乘时,我们就能得到这个tick数量所对应的具体价格值。我们将这个计算结果储存在 tickOffsetInput 变量中,以备后用。

举个例子 :以E-mini标普500 (ES) 期货为例,它的 tick 大小是 0.25。当我们把输入框的值设为 4 时,我们的代码实际应该用 4 * 0.25,即 1.00 这个价格值来进行计算。

我们在这一步中创建的输入框,在设置面板中看起来是这样的:

现在,让我们在脚本代码中使用这个输入项。


第二步:在代码中使用输入值

现在,我们在脚本中应用这个基于tick的输入项。具体用在何处,取决于哪部分代码需要用到这个tick数量。

假设我们想寻找对前期高点和低点的突破,但前提是价格必须有效穿越高/低点一定数量的tick。实现这个目的的一种方法是:

// 步骤 2. 在代码中使用以tick为单位的价格偏移量。
// 这里我们检查最高价是否超过前期高点指定的tick数,
// 以及最低价是否低于前期低点指定的tick数。
highBreakout = high > ta.highest(high, 20) + tickOffsetInput
lowBreakout  = low < ta.lowest(low, 20) - tickOffsetInput

代码解析

首先,我们使用 ta.highest() 函数计算出前20根K线的最高高点,并使用 ta.lowest() 函数得到前20根K线的最低低点。

然后我们判断突破:

  • 向上突破 (highBreakout):当K线的最高价,高于“前期最高高点 + 我们基于tick计算出的价格偏移量 (tickOffsetInput)”时,向上突破条件成立,highBreakout 变量为 true(否则为 false)。
  • 向下突破 (lowBreakout):当K线的最低价,低于“前期最低低点 – 我们设定的价格偏移量”时,向下突破条件成立,lowBreakout 变量为 true(否则为 false)。

现在,脚本的其他部分就可以根据 highBreakoutlowBreakout 这两个布尔变量来执行相应的操作了。例如,我们可以为突破K线的背景上色、生成警报,或模拟交易。


完整示例脚本

让我们通过一个完整的脚本来看看如何应用基于tick的输入。下方的指标会为向上或向下突破前期高/低点的K线,用不同的背景色进行高亮。而“有效突破”所需要穿越的tick数量,则由输入项来配置。

该指标的完整代码如下:

//@version=5
indicator(title="Tick-based input example", overlay=true)

// 步骤 1. 创建一个指定tick数量的输入项。
// 然后将其值与 syminfo.mintick 相乘,
// 从而将tick数量转换为该品种的价格标度。
tickOffsetInput = input.int(1, title="Ticks Offset", minval=0) * syminfo.mintick

// 计算并绘制前期高点和低点
highestHigh = ta.highest(high, 20)
lowestLow   = ta.lowest(low, 20)
plot(highestHigh, color=color.green, title="Highest High")
plot(lowestLow, color=color.red, title="Lowest Low")

// 步骤 2. 在代码中使用以tick为单位的价格偏移量。
// 这里我们检查最高价是否超过前期高点指定的tick数,
// 以及最低价是否低于前期低点指定的tick数。
highBreakout = high > highestHigh + tickOffsetInput
lowBreakout  = low < lowestLow - tickOffsetInput

// 判断并应用针对向上和向下突破的背景颜色
backgroundColour = if highBreakout
    color.new(color.green, 85)
else if lowBreakout
    color.new(color.red, 85)
bgcolor(backgroundColour, title="Breakout Signals")

代码解析

我们首先使用 indicator() 函数来配置指标,这行代码为脚本命名,并将其叠加显示在主图的交易品种上。

然后,我们创建了上文讨论过的基于tick的输入项。

接下来,我们使用 ta.highest() 函数计算前期最高高点,并使用 ta.lowest() 函数得到前期最低低点。

我们让 plot() 函数分别用绿色 (color.green) 和红色 (color.red) 在图表上将这两个值绘制成线。由于我们没有设置绘图类型,Pine Script 会默认创建常规的线图。

然后,我们判断突破信号。这采用了与前面例子相同的方法。向上突破要求价格必须超过前期高点我们设定的tick数量。而向下突破则要求价格跌破前期低点我们设定的tick数量。

接着,一个级联的 if 语句用于决定背景颜色。对于向上突破,我们使用通过 color.new() 函数设置了85%透明度的绿色。如果发生向下突破,我们则使用85%透明度的红色。

最后一行代码调用 bgcolor() 函数,将我们决定的背景色应用到图表上。

在图表上,该指标的tick输入项默认值为 1。这要求价格必须额外移动一个tick才算有效突破。生成的信号看起来是这样的:

当我们将‘Ticks Offset’输入选项的值从 1 改为 6 时,价格需要额外移动5个tick才能被视为有效突破。这会大大减少信号的产生数量:


内容总结

要创建一个基于tick的输入项,我们通常遵循以下步骤:

  1. 创建整数输入:首先,使用 input.int() 函数创建一个整数类型的输入选项,让用户可以设定tick的数量。
  2. 转换为价格值:接着,我们将这个输入值与 syminfo.mintick 变量相乘,从而将tick数量转换成一个具体的价格变化值。
  3. 在代码中使用:最后,我们在脚本中需要用到这个价格偏移量的地方,使用上一步计算出的结果。

获取任意品种的最小变动价位

一个 TradingView 指标或策略,可以通过 syminfo.mintick 变量获取当前图表交易品种的 tick 大小。但如果我们想在代码中使用另一个不同品种的 tick 大小呢?

我们可以通过 request.security() 函数来实现。这个函数可以在后台为任何交易品种加载数据。当我们向它请求 syminfo.mintick 变量时,它便会为我们指定的任何品种返回其 tick 大小。


自定义函数:获取任意品种的Tick大小

下面的这个自定义函数,可以通过 request.security() 获取任意交易品种的 tick 大小:

// GetTickSize() 函数以非重绘的方式,返回通过'security'函数
// 加载的、指定品种的tick大小(mintick)值。
GetTickSize(symbol) =>
    request.security(symbol, "D", syminfo.mintick[1], 
         lookahead=barmerge.lookahead_on)

这个 GetTickSize() 函数有一个参数:symbol,即我们想要获取其 tick 大小的那个品种的交易代码。

在函数内部,request.security() 函数为该交易代码加载日线 ("D") 数据。我们请求的数据正是 syminfo.mintick 这个返回 tick 大小的品种变量

为了防止所谓的“重绘”问题(即信号在K线内闪烁或在历史K线上后移),我们在请求时启用了 barmerge.lookahead_on,将另一个品种的数据系列与当前图表的K线开盘时间进行同步。好在 tick 大小本身是个固定属性,每根K线上都一样,所以这里不存在未来数据泄露的风险。

我们可以这样来使用这个自定义函数:

// 获取E-mini标普500指数期货的tick大小
esTickSize = GetTickSize("ES1!")

// 获取BTC/USD的tick大小
btcTickSize = GetTickSize("COINBASE:BTCUSD")

完整示例脚本

下面我们来看一下如何在一个完整的 TradingView 脚本中应用上面的函数:

//@version=5
indicator(title="Get tick size of any instrument", overlay=true)

// 创建一个输入框,用以选择我们想获取其tick大小的品种
symbol = input.symbol("CME_MINI:ES1!", title="Symbol")

// GetTickSize() 函数以非重绘的方式,返回通过'security'函数
// 加载的、指定品种的tick大小(mintick)值。
GetTickSize(symbol) =>
    request.security(symbol, "D", syminfo.mintick[1], 
         lookahead=barmerge.lookahead_on)

// 获取指定品种的tick大小
tickSizeSymbol = GetTickSize(symbol)

// 在图表的最后一根历史K线上,创建一个标签
// 用以输出该品种的tick大小
if barstate.islastconfirmedhistory
    label.new(x=bar_index + 1, y=close, style=label.style_label_left,
         color=color.black, textcolor=color.white, size=size.large,
         text="Tick size of " + symbol + " is:\n" +
             str.tostring(tickSizeSymbol))

代码解析

这个指标首先使用 indicator() 函数来配置其设置。这行代码为脚本命名,并将其叠加显示在主图的交易品种上。

然后,我们使用 Pine Script 的 input.symbol() 函数创建了一个品种搜索框。这个名为‘Symbol’的输入项,让我们能方便地选择想要查询其 tick 大小的品种。它的默认值是E-mini标普500指数期货 ("CME_MINI:ES1!")。

接下来,我们包含了上文讨论过的 GetTickSize() 自定义函数。

之后,我们创建了 tickSizeSymbol 变量,并将其值设为 GetTickSize() 函数的返回值。我们向该函数内部传入了 symbol 这个输入变量,这使得函数能够获取用户在输入框中设定的那个品种的 tick 大小。

随后,一个 if 语句检查 barstate.islastconfirmedhistory。该变量只在图表的最后一根已确认的历史K线上才为 true。在这根K线上,我们使用 label.new() 函数来创建一个新的文本标签。

这个标签被显示在K线的收盘价 (close) 处,并向右偏移一根K线 (bar_index + 1) 的位置。它的箭头指向左边 (label.style_label_left),并拥有一个黑色 (color.black) 的背景和白色 (color.white) 的文字。

标签的文本内容,通过加号 (+) 运算符,将 symbol 输入变量和其 tick 大小 (tickSizeSymbol) 拼接在了一起。由于后者是一个数值,我们使用 str.tostring() 函数将其转换为字符串,以便与其他文本片段兼容。

当我们将该指标添加到图表时,它默认会显示E-mini标普500指数期货的 tick 大小:

如果我们把‘Symbol’这个自定义输入项的值改成另一个品种,标签的内容也会相应地更新。例如,这里我们选择了微软 (MSFT) 作为要查询其 tick 大小的品种:

赞(0)
未经允许不得转载:图道交易 » Pine Script(105):syminfo.mintick最小变动价位,tick输入选项实战
分享到

评论 抢沙发

登录

找回密码

注册