syminfo.pointvalue:获取品种的点值
Pine Script 的 syminfo.pointvalue 变量,会以数值形式返回当前交易品种的点值 (point value)。
点值,指的是一个交易品种的价格每变动1个完整点位时,所对应的货币价值。
不同的交易品种有不同的点值。例如,当一支在纽约证券交易所上市的股票价格从213.84变动一个点到212.84时,这次价格变动对应的价值是1美元。但如果E-mini标普500指数期货上涨或下跌一个点,这次价格变动对应的价值则是50美元。
与标的资产的关联
点值的大小与该品种的标的资产密切相关。当我们交易1股苹果股票时,其点值为1,因为我们的风险敞口就是这一股股票的价值。
然而,E-mini标普500指数期货的点值为50。这是因为一份ES期货合约代表了50倍的标普500指数价值。同理,一份原油期货的点值为1000,因为一份CL期货合约的标的资产是1000桶原油。
syminfo.pointvalue 在不同品种上的返回值
下表展示了 Pine Script 的 syminfo.pointvalue 变量针对不同 TradingView 交易品种所返回的值:
| 交易代码 (Symbol) | 品种名称 (Instrument name) | syminfo.pointvalue 返回值 |
|---|---|---|
| EURONEXT:AD | Ahold Delhaize (荷兰阿霍德德尔海兹集团) | 1 |
| COINBASE:BTCUSD | 比特币 / 美元 | 1 |
| CME_MINI:NQM2021 | E-mini 纳斯达克100指数期货 – 2021年6月到期 | 20 |
| CME_MINI:ESU2020 | E-mini 标普500指数期货 – 2020年9月到期 | 50 |
| FX:EURUSD | 欧元/美元 (现货) | 1 |
| SAXO:EURJPY | 欧元/日元 | 1 |
| OANDA:EU50EUR | 欧洲50指数 CFD | 1 |
| INDEX:SX5E | 欧洲斯托克50指数 | 1 |
| EUREX:FESX1! | 欧洲斯托克50指数连续期货 | 10 |
| HKEX:HSIN2020 | 恒生指数期货 – 2020年7月到期 | 50 |
| NASDAQ:QQQ | Invesco QQQ 信托基金 (纳指100ETF) | 1 |
| NYMEX:CL1! | 轻质原油期货 – 连续期货 | 1000 |
| CME_MINI:MESZ2020 | 微型E-mini标普500指数期货 – 2020年12月到期 | 5 |
| NASDAQ:MSFT | Microsoft Corporation (微软公司) | 1 |
| FX:SPX500 | 标普500指数 FXCM CFD | 10 |
| AMEX:SPY | SPDR 标普500 ETF | 1 |
| NSE:TATASTEEL | Tata Steel Ltd (塔塔钢铁有限公司) | 1 |
| CBOE:VIX | 波动率标普500指数 (恐慌指数) | 1 |
| HITBTC:XRPBTC | XRP / 比特币 | 1 |
完整示例脚本
下面的这个指标会在图表上显示当前品种的点值:
//@version=5
indicator(title="Show 'syminfo.pointvalue' on chart", overlay=true)
// 在最后一根已确认的历史K线上,创建一个文本标签来显示
// 该品种的点值(即1点价格变动所对应的货币价值)
if barstate.islastconfirmedhistory
label.new(x=bar_index, y=high, style=label.style_label_down,
color=color.new(color.green, 70), size=size.large,
text=syminfo.ticker + " has a point value of:\n"
+ syminfo.currency + " " + str.tostring(syminfo.pointvalue))
代码解析
脚本首先使用 indicator() 函数来配置其设置。这行代码为指标命名,并将其叠加显示在主图的交易品种上。
然后,一个 if 语句检查 barstate.islastconfirmedhistory。该变量只在图表的最后一根已确认的历史K线上才为 true。在这根K线上,我们使用 label.new() 函数来创建一个新的文本标签。
这个标签被显示在那根K线的编号 (bar_index) 和最高价 (high) 的位置。它的箭头指向下方 (label.style_label_down),并以一个通过 color.new() 函数制作的透明绿色背景显示。
标签的文本内容包含几部分信息。首先,我们通过 syminfo.ticker 包含了品种的交易代码。然后,通过 syminfo.currency 包含了品种的货币单位。最后,通过 syminfo.pointvalue 包含了该品种的点值。
由于后一个变量返回的是一个数字,而不是文本,我们需要使用 str.tostring() 函数将其转换为文本字符串。
当我们在一个 FDAX 图表(德国DAX指数期货)上运行这个指标时,可以看到价格每变动1个点,等同于25欧元:
其他品种则有不同的点值。例如,Alphabet(谷歌)的股票,价格每完整变动一个点,其价值相应变动1.00美元:
如何应用 syminfo.pointvalue
TradingView 脚本可以通过多种方式应用 syminfo.pointvalue,例如:
- 换算价格距离:将一个以货币金额表示的止损或止盈目标,转换成所需的价格移动距离(通过除以
syminfo.pointvalue实现)。 - 头寸规模计算:在进行风险管理和头寸规模计算时,将品种的合约大小(即点值)考虑在内。
- 计算Tick价值:计算出该品种的 tick 价值,即最小价格变动单位所对应的货币价值。同理,我们也可以计算其他价格指标的货币价值,例如将 ATR 的值转换成对应的货币金额。
- 区分不同品种:
syminfo.pointvalue变量本身的值也很有用。例如,我们可能希望对那些带杠杆的品种(其点值大于1)应用不同的止损规则。
syminfo.pointvalue 的特性
syminfo.pointvalue的值是基于1个单位(例如1份合约、1股股票、1个交易单位或1手)来计算的,它不考虑你的实际头寸大小。要计算你当前持仓每波动1个点位所对应的盈亏变化,需要将syminfo.pointvalue与strategy.position_size变量相乘。syminfo.pointvalue不考虑你的经纪商所提供的杠杆倍数。虽然大多数外汇货币对的点值为1,但实际的外汇交易大多是在高于1倍杠杆的情况下进行的。syminfo.pointvalue变量可用于指标 (studies) 和策略脚本。此外,这个变量对于 TradingView 提供的每一个交易品种都可用。syminfo.pointvalue在 Pine Script 第3版及更早版本 中也同样可用,并且在那些早期版本中,该变量的行为方式与现在相同。
内容总结
- Pine Script 的
syminfo.pointvalue变量,返回一个交易品种价格每变动1个完整点位所对应的货币价值。 - 大多数品种,如股票,其点值为1。而期货和一些差价合约 (CFD) 则拥有更高的点值。
- 该品种的点值,不包含你经纪商所提供的保证金(杠杆)因素。
计算品种的tick价值
在交易中,Tick价值 (tick value) 指的是一个交易品种最小可能价格变动所对应的货币金额。当一个品种的价格波动时,我们的盈亏变化总是至少一个tick价值的整数倍。
Tick价值不同于 Tick大小 (tick size),后者指的是一个品种最小的可能价格变化量(不包含货币成分)。
在 Pine Script 中,有两种方式可以获取一个品种的tick价值:我们可以获取当前图表品种的tick价值,或者获取任意 TradingView 品种的该值。接下来我们分别看看如何实现。
获取当前图表品种的Tick价值
要获取一个品种的tick价值,我们需要结合使用两个品种数据变量:
syminfo.mintick:返回该品种的最小可能价格变化量(即tick大小)。syminfo.pointvalue:告诉我们价格每变动1个完整点位所对应的货币价值。
当我们将这两者相乘时,就能得到该品种的tick价值。
自定义函数
下面的这个自定义函数,用于计算当前图表品种的tick价值:
// GetTickValue() 函数返回该品种最小可能价格
// 变动所对应的货币价值。
GetTickValue() =>
syminfo.mintick * syminfo.pointvalue
GetTickValue() 函数将该品种的tick大小 (syminfo.mintick) 与其价格每完整变动一个点位的货币价值(我们通过 syminfo.pointvalue 变量获取)相乘。
其结果,就是价格每波动一个tick所对应的货币价值。
要使用该函数,我们只需在任何想使用该品种tick价值的地方调用它即可。例如:
// 计算要达到125货币单位的盈利目标,需要多少个tick。
// 使用 ceil() 向上取整,以确保我们能达到期望的盈利目标。
tickTarget = math.ceil(125 / GetTickValue())
// 也可以:将tick价值储存在一个变量中,以备后用。
tickValue = GetTickValue()
Tick价值示例
为了让你有个概念,下表显示了针对不同 TradingView 交易品种计算出的tick价值:
| 品种和交易代码 | syminfo.mintick 值 (tick大小) |
syminfo.pointvalue 值 |
Tick价值 (Tick Value) |
|---|---|---|---|
| E-mini S&P 500 future (ES1!) | 0.25 | 50 | 12.50 |
| U.S. Dollar / Canadian Dollar (USDCAD) | 0.00001 | 1 | 0.00001 |
| Crude Oil futures (CL1!) | 0.01 | 1000 | 10 |
| Micro E-mini S&P 500 future (MES1!) | 0.25 | 5 | 1.25 |
| EuroStoxx 50 futures (FESX1!) | 0.5 | 10 | 5 |
| NASDAQ 100 E-mini futures (NQ1!) | 0.25 | 20 | 5 |
| Euro FX futures (6E1!) | 0.00005 | 125000 | 6.25 |
| Bitcoin / U.S. Dollar (BTCUSD) | 0.01 | 1 | 0.01 |
| Ethereum / Tetherus (ETHUSDT) | 0.01 | 1 | 0.01 |
| Euro / U.S. Dollar (EURUSD) | 0.00001 | 1 | 0.00001 |
| Microsoft (MSFT) | 0.01 | 1 | 0.01 |
| SPDR S&P 500 ETF (SPY) | 0.01 | 1 | 0.01 |
完整示例脚本
下面我们来看一下如何在一个完整的 TradingView 脚本中应用 GetTickValue() 自定义函数:
//@version=5
indicator(title="Tick value of instrument", overlay=true)
// GetTickValue() 函数返回该品种最小可能价格
// 变动所对应的货币价值。
GetTickValue() =>
syminfo.mintick * syminfo.pointvalue
// 在最后一根已确认的历史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=syminfo.ticker + " has a tick value of:\n" +
syminfo.currency + " " + str.tostring(GetTickValue()))
代码解析
这个指标首先使用 indicator() 函数来配置其设置。这行代码为脚本命名,并将其叠加显示在主图的交易品种上。
然后,我们包含了上文讨论过的 GetTickValue() 自定义函数。
之后,一个 if 语句检查 barstate.islastconfirmedhistory 变量,该变量只在图表的最后一根已确认的历史K线上才为 true。
当脚本运行到该K线时,它会使用 label.new() 函数来创建一个新的文本标签。这个标签被显示在收盘价 (close) 处,并向右偏移一根K线 (bar_index + 1) 的位置。它的箭头指向左边 (label.style_label_left),并拥有一个黑色 (color.black) 的背景和白色 (color.white) 的文字。
标签的文本由几个用 + 运算符连接的字符串组成。首先是该品种的交易代码 (syminfo.ticker)。然后是一个描述性的文本,后面跟着该品种的货币单位 (syminfo.currency)。
最后,我们通过调用 GetTickValue() 函数来包含该品种的tick价值。由于该函数返回的是一个数字,我们需要使用 str.tostring() 函数将其转换为文本,以便与其他字符串片段兼容。
当我们在图表上添加这个指标时,它会显示该品种的tick价值。例如,对于欧洲斯托克50指数期货,其tick价值是5欧元:
如果我们把图表切换到一个不同的交易品种,标签也会随之改变。例如,对于原油 (CL) 期货,它显示的tick价值是10美元:
获取任意品种的Tick价值
另一种方法是获取任意 TradingView 交易品种的tick价值。我们通过在后台为另一个品种加载数据来实现这一点。接下来我们看看如何操作。
自定义函数
下面的这个自定义函数,能够返回任意 TradingView 交易品种的tick价值:
// GetTickValueSymbol() 函数以非重绘的方式,返回通过'security'函数
// 加载的、指定品种的tick价值(即最小可能价格变动所对应的货币价值)。
GetTickValueSymbol(symbol) =>
request.security(symbol, "D", (syminfo.mintick * syminfo.pointvalue),
lookahead=barmerge.lookahead_on)
这个自定义的 GetTickValueSymbol() 函数接受一个参数:symbol。这个字符串用于指定我们想要获取其tick价值的那个品种。
在函数内部,我们使用 request.security() 函数来加载该品种的数据。我们在这里指定了几个东西:首先是 symbol,它告诉 request.security() 要加载哪个品种。通过 "D",我们指定从日线时间周期获取该品种的数据。
我们想从那个品种获取的数据,是它的tick大小 (syminfo.mintick) 与其点值 (syminfo.pointvalue) 的乘积,这个结果就是该品种的tick价值。
为了防止 request.security() 产生所谓的“重绘”效应,我们在请求时启用了 barmerge.lookahead_on,将日线时间周期的K线与当前图表K线的开盘时间进行同步。由于tick价值是品种的固定属性,每根K线上都相同,这里不会引入未来数据。
要使用这个函数,我们只需传入我们想知道其tick价值的品种代码即可。例如:
// 获取E-mini标普500指数期货的tick价值
tickValueES = GetTickValueSymbol("ES1!")
// 获取原油期货的tick价值
tickValueCL = GetTickValueSymbol("NYMEX:CL1!")
完整示例脚本
下面的指标展示了我们如何在一个完整的脚本中应用 GetTickValueSymbol() 自定义函数:
//@version=5
indicator(title="Get tick value of any instrument", overlay=true)
// 创建一个输入框,用以选择我们想获取其tick价值的品种
symbol = input.symbol("CME_MINI:ES1!", title="Symbol")
// GetTickValueSymbol() 函数以非重绘的方式,返回通过'security'函数
// 加载的、指定品种的tick价值。
GetTickValueSymbol(symbol) =>
request.security(symbol, "D", (syminfo.mintick * syminfo.pointvalue),
lookahead=barmerge.lookahead_on)
// 在每根K线上获取另一个品种的tick价值(为保证计算一致性)
tickValueSymbol = GetTickValueSymbol(symbol)
// 在最后一根已确认的历史K线上,创建一个标签来显示
// 指定品种的tick价值
if barstate.islastconfirmedhistory
label.new(x=bar_index, y=close, style=label.style_label_left,
color=color.black, textcolor=color.white, size=size.large,
text="Tick value of\n" + symbol +
" is " + str.tostring(tickValueSymbol))
代码解析
这个指标首先使用 indicator() 函数来配置其设置,这行为脚本命名并将其叠加显示在主图的交易品种上。
然后,我们使用 input.symbol() 函数创建了一个交易品种输入框。这个我们简单命名为‘Symbol’的选项,让我们能方便地选择想要查询其tick价值的品种。它的默认值是E-mini标普500指数期货 ("CME_MINI:ES1!")。
接下来,我们包含了前面讨论过的 GetTickValueSymbol() 自定义函数。
然后就是时候使用这个函数了。我们创建 tickValueSymbol 变量,并将其值设为 GetTickValueSymbol() 函数的返回值。该函数的参数是 symbol 这个输入变量,这使得它能够使用我们在输入选项中指定的任何品种。
接着,一个 if 语句检查 barstate.islastconfirmedhistory。该变量只在图表的最后一根已确认的历史K线上才为 true。当脚本运行到该K线时,它会使用 label.new() 函数来创建一个新的文本标签。
这个标签被显示在最后一根K线的收盘价处 (bar_index, close)。它的箭头指向左边 (label.style_label_left),并拥有一个黑色 (color.black) 的背景。文字以白色 (color.white) 显示,并设为大号字体 (size.large)。
标签的文本由几个字符串拼接而成。我们包含了 symbol 变量,以显示输入的是哪个品种的货币价值。然后插入 tickValueSymbol 的值。由于该变量是一个数字,我们首先用 str.tostring() 函数将其转换为字符串。
当我们在图表上添加这个指标时,它默认会显示E-mini标普500指数期货的tick价值:
如果我们把脚本的‘Symbol’输入选项改成一个不同的品种,例如CME的欧元/美元(6E)期货,脚本会相应地更新标签:
内容总结
- 一个交易品种的tick价值,指的是其最小价格变动单位所对应的货币价值。
- tick价值告诉我们,对于单个股票或一份合约,当其价格变动一个tick时,我们的盈亏会变化多少。
- 我们在 Pine Script 中,通过将
syminfo.mintick变量(tick大小)与syminfo.pointvalue变量(点值)相乘,来计算tick价值。








