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

Pine Script(108):syminfo.currency与basecurrency,判断法定货币

#Pine Script入门教学

syminfo.currency:获取品种的报价货币

Pine Script 的 syminfo.currency 变量,会以一段文本字符串的形式,返回当前图表交易品种的货币

这个返回值是一个三字母的货币代码。例如,对于一支以美元报价的股票,该变量会返回 "USD";对于一家在欧洲上市的公司,它则会返回 "EUR"

当交易品种是货币对时,syminfo.currency 返回的是该货币对中的第二个货币。这个货币也被称为报价货币 (quote currency)。因此,对于 EURUSD,该变量返回 "USD";而对于 EURJPY,我们得到的是 "JPY"


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

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

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

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


示例脚本:显示品种的货币

这个简短的指标会通过一个标签,在图表上显示当前品种的货币单位:

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

// 在图表的最后一根已确认的历史K线上,创建一个标签
// 用以显示该品种的交易代码和货币。
if barstate.islastconfirmedhistory
    myLabel = label.new(x=bar_index + 2, y=close, style=label.style_label_left,
         color=color.blue, textcolor=color.white, size=size.large,
         text=syminfo.ticker + " quotes in\nthe " + 
             syminfo.currency + " currency")

    // 当品种以美元报价时,将标签颜色变为美元绿
    if syminfo.currency == "USD"
        label.set_color(id=myLabel, color=#85bb65)

代码解析

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

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

这个标签被显示在当前收盘价 (close) 处,并向右移动2根K线 (bar_index + 2) 的位置。它的箭头指向左边 (label.style_label_left),并以蓝色 (color.blue) 背景和白色文字显示。标签的文本内容包含了该品种的交易代码 (syminfo.ticker) 以及 syminfo.currency 变量的值。

接着,一个嵌套的 if 语句检查该品种的货币是否等于 (==) 美元 ("USD")。如果是,label.set_color() 函数就会将标签的背景色更改为“美元绿”的十六进制颜色代码 (#85bb65)。这使得标签可以根据品种的货币单位显示不同的颜色。

当我们将该脚本添加到一个美国股票的图表上时,标签会以绿色显示,并且货币为USD:

对于非美元报价的品种,该指标则会显示其初始的蓝色背景。这里我们看到,戴姆勒 (Daimler) 是以欧元报价的:

如何应用 syminfo.currency

在我们的代码中,有多种方式可以应用 syminfo.currency,例如:

  • 实现特定逻辑:为以某些特定货币计价的品种实现专门的脚本行为(例如,对英镑计价的股票和欧元计价的股票采用不同的处理方式)。
  • 显示货币信息:在警报消息和绘图对象(如标签和表格)中,明确显示该品种的计价货币。
  • 验证品种特性:例如,判断该品种是否以法定货币 (fiat currency) 报价。
  • 执行货币换算:执行从图表当前货币到其他货币,或从其他货币到当前货币的换算。

提示:除了品种的报价货币,对于货币对,我们还可以通过 syminfo.basecurrency 变量来查找其基础货币


syminfo.currency 的特性

  • syminfo.currency 并不总是返回一个货币代码。某些 TradingView 品种(例如来自 Quandl 的经济数据)并没有设定货币单位。对于这些品种,该变量会返回一个空字符串 ("")
  • TradingView 提供了一些内置的货币常量(例如 currency.EURcurrency.USD)。由于它们使用的格式与 syminfo.currency 返回的格式相同,我们可以直接进行比较。例如,要判断当前图表的品种是否以欧元报价,我们可以这样测试:syminfo.currency == currency.EUR
  • syminfo.currency 变量可用于指标 (studies) 和策略脚本。此外,这个变量对于 TradingView 提供的每一个交易品种都可用。
  • 目前,我们无法获取另一个交易品种的货币单位。原因在于,用于在后台加载其他品种数据的 request.security() 函数,无法返回一个字符串类型的值,因此也就无法获取另一个品种的 syminfo.currency 值。
  • syminfo.currency 是 Pine Script 语言中一个相对较新的变量,在第3版及更早的版本中并不存在。

内容总结

  • syminfo.currency 变量返回当前图表交易品种所使用的货币
  • 这个所谓的报价货币 (quote currency),是以一个三字母字符串的形式返回的,例如 "EUR""USD""BTC"
  • 并非每个交易品种都以货币报价。例如,对于经济数据,syminfo.currency 会返回一个空字符串。

syminfo.basecurrency:获取品种的基础货币

Pine Script 的 syminfo.basecurrency 变量,会以一段文本字符串的形式,返回当前图表交易品种的基础货币

在交易中,基础货币 (base currency) 这个术语指的是一个现货货币对中的第一个货币。例如,对于 EUR/USD,基础货币是欧元 (EUR);对于 BTC/USD,基础货币则是比特币 (BTC)。

一个货币对的价格,表示的是1单位的基础货币,可以兑换多少单位的第二种货币(即报价货币, quote currency)。例如,当 EUR/USD 的报价为 1.1924 时,意味着一欧元(基础货币)价值1.1924美元(报价货币)。

Pine Script 的 syminfo.basecurrency 变量会返回以下两种值之一:

  • 对于货币对,该变量返回该品种的基础货币,例如 "EUR""USD""BTC"
  • 对于非货币对(如股票、期货等),syminfo.basecurrency 会返回一个空字符串 ("")。(要获取这些品种的计价货币,我们应使用 syminfo.currency 变量。)

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

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

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

需要澄清的是,上表中的双引号 (") 只是为了表明返回的值是一个字符串,引号本身并非该变量值的一部分。因此,当我们在标签或警报消息中使用 syminfo.basecurrency 时,是不会看到这些引号的。


完整示例脚本

下面我们来看一下如何在一个完整的 TradingView 脚本中应用 syminfo.basecurrency

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

// 在最后一根已确认的历史K线上,创建一个标签来显示
// 该品种的基础货币。
if barstate.islastconfirmedhistory
    myLabel = label.new(x=bar_index + 2, y=hl2, style=label.style_label_left,
         color=color.lime, textcolor=color.black, size=size.large,
         text=syminfo.ticker + " has a base currency of " + 
             syminfo.basecurrency)

    // 当品种没有基础货币时,更改标签的文本
    if syminfo.basecurrency == ""
        label.set_text(id=myLabel, text=syminfo.ticker + 
             " has no base currency")

代码解析

这个指标做了几件事。首先,我们使用 indicator() 函数来配置其设置,这行代码为脚本命名,并将其叠加显示在主图上。

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

这个标签被显示在K线的中点价格 (hl2) 处,并向右移动2根K线 (bar_index + 2) 的位置。它的箭头指向左边 (label.style_label_left),并以青柠绿色 (color.lime) 为背景,黑色文字显示。

标签的初始文本,是将品种的交易代码 (syminfo.ticker) 与其基础货币(通过 syminfo.basecurrency 变量获取)拼接而成的。

我们将创建的标签对象储存在 myLabel 变量中,这样我们之后就可以修改这个标签。

接着,是一个嵌套的 if 语句。它会检查 syminfo.basecurrency 变量的值是否等于 (==) 一个空字符串 ("")。当交易品种没有基础货币时(即除了货币对之外的所有品种),这种情况就会发生。

对于那些没有基础货币的品种,我们使用 label.set_text() 函数来更新标签的文本,明确告知用户这一点。

当我们将这个指标添加到一个货币对图表上时,它会告诉我们该品种所使用的基础货币:

如果该品种没有基础货币,指标的标签也会如实告知:

基础货币 vs. 报价货币

除了 syminfo.basecurrency,Pine Script 还有一个 syminfo.currency 变量。后者返回的是图表品种的报价货币 (quote currency)

它们之间有何区别?

  • 报价货币 (syminfo.currency):这是品种进行交易和报价时所使用的货币。当我们买卖该品种时,盈亏是以这种货币来计算的。对于货币对,报价货币是第二个货币(例如 EURUSD 中的 USD)。
  • 基础货币 (syminfo.basecurrency):这是只有货币对才有的概念。对于这些品种,它是货币对中的第一个货币(例如 BTCUSD 中的 BTC)。

下表展示了报价货币和基础货币针对不同 TradingView 交易品种的返回值对比:

品种 (交易代码) 报价货币 (Quote Currency) 基础货币 (Base Currency)
比特币 / 美元 (BTCUSD) USD BTC
瑞波币 / 比特币 (XRPBTC) BTC XRP
欧元 / 美元 (EURUSD) USD EUR
欧元 / 英镑 (EURGBP) GBP EUR
特斯拉股票 (TSLA) USD (无)
微软股票 (MSFT) USD (无)
欧洲50指数 CFD (EU50EUR) EUR (无)

如何应用 syminfo.basecurrency

有以下几种方式可以应用 syminfo.basecurrency

  • 在评估品种的基础货币的同时,执行货币换算。
  • 验证当前品种是否不是一个货币对——当 syminfo.basecurrency 返回一个空字符串 ("") 时,即可确认。

然而,在大多数时候,我们处理得更多的是品种的报价货币,我们可以通过 syminfo.currency 变量来获取它。


syminfo.basecurrency 的特性

  • 我们可以在指标 (study) 和策略脚本中使用 syminfo.basecurrency。并且,这个变量对于每一个 TradingView 交易品种都可用。
  • syminfo.basecurrency 在每一根K线上都返回相同的值。对它使用历史引用运算符 ([]) 没有任何区别。
  • 我们只能获取当前图表品种的基础货币,而无法获取其他品种的基础货币。原因在于,用于在后台加载其他品种数据的 request.security() 函数,无法返回字符串类型的值,因此也就无法获取另一个品种的 syminfo.basecurrency 值。
  • syminfo.basecurrency 是 Pine Script 中一个相对较新的变量,它在第3版及更早的版本中并不存在。

内容总结

  • Pine Script 的 syminfo.basecurrency 变量返回交易品种的基础货币
  • 基础货币是货币对中列在第一个的货币。例如,对于 GBPUSD,基础货币是 GBP。
  • 对于非货币对的品种,syminfo.basecurrency 会返回一个空字符串 ("")

如何判断一个货币代码是否为法定货币

法定货币 (fiat currency),是一种其价值不与黄金或白银等实物品种挂钩的货币。它的价值,来自于发行它的政府的信用背书。法定货币的例子包括美元、欧元、英镑和日元。


法定货币代码规范

每一种法定货币都有一个特定的货币代码,这些代码在官方的 ISO 4217 规范中被定义。一个货币代码由三个英文字母组成。前两个字母通常与国家代码相对应,最后一个字母(如果可能)则是该货币名称的首字母。

例如,美元的代码是 USD,瑞士法郎是 CHF。该规范通过这种方式,为267个国家和地区定义了169个货币代码。

接下来,让我们看看如何用 Pine Script 代码来判断一个字符串是否为法定货币。


自定义函数:判断是否为法定货币

要判断一个 Pine Script 字符串是否匹配一个货币代码,我们可以将其与 ISO 4217 列表进行比较。如果匹配,该字符串就是一个有效的货币代码;否则,它就是其他东西。

下面的这个自定义函数实现了这一方法:

// 当给定的货币代码字符串,根据官方的ISO 4217货币代码规范
// 是一种法定货币时,IsFiatCurrency() 函数返回 true。
// 否则,该函数返回 false。
IsFiatCurrency(code) =>
    code == "AED" or code == "AFN" or code == "ALL" or 
     code == "AMD" or code == "ANG" or code == "AOA" or 
     code == "ARS" or code == "AUD" or code == "AWG" or 
     code == "AZN" or code == "BAM" or code == "BBD" or 
     code == "BDT" or code == "BGN" or code == "BHD" or 
     code == "BIF" or code == "BMD" or code == "BND" or 
     code == "BOB" or code == "BOV" or code == "BRL" or 
     code == "BSD" or code == "BTN" or code == "BWP" or 
     code == "BYN" or code == "BZD" or code == "CAD" or 
     code == "CDF" or code == "CHE" or code == "CHF" or 
     code == "CHW" or code == "CLF" or code == "CLP" or 
     code == "CNY" or code == "COP" or code == "COU" or 
     code == "CRC" or code == "CUC" or code == "CUP" or 
     code == "CVE" or code == "CZK" or code == "DJF" or 
     code == "DKK" or code == "DOP" or code == "DZD" or 
     code == "EGP" or code == "ERN" or code == "ETB" or 
     code == "EUR" or code == "FJD" or code == "FKP" or 
     code == "GBP" or code == "GEL" or code == "GHS" or 
     code == "GIP" or code == "GMD" or code == "GNF" or 
     code == "GTQ" or code == "GYD" or code == "HKD" or 
     code == "HNL" or code == "HRK" or code == "HTG" or 
     code == "HUF" or code == "IDR" or code == "ILS" or 
     code == "INR" or code == "IQD" or code == "IRR" or 
     code == "ISK" or code == "JMD" or code == "JOD" or 
     code == "JPY" or code == "KES" or code == "KGS" or 
     code == "KHR" or code == "KMF" or code == "KPW" or 
     code == "KRW" or code == "KWD" or code == "KYD" or 
     code == "KZT" or code == "LAK" or code == "LBP" or 
     code == "LKR" or code == "LRD" or code == "LSL" or 
     code == "LYD" or code == "MAD" or code == "MDL" or 
     code == "MGA" or code == "MKD" or code == "MMK" or 
     code == "MNT" or code == "MOP" or code == "MRU" or 
     code == "MUR" or code == "MVR" or code == "MWK" or 
     code == "MXN" or code == "MXV" or code == "MYR" or 
     code == "MZN" or code == "NAD" or code == "NGN" or 
     code == "NIO" or code == "NOK" or code == "NPR" or 
     code == "NZD" or code == "OMR" or code == "PAB" or 
     code == "PEN" or code == "PGK" or code == "PHP" or 
     code == "PKR" or code == "PLN" or code == "PYG" or 
     code == "QAR" or code == "RON" or code == "RSD" or 
     code == "RUB" or code == "RWF" or code == "SAR" or 
     code == "SBD" or code == "SCR" or code == "SDG" or 
     code == "SEK" or code == "SGD" or code == "SHP" or 
     code == "SLL" or code == "SOS" or code == "SRD" or 
     code == "SSP" or code == "STN" or code == "SVC" or 
     code == "SYP" or code == "SZL" or code == "THB" or 
     code == "TJS" or code == "TMT" or code == "TND" or 
     code == "TOP" or code == "TRY" or code == "TTD" or 
     code == "TWD" or code == "TZS" or code == "UAH" or 
     code == "UGX" or code == "USD" or code == "USN" or 
     code == "UYI" or code == "UYU" or code == "UYW" or 
     code == "UZS" or code == "VES" or code == "VND" or 
     code == "VUV" or code == "WST" or code == "XAF" or 
     code == "XCD" or code == "XDR" or code == "XOF" or 
     code == "XPF" or code == "XSU" or code == "XUA" or 
     code == "YER" or code == "ZAR" or code == "ZMW" or 
     code == "ZWL"

这个 IsFiatCurrency() 函数接受一个字符串参数。然后,它会将这个字符串与 ISO 4217 规范中的所有169个三字母货币代码逐一进行比较。

当输入的字符串与其中任何一个货币代码匹配时,该函数返回 true。如果字符串不匹配任何官方代码,函数的结果则为 false。这其中包含了大小写的区别,例如 “eur” 不是一个官方的法定货币代码,而 “EUR” 才是。

要使用该函数,我们只需传入一个字符串值,它便会根据该字符串是否为三字母货币代码,返回 truefalse。例如:

fiatTest    = IsFiatCurrency("JPY")             // true (返回真)
nonFiatTest = IsFiatCurrency("BTC")             // false (返回假)

// 判断当前品种的货币是否为法定货币
fiatSymbol  = IsFiatCurrency(syminfo.currency)

完整示例指标

下面我们来看一下如何在一个完整的示例指标中应用 IsFiatCurrency() 函数:

//@version=5
indicator(title="See if string contains fiat currency code", overlay=true)

// 当给定的货币代码字符串,根据官方的ISO 4217货币代码规范
// 是一种法定货币时,IsFiatCurrency() 函数返回 true。
// 否则,该函数返回 false。
IsFiatCurrency(code) =>
    code == "AED" or code == "AFN" or code == "ALL" or 
     code == "AMD" or code == "ANG" or code == "AOA" or 
     code == "ARS" or code == "AUD" or code == "AWG" or 
     code == "AZN" or code == "BAM" or code == "BBD" or 
     code == "BDT" or code == "BGN" or code == "BHD" or 
     code == "BIF" or code == "BMD" or code == "BND" or 
     code == "BOB" or code == "BOV" or code == "BRL" or 
     code == "BSD" or code == "BTN" or code == "BWP" or 
     code == "BYN" or code == "BZD" or code == "CAD" or 
     code == "CDF" or code == "CHE" or code == "CHF" or 
     code == "CHW" or code == "CLF" or code == "CLP" or 
     code == "CNY" or code == "COP" or code == "COU" or 
     code == "CRC" or code == "CUC" or code == "CUP" or 
     code == "CVE" or code == "CZK" or code == "DJF" or 
     code == "DKK" or code == "DOP" or code == "DZD" or 
     code == "EGP" or code == "ERN" or code == "ETB" or 
     code == "EUR" or code == "FJD" or code == "FKP" or 
     code == "GBP" or code == "GEL" or code == "GHS" or 
     code == "GIP" or code == "GMD" or code == "GNF" or 
     code == "GTQ" or code == "GYD" or code == "HKD" or 
     code == "HNL" or code == "HRK" or code == "HTG" or 
     code == "HUF" or code == "IDR" or code == "ILS" or 
     code == "INR" or code == "IQD" or code == "IRR" or 
     code == "ISK" or code == "JMD" or code == "JOD" or 
     code == "JPY" or code == "KES" or code == "KGS" or 
     code == "KHR" or code == "KMF" or code == "KPW" or 
     code == "KRW" or code == "KWD" or code == "KYD" or 
     code == "KZT" or code == "LAK" or code == "LBP" or 
     code == "LKR" or code == "LRD" or code == "LSL" or 
     code == "LYD" or code == "MAD" or code == "MDL" or 
     code == "MGA" or code == "MKD" or code == "MMK" or 
     code == "MNT" or code == "MOP" or code == "MRU" or 
     code == "MUR" or code == "MVR" or code == "MWK" or 
     code == "MXN" or code == "MXV" or code == "MYR" or 
     code == "MZN" or code == "NAD" or code == "NGN" or 
     code == "NIO" or code == "NOK" or code == "NPR" or 
     code == "NZD" or code == "OMR" or code == "PAB" or 
     code == "PEN" or code == "PGK" or code == "PHP" or 
     code == "PKR" or code == "PLN" or code == "PYG" or 
     code == "QAR" or code == "RON" or code == "RSD" or 
     code == "RUB" or code == "RWF" or code == "SAR" or 
     code == "SBD" or code == "SCR" or code == "SDG" or 
     code == "SEK" or code == "SGD" or code == "SHP" or 
     code == "SLL" or code == "SOS" or code == "SRD" or 
     code == "SSP" or code == "STN" or code == "SVC" or 
     code == "SYP" or code == "SZL" or code == "THB" or 
     code == "TJS" or code == "TMT" or code == "TND" or 
     code == "TOP" or code == "TRY" or code == "TTD" or 
     code == "TWD" or code == "TZS" or code == "UAH" or 
     code == "UGX" or code == "USD" or code == "USN" or 
     code == "UYI" or code == "UYU" or code == "UYW" or 
     code == "UZS" or code == "VES" or code == "VND" or 
     code == "VUV" or code == "WST" or code == "XAF" or 
     code == "XCD" or code == "XDR" or code == "XOF" or 
     code == "XPF" or code == "XSU" or code == "XUA" or 
     code == "YER" or code == "ZAR" or code == "ZMW" or 
     code == "ZWL"

// 创建一个输入框,用以定义一个自定义字符串
currencyCode = input.string("EUR", title="Currency code")

// 创建一个标签来输出判断结果
var outputLabel = label.new(x=bar_index, y=close,
     color=color.black, textcolor=color.white, style=label.style_label_left,
     text="'" + currencyCode + "' is a fiat currency? " +
         (IsFiatCurrency(currencyCode) ? "true" : "false") + 
         "\nInstrument's currency ('" + syminfo.currency + "') is a fiat currency? " +
         (IsFiatCurrency(syminfo.currency) ? "true" : "false"))

// 更新标签的位置,使其总是在最后一根K线的右侧显示
if barstate.islast
    label.set_xy(id=outputLabel, x=bar_index, y=close)

代码解析

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

然后,我们包含了上文讨论过的 IsFiatCurrency() 自定义函数。

接下来,input.string() 函数创建了一个字符串输入框。通过这个自定义脚本设置,我们可以指定一个待测的货币代码,其默认值为 "EUR"

之后,Pine Script 的 label.new() 函数仅创建一次文本标签(因为使用了 var 关键字)。该标签的文本内容包含几个部分:首先,我们判断之前创建的输入框中的内容是否为法定货币代码,为此我们对输入变量调用 IsFiatCurrency() 函数。然后,我们使用相同的函数,来判断当前品种的计价货币 (syminfo.currency) 是否为法定货币。

代码的最后一部分是一个 if 语句,它会在最后一根K线上更新标签的位置,这能让标签随着新K线的出现而移动。

在图表上,这个示例指标看起来是这样的:

这里我们检查了两个货币字符串。第一个是 "EUR",由脚本的输入选项指定。另一个是 "CAD",来自该品种自身的计价货币。对于这张 AUDCAD 图表,我们可以看到 CAD 是一种法定货币。当然,当我们切换图表时,标签的信息也会相应地改变。

赞(0)
未经允许不得转载:图道交易 » Pine Script(108):syminfo.currency与basecurrency,判断法定货币
分享到

评论 抢沙发

登录

找回密码

注册