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

Pine Script(104):syminfo.prefix与syminfo.root,交易所前缀与期货根代码

#Pine Script入门教学

syminfo.prefix:获取品种的交易所与数据源前缀

Pine Script 的 syminfo.prefix 变量,会返回当前图表交易品种的交易所、经纪商或数据源的前缀

例如,对于在 Coinbase 交易所交易的 BTCUSD 加密货币,syminfo.prefix 会返回 "COINBASE"。而对于 CME 的 E-mini 标普500指数期货,该变量则会返回 "CME_MINI"


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

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

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

重点提示

对于使用延迟价格数据的品种,syminfo.prefix 的值会以 "DL""DLY" 结尾。从上表中我们可以看到,我个人没有订阅期货和泛欧交易所股票的实时数据。

另外需要澄清的是,上表中的双引号 (") 只是为了表明该变量返回的是一个字符串值,引号本身并非该变量值的一部分。因此,当我们在文本标签中包含 syminfo.prefix 时,它不会被引号包围。


syminfo.prefix 并不总是匹配你请求的交易代码

syminfo.prefix 变量告诉我们图表当前正在使用哪个数据源。但这个数据源并不总是我们指定的那个交易所。

例如,当我们加载 NASDAQ:QQQ 但没有订阅美国市场的实时数据时,TradingView 会转而使用来自 BATS 交易所的数据。类似的情况也发生在延迟的期货数据上。

我们可以从上表中观察到这种行为,其中品种的交易所(第一列)并不总是与 TradingView 实际使用的数据源(第三列)相匹配。


prefix、ticker 与 tickerid 的比较

除了 syminfo.prefix,还有两个相关的品种变量可以提供关于品种代码的信息。这三个变量分别是:

  • syminfo.ticker:返回品种的交易代码,例如 "EURUSD""AAPL""ETHUSD"
  • syminfo.prefix:返回品种的交易所或数据源前缀,例如 "COINBASE""NASDAQ"
  • syminfo.tickerid:返回品种的唯一标识符,它将交易所(或数据源)与交易代码组合在一起,例如 "COINBASE:BTCUSD""KRAKEN:BTCUSD"

正如我们所见,每个变量都从不同角度描述了品种的代码信息。下表展示了它们对不同 TradingView 品种的返回值比较:

品种 syminfo.prefix 返回值 syminfo.ticker 返回值 syminfo.tickerid 返回值
比特币 / 美元 “COINBASE” “BTCUSD” “COINBASE:BTCUSD”
比特币 / 美元 “OANDA” “BTCUSD” “OANDA:BTCUSD”
以太坊 / 美元 “KRAKEN” “ETHUSD” “KRAKEN:ETHUSD”
微型E-mini标普500指数期货 “CME_MINI_DL” “MES1!” “CME_MINI_DL:MES1!”
欧元 / 美元 现货 (FXCM) “FX” “EURUSD” “FX:EURUSD”
纳斯达克100 ETF (Invesco QQQ Trust) “NASDAQ” “QQQ” “NASDAQ:QQQ”
黄金现货 / 美元 (IDC) “FX_IDC” “XAUUSD” “FX_IDC:XAUUSD”
苹果公司 “NASDAQ” “AAPL” “NASDAQ:AAPL”
DJ 欧洲斯托克50指数期货 “EUREX_DLY” “FESX1!” “EUREX_DLY:FESX1!”

完整示例脚本

下面的指标会在图表上显示当前品种的交易所(或数据源)信息:

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

// 在最后一根已确认的历史K线上,创建一个标签来显示
// 该品种交易代码的数据源前缀
if barstate.islastconfirmedhistory
    label.new(x=bar_index + 2, y=close, style=label.style_label_left,
         color=color.new(color.yellow, 80), size=size.large, 
         text=syminfo.ticker + " has this data" + 
             "\nsource/exchange prefix:\n" + syminfo.prefix)

代码解析

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

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

这个标签被定位在当前收盘价 (close) 处,并向右移动2根K线 (bar_index + 2) 的位置。它的箭头指向左边 (label.style_label_left),并以带有80%透明度的黄色 (color.yellow) 显示,这是通过 color.new() 函数实现的。

标签的文本由几个字符串拼接而成。第一个是该品种的交易代码,我们通过 syminfo.ticker 获取。然后是一个换行的文本,最后是 syminfo.prefix 变量,用以显示该品种的数据源。

当我们在一个 USDCAD 图表上添加这个指标时,我们可以看到该品种是在 FX 交易所交易的:

如果我们切换到一个不同的品种,标签也会随之改变。例如,当我们打开一个加密货币指数图表时,可以看到它的数据源是 CRYPTOCAP:


如何应用 syminfo.prefix

我们可以通过多种方式来应用 syminfo.prefix,例如:

  • 在信息中包含交易所名称。例如在警报消息和绘图对象(如表格和标签)中,明确指出数据来源。
  • 在脚本决策中作为判断依据。例如,当脚本在一个以性能不佳著称的加密货币交易所的品种上运行时,我们可以显示一个警告信息。
  • 与交易代码结合,加载其他品种数据request.security() 函数可以利用 syminfo.prefix + ":EURUSD" 这样的组合,来加载与当前图表使用相同数据源的 EUR/USD 数据。
  • 创建自定义交易代码。与 ticker.modify() 函数结合,创建一个自定义的交易代码字符串,然后通过 request.security() 函数来加载该代码的背景数据,这同样可以加载与当前图表在同一交易所交易的品种数据。

提示:要加载与当前图表完全相同的品种和交易所的背景数据,虽然我们可以组合 syminfo.tickersyminfo.prefix 变量,但更简单的方法是直接使用 syminfo.tickerid 变量。它本身就是这两者的组合,也是实现此目的的首选方式。


syminfo.prefix 的特性

  • 对于那些并非在(现货)交易所上市的品种,syminfo.prefix 会返回其数据源的缩写。一个典型的例子是来自 Quandl 的经济数据系列,对于这些数据,syminfo.prefix 可能会返回 "FRED"(代表美国联邦储备银行的数据)。
  • syminfo.prefix 返回的值本身是唯一的,因为 TradingView 不会有两个同名的交易所或数据源。但是,当然,多个不同的交易品种可以共享同一个交易所前缀。
  • 虽然我们可以对 syminfo.prefix 使用历史引用运算符 ([]),但这没有必要,因为该变量在每一根K线上返回的值都是相同的。
  • 我们无法获取图表当前品种之外的另一个品种的交易所信息。原因在于,用于在后台加载其他品种数据的 request.security() 函数,无法返回字符串类型的值,而 syminfo.prefix 正好就是一个字符串。
  • 每个 TradingView 指标 (study) 和策略脚本都可以使用 syminfo.prefix,并且这个变量对于 TradingView 提供的每一个交易品种都可用。
  • syminfo.prefix 变量在 Pine Script 第4版 以及第3版及更早版本 中也同样可用。

内容总结

  • Pine Script 的 syminfo.prefix 变量返回当前图表交易品种所使用的交易所或数据源前缀
  • syminfo.prefix 返回的值是 TradingView 实际用来制作图表的数据源,这并不总是与我们请求的交易所相同。在没有必要的数据订阅的情况下,TradingView 会从一个可用的替代交易所加载数据。

syminfo.root:获取衍生品的根代码

Pine Script 的 syminfo.root 变量以一段文本字符串的形式,返回当前图表交易品种的根代码 (root symbol)。

根代码是一个顶层的标识符,某一特定类型的所有金融衍生品都共享这个标识符。而衍生品 (derivative) 则是一种其价值基于(或衍生自)某种标的资产的金融产品,期货和期权都是常见的衍生品。

因此,通过 syminfo.root,我们可以获取某个特定期货品种所有不同到期月份合约所共用的那个根代码。例如,所有的E-mini标普500指数期货合约,无论何时到期,都拥有相同的根代码:"ES"。有了这个共同的“父级”代码,不同的合约便同属一个系列,尽管每个合约月份都有其自己独特的交易代码,例如 "ESM2022""ESU2022"

syminfo.root 变量会返回以下两种值之一:

  • 当交易品种是衍生品时,该变量返回该衍生品的根代码
  • 当交易品种不是衍生品时,syminfo.root 则简单地返回该品种自身的交易代码(这与 syminfo.ticker 变量返回的值相同)。

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

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

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

正如我们所见,对于非金融衍生品的品种,syminfo.root 返回的是该品种自身的交易代码。但对于衍生品,它则返回其根代码。

需要澄清的是,上表中的双引号 (") 只是为了表明该变量返回的是一个字符串值,引号本身并非该变量值的一部分。如果我们要在标签中使用 syminfo.root,是不会看到引号的。


完整示例脚本

这个简短的指标会在图表上显示当前品种的根代码:

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

// 在最后一根已确认的历史K线上,创建一个标签来显示
// 该品种的根代码
if barstate.islastconfirmedhistory
    label.new(x=bar_index, y=close, style=label.style_label_left,
         color=color.new(color.yellow, 70), size=size.large, 
         text=syminfo.ticker + " has this root symbol:\n" + syminfo.root)

代码解析

这个脚本首先调用 indicator() 函数来配置其设置。这行代码为脚本命名,并将其叠加显示在主图上。

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

这个标签被显示在K线的收盘价 (close) 处,并指向左边 (label.style_label_left)。它的颜色是带透明度的黄色 (color.yellow),这是通过 color.new() 函数实现的。

我们分几个部分来构建标签的文本。首先是该品种的交易代码 (syminfo.ticker)。然后我们通过 syminfo.root 变量来包含该品种的根代码。

当这个指标在一个原油期货图表上运行时,它会将该品种的根代码识别为 CL

并非每个品种都有根代码。当我们为一个非金融衍生品的品种加载图表时,syminfo.root 会转而显示该品种自身的交易代码:

如何应用 syminfo.root

syminfo.root 变量让一件事的处理变得异常简单:

  • 为特定的期货品种执行特定代码,无论具体的合约月份如何。如果没有根代码,我们就不得不为每个到期月份和年份分别编写判断逻辑。现在,我们只需简单地检查根代码是否为 "ES" (E-mini标普500) 或 "CL" (原油期货) 即可。

重要提示syminfo.root 变量返回的不是一个有效的交易品种代码,它更像是一个金融衍生品的“系列名称”。我们不能用它来加载背景数据,也无法直接用根代码(如 “ES”)来打开一个 TradingView 图表。

一个可交易的、完整的期货代码,需要根代码与到期月份和年份的组合。只有包含了这三部分信息的代码,才可以被用来打开图表或加载背景数据。


syminfo.root 的特性

  • 由于当图表品种不是金融衍生品时,syminfo.root 会自动返回该品种自身的交易代码,因此我们可以确信,syminfo.root 总是会返回一个非空的字符串值
  • syminfo.root 变量在 TradingView 的指标 (studies) 和策略中都可用,并且我们可以对图表上的任何一个交易品种使用该变量。
  • 我们无法获取图表当前品种之外的另一个品种的衍生品根代码。原因在于,用于在后台加载其他品种数据的 request.security() 函数,无法返回字符串类型的值,而 syminfo.root 正好就是一个字符串。
  • 虽然我们可以对 syminfo.root 使用历史引用运算符 ([]),但这毫无意义,因为该变量在每一根K线上返回的值都是相同的。
  • syminfo.root 变量在 Pine Script 第4版 以及第3版及更早版本 中也同样可用。

内容总结

  • syminfo.root 变量返回图表品种的衍生品根名称。例如,对于任何一个E-mini标普500指数的合约,它都返回 "ES";对于所有的原油期货,它都返回 "CL"
  • 当交易品种不是金融衍生品时,syminfo.root 则返回该品种自身的交易代码。这与 syminfo.ticker 变量返回的值是相同的。
赞(0)
未经允许不得转载:图道交易 » Pine Script(104):syminfo.prefix与syminfo.root,交易所前缀与期货根代码
分享到

评论 抢沙发

登录

找回密码

注册