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

Pine Script(22):字符串是否包含子字符串(忽略大小写)

#Pine Script入门教学

前面我们讲了字符串比较的三剑客,但它们都有一个共同的毛病:太较真,严格区分大小写。比如,在它们眼里'BTC''btc'是完全不同的东西。

但在很多实际场景里,我们希望搜索能智能一点,忽略大小写的差异。比如,我想找到所有比特币相关的品种,不管是BTCUSD还是btcusd

PineScript本身没有提供现成的函数来做这件事,但这正好给了我们一个机会,来学习如何自己动手,丰衣足食:创建一个我们自己的、不区分大小写的文本包含函数。

自定义不区分大小写的StrContains()函数

怎么实现呢?思路其实非常巧妙:既然问题的根源是大小写不统一,那我们就在比较之前,强行把它们都变成统一的格式。最简单的方法就是,不管原始文本是什么样,我们都用str.lower()函数,把它们全部转换成小写。

这样一来,BTCUSD变成了btcusdbtc还是btc,再去比较,问题不就解决了么?

基于这个思路,我们可以封装出下面这个超级实用的自定义函数:

// StrContains() 函数:不区分大小写
StrContains(string source, string substring) =>
    // 用str.lower()把字符串转成小写,然后调用熟悉的str.contains()进行判断
     str.contains(str.lower(source), str.lower(substring))

这个函数的使用示例及其结果如下:

代码示例 结果
StrContains("AUDUSD", "AUD") true。“AUD”字符串在“AUDUSD”中逐字出现。
StrContains("AUDUSD", "usd") true。“usd”这个字母短语出现在“AUDUSD”文本中,因为函数忽略了大小写差异。所以无论我们查找的是“usd”、“USD”还是“Usd”,对函数而言,它们都被视为相同,并在源字符串中找到匹配。
StrContains("AUDUSD", "usdo") false。虽然“usd”在字符串中,但整个短语“usdo”并没有出现,因此函数返回false
StrContains("32.84", "4") true。“4”这个字符在“32.84”字符串内部出现了。
使用注意事项 (处理空值)

我们这个自定义函数在处理空字符串或na值时,行为和内置的str.contains()一样。简单总结就是:

  • 任何字符串都‘包含’一个空字符串,所以StrContains("EURUSD", "")会返回true
  • 一个空字符串里不可能‘包含’任何非空的内容,所以StrContains("", "USD")会返回false
实战案例:根据交易品种时区进行判断

下面的指标会根据交易品种的时区(syminfo.timezone)来工作。我们将使用自己创建的StrContains()函数,来判断这个时区信息里是否包含“europe”或“america”,从而识别出资产所属的市场区域。由于我们是不区分大小写的比较,因此无论时区是"America/New_York"还是"america/new_york",都能被正确识别。

//@version=6
indicator(title="不区分大小写的字符串包含", overlay=true)

StrContains(string source, string substring) =>
     str.contains(str.lower(source), str.lower(substring))

// 绘制标签
if barstate.islastconfirmedhistory
    // 检查品种时区是否包含"europe"
    if StrContains(syminfo.timezone, "europe")
        label.new(bar_index, high, "这是一个欧洲市场的品种!",
             color=color.teal, textcolor=color.white)
    // 如果不属于欧洲,再检查是否包含"america"
    else if StrContains(syminfo.timezone, "america")
        label.new(bar_index, high, "这是一个美市场的品种!",
             color=color.purple, textcolor=color.white)

当我们查看一个在欧交易所交易的股票时,脚本就会显示这是一个欧洲交易品种否则会显示美市场的品种:

使用自定义的Pine脚本函数忽略大小写,判断交易品种时区并显示标签

总结

总结一下,虽然PineScript没有内置的不区分大小写的搜索函数,但通过组合str.lower()str.contains(),我们可以轻松地打造出自己的专属工具StrContains()。这个过程不仅解决了实际问题,更重要的是让你体会到了编程的灵活之处:当现成的工具不满足需求时,学会自己动手创造工具。

赞(0)
未经允许不得转载:图道交易 » Pine Script(22):字符串是否包含子字符串(忽略大小写)
分享到

评论 抢沙发

评论前必须登录!

立即登录   注册

登录

找回密码

注册