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

Pine Script(25):如何从字符串中删除开头(前缀)

#Pine Script入门教学

我们在处理交易品种信息时,经常会遇到一些带有固定前缀的文本,比如很多ETF的描述都以ProSharesiShares开头。在图表上显示标签或发送警报时,这些前缀往往是多余的“噪音”,我们真正关心的是后面的核心信息。

那么,如何智能地“砍掉”这些不需要的前缀呢?PineScript虽然没有提供现成的工具,但这正是我们自己动手,打造高级文本处理函数的绝佳机会。

自定义移除前缀的StrRemovePrefix()函数

下面这个自定义函数,能够从一个字符串的开头移除指定的文本,并且可以选择是否忽略大小写,非常强大。

//移除字符串的前缀,可选是否区分大小写
StrRemovePrefix(string source, string prefix, simple bool ignoreCase = false) =>
     // 步骤1: 是否将source和prefix统一转为小写以进行比较
    sourceStr = ignoreCase ? str.lower(source) : source
    prefixStr = ignoreCase ? str.lower(prefix) : prefix

     // 步骤2: 检查处理后的字符串是否真的以此前缀开头
    result = if str.startswith(sourceStr, prefixStr)
         // 从原始字符串的第 N 个字符开始,截取到末尾(N = prefix的长度)
         str.substring(source, str.length(prefix))
    else
         source
   result

这个函数的核心逻辑分为两步:

  1. 预处理:它首先根据第三个参数ignoreCase的值,来决定是否要用str.lower()将原始字符串和前缀字符串都临时转成小写。如果ignoreCasetrue,就都转成小写来比较;如果为false,就保持原样进行严格的大小写匹配。
  2. 判断和截取:接着,它用str.startswith()来判断预处理后的字符串是否以前缀开头。如果是,就用str.substring()函数,从原始字符串中跳过前缀的长度,只返回剩下的部分。如果不是,就原封不动地返回原始字符串。

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

代码示例 结果
StrRemovePrefix("GBPUSD", "GBP") "USD"。“GBP”前缀与源字符串开头匹配,因此被移除。剩下的是“USD”。
StrRemovePrefix("GBPUSD", "gbp") "GBPUSD"。“gbp”的大小写与字符串开头的“GBP”不匹配。所以函数不会移除前缀,并返回原始字符串。
StrRemovePrefix("GBPUSD", "gbp", false) "GBPUSD"。函数的第三个参数已经默认为false。这意味着不忽略大小写差异,因此函数结果不变。
StrRemovePrefix("GBPUSD", "gbp", true) "USD"。当ignoreCase设置为true时,大小写差异就不再重要了。现在小写的“gbp”足以移除字符串开头的“GBP”。
使用注意事项
  • 这个函数可以处理任何返回字符串的地方,包括内置变量、自定义变量、函数返回值等。
  • 函数返回的是一个新的、被修改过的字符串副本,它不会改变你传入的原始变量的值。
  • 要移除的前缀必须和字符串开头完全一样,包括空格。StrRemovePrefix(" EURUSD", "EUR")就不会成功,因为source字符串的开头多了一个空格。
  • 当你要移除的前缀prefix是空字符串""na时,函数不会做任何操作,直接返回原始字符串。

实战案例:清理品种描述以获得更简洁的标签

下面的指标会查找交易品种的描述。当这段描述以“ProShares”开头时,脚本会通过我们自制的StrRemovePrefix()函数来“清理”这段描述,然后把原始描述和清理后的描述都显示在标签里,方便我们对比。

//@version=6
indicator(title="移除字符串前缀 - 案例", overlay=true)

// --- 自定义的函数 ---
StrRemovePrefix(string source, string prefix, simple bool ignoreCase = false) =>
    sourceStr = ignoreCase ? str.lower(source) : source
    prefixStr = ignoreCase ? str.lower(prefix) : prefix
    result = if str.startswith(sourceStr, prefixStr)
        str.substring(source, str.length(prefix))
    else
        source
    result

// 1. 调用我们的函数来“清洗”品种描述
// 我们想从 syminfo.description 中移除 "ProShares" 这个前缀
cleanDescription = StrRemovePrefix(syminfo.description, "ProShares", true)

// 2. 在图表末尾,用标签同时显示原始描述和清洗后的描述,以作对比
if barstate.islastconfirmedhistory
    label.new(bar_index, high,
         // 使用 \n 换行符来组织标签内的文本
         text="原始描述: " + syminfo.description +
         "\n\n移除'ProShares'前缀后: " + cleanDescription,
         color=color.teal, textcolor=color.white)

在图表上,这个标签会显示当前交易品种的描述。如果该描述以“ProShares”前缀开头(不区分大小写),那么修改后的描述就会将该前缀移除,反之则显示原始描述。下面是以“ProShares”开头的ETF品种上(ProShares UltraPro QQQ – TQQQ)和黄金品种,加载代码后的提示:

使用自定义Pine脚本函数移除品种描述中ProShares前缀的效果图

使用自定义Pine脚本函数移除品种描述中ProShares前缀的效果图

总结

总结一下,通过组合str.startswithstr.lowerstr.substring这几个基础函数,我们成功地创造了一个非常实用的文本清理工具StrRemovePrefix()。它不仅能帮你移除固定的前缀,还能通过可选参数智能地处理大小写问题。当原始字符串不含指定前缀时,它会安全地返回原始字符串,不会产生错误。这个例子再次证明了,掌握了基础工具的组合运用,你就能解决PineScript中几乎任何文本处理的挑战,让你的指标和策略输出的信息更干净、更专业。

赞(0)
未经允许不得转载:图道交易 » Pine Script(25):如何从字符串中删除开头(前缀)
分享到

评论 抢沙发

评论前必须登录!

立即登录   注册

登录

找回密码

注册