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

Pine Script(20):字符串是否以另一字符串开头

#Pine Script入门教学

上一节我们聊了str.contains(),它可以帮我们做模糊的“文本包含”搜索。但有时候,我们需要更精确的判断,比如,我只想找出所有以'EUR'开头的货币对,而不想匹配到'GBPEUR'

这种要求“必须以…开头”的场景,就需要我们的主角——str.startswith()函数登场了。

str.startswith()的核心规则

它的用法和str.contains()几乎一样:str.startswith(主字符串, 要查找的子字符串)。它的返回规则也很相似,但判断标准更严格:

  1. 常规情况:只有当“主字符串”的开头部分与“子字符串”一模一样时,才返回true;否则返回false
  2. 最重要的规则:同样,严格区分大小写。'EUR''eur'是两码事。
  3. 空值“陷阱”:和str.contains()一样,如果被查找的子字符串是空的(""na),函数会认为“任何字符串都以空字符串开头”,所以结果总是true
  4. 被搜索对象为空:如果你在一个空的主字符串里去查找一个非空的子字符串,结果肯定是false

这个函数的应用场景非常明确,主要就是做“前缀匹配”。比如,筛选所有以特定字母开头的品种代码(如'BTC'开头的比特币系列);识别用户输入的,以特定单词(如'BUY')开头的机器人指令;或者在做交易复盘时,筛选出所有以特定标识开头的订单备注等等。

严格区分大小写!

我要再次强调,无论是contains, startswith还是endswith,它们在比较时,对字母的大小写都极度敏感。这是新手最常犯的错误,值得反复提醒。

下面这个表格能让你看得更清楚:

代码示例 结果
str.startswith("EURUSD", "Eur") false。因为“Eur”中的“ur”的大小写与“EURUSD”字符串不匹配。
str.startswith("EURUSD", "eur") false。因为“eur”的大小写与源字符串的开头不匹配。
str.startswith("EURUSD", "EUR") true。因为“EUR”字符串在源字符串的开头部分逐字出现,并且大小写完全一致。
精确匹配“ES”期货合约

下面的指标会检查当前交易品种的代码(syminfo.ticker)是否以“ES”开头。如果符合,那么这个交易品种很可能就是E-mini S&P 500期货合约。

这个例子能很好地说明为什么有时必须用str.startswith()而不是str.contains()。因为市场上还有Micro E-mini S&P 500期货,其代码是“MES”。如果我们用str.contains()来查找“ES”,会把“MES”也错误地包含进来。而str.startswith()则能精准地只匹配“ES”开头的品种。

//@version=6
indicator(title="str.startswith() 案例", overlay=true)

// 1. 检查当前品种代码,判断是否以"ES"开头
esInstrument = str.startswith(syminfo.ticker, "ES")

// 2. 用标签显示判断结果
if barstate.islastconfirmedhistory
    // 创建一个新标签,显示品种代码和我们的判断结果
    label.new(bar_index, high, color=color.black, textcolor=color.white,
         text=syminfo.ticker + "\n\nDoes the symbol start with 'ES'?\n" +
         str.tostring(esInstrument))

在图表上,这个脚本会绘制一个文本标签,显示当前交易品种的代码,并告知该代码是否以“ES”开头。(当你将图表切换到其他交易品种时,标签中显示的信息也会随之更新。)

总结

  • str.startswith()是你工具箱里一把更精准的“文本手术刀”。当str.contains()的模糊搜索无法满足你的要求,你需要严格地从字符串的开头进行匹配时,它就是你的不二之选。
  • 它是在Pine Script v5版本中才新增的功能。
  • 使用时,牢记它和str.contains()共有的最重要特点:严格区分大小写。
赞(0)
未经允许不得转载:图道交易 » Pine Script(20):字符串是否以另一字符串开头
分享到

评论 抢沙发

评论前必须登录!

立即登录   注册

登录

找回密码

注册