继StrContains()
和StrStartsWith()
之后,我们来打造我们自定义工具箱里的最后一件利器:StrEndsWith()
。顾名思义,它专门解决不区分大小写的“后缀匹配”问题。这个功能在根据计价货币(如USD
)、合约类型(如PERP
)等品种代码后缀来做精细化筛选时,无可替代。
自定义不区分大小写的StrEndsWith()
函数
实现思路和我们前两节课完全一样:在比较之前,先把两个字符串都用str.lower()
函数一视同仁地转换成小写,抹平大小写的差异,然后再进行比较。
基于这个思路,我们可以封装出下面这个专门用于后缀匹配的自定义函数:
// 判断源字符串是否以子字符串结尾,不区分大小写
StrEndsWith(string source, string substring) =>
// 转成小写,然后调用内置的str.endswith()进行精确的后缀匹配
str.endswith(str.lower(source), str.lower(substring))
这个函数的使用示例及其结果如下:
使用注意事项 (处理空值)
我们这个自定义函数在处理空字符串或na
值时,行为和内置的str.endswith()
一样。简单总结就是:
- 任何字符串都‘以空字符串结尾’,所以
StrEndsWith("EURUSD", "")
会返回true
。 - 一个空字符串里不可能‘以任何非空内容结尾’,所以
StrEndsWith("", "USD")
会返回false
。
实战案例:根据时区识别不同国家的股票
下面的指标旨在识别在英国、德国和美国交易所交易的股票。它通过我们自定义的StrEndsWith()
函数,来检查交易品种的时区(syminfo.timezone
)是否以特定的城市名结尾,从而判断其所属的国家。
//@version=6
indicator(title="不区分大小写的后缀匹配", overlay=true)
StrEndsWith(string source, string substring) =>
str.endswith(str.lower(source), str.lower(substring))
if barstate.islast and syminfo.type == "stock"
if StrEndsWith(syminfo.timezone, "london")
label.new(bar_index, high, "这是一只英国股票!",
color=color.teal, textcolor=color.white)
else if StrEndsWith(syminfo.timezone, "berlin")
label.new(bar_index, high, "这是一只德国股票!",
color=color.fuchsia, textcolor=color.white)
else if StrEndsWith(syminfo.timezone, "new_york")
label.new(bar_index, high, "这是一只美国股票!",
color=color.lime)
这个脚本首先通过一个外层if
语句,确保我们只在图表的最后一个K线上,并且只对“股票”类型的品种进行操作。然后,在内层的级联if
语句中,我们调用自己创建的StrEndsWith()
函数,依次检查时区是否以"london"
、"berlin"
或"new_york"
结尾,并根据结果打上不同颜色的标签。
在下面的股票图表上,脚本会正确地识别出这是一只哪国股票:
总结
总结一下,通过str.lower()
和str.endswith()
的组合,我们成功打造了自定义工具三剑客的最后一位StrEndsWith()
。
至此,我们已经拥有了一套完整的、不区分大小写的文本匹配工具箱:
StrContains()
用于模糊包含。StrStartsWith()
用于前缀匹配。StrEndsWith()
用于后缀匹配。
学会自己动手创造工具,是让你从PineScript新手走向高手的必经之路。
评论前必须登录!
立即登录 注册