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

Pine Script(107):syminfo.pointvalue点值与tick价值计算

#Pine Script入门教学

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.pointvaluestrategy.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价值。
赞(0)
未经允许不得转载:图道交易 » Pine Script(107):syminfo.pointvalue点值与tick价值计算
分享到

评论 抢沙发

登录

找回密码

注册