在写指标或策略时,我们经常会添加一些自定义的输入项,比如让用户自己填写警报信息或者图表标签。但如果用户什么都没填,我们可能就不想显示任何东西。这时候,我们就需要一个能力:判断用户输入的字符串是否为“空”。
这节课,我们就来聊聊在PineScript里判断空字符串的几种方法和常见“坑”。
什么是真正的“空”
首先,我们要明确什么是真正的“空”。一个空字符串,是指里面一个字符都没有,连一个空格都没有。
一个只包含空格的字符串" "
在图表上虽然看不见,但它不是空字符串,它的长度是1。
另外,在PineScript里,还有一个特殊的值na
(Not Available),在进行空值判断时,它的行为和空字符串""
是一样的。
判断空字符串的两种方法
PineScript提供了两种方法来判断字符串是否为空,它们在功能上是等价的,用哪个纯粹是个人风格问题。我个人更推荐第一种,因为它更直观、代码更简洁。
方法一:直接与空字符串""
比较(推荐)
这是最直接的方法。我们可以用等于号==
或不等于号!=
,来判断一个字符串是否为空。
// 判断字符串为空
if syminfo.description == ""
label.new(bar_index, high, text="该品种没有描述信息!")
// 判断字符串非空
messageStr = "这是一个信号"
if messageStr != ""
label.new(bar_index, high, text="messageStr非空")
代码读起来就像我们说的话:“如果我的字符串不等于空”,非常清晰。这里务必注意,判断相等用的是两个等号==
,别跟赋值的单个等号=
搞混了。
方法二:使用str.length()
检查长度
第二种方法,是检查字符串的长度。str.length()
函数会返回字符串里包含的字符数量。如果长度为0,那它肯定是空的。
// 判断字符串为空
if str.length(syminfo.description) == 0
label.new(bar_index, high, text="该品种没有描述信息!")
// 判断字符串非空
if str.length(syminfo.description) > 0
label.new(bar_index, high, text="该品种有描述信息!")
这种方法同样有效,只是代码稍微长一点。
重点避坑区:if
语句的条件
很多从Python等其他语言转过来的朋友,习惯直接写if myString:
来判断字符串是否为空。在PineScript里,这种写法是绝对错误的!
PineScript的if
语句要求条件必须是一个明确的true
或false
。所以你必须老老实实地写出完整的比较,使其返回一个布尔值:
// 错误的写法,无法通过编译
// if syminfo.description
// 正确的写法
if syminfo.description != ""
// ...
完整示例:条件性显示信号标签
下面的脚本完美地展示了判断空字符串的实际应用。它允许用户在输入框里自定义一个信号消息,只有当用户填写了消息,并且均线发生交叉时,才会在图表上把这个消息显示出来。
//@version=6
indicator(title="空字符串判断案例", overlay=true)
// 1. 创建输入框,默认空字符串""
signalText = input.string("", title="信号消息")
// 2. 计算绘制两条EMA均线
emaFast = ta.ema(close, 20)
emaSlow = ta.ema(close, 50)
plot(emaFast, color=color.orange, title="快线EMA")
plot(emaSlow, color=color.teal, linewidth=2, title="慢线EMA")
// 3. 均线发生交叉时显示标签
if signalText != "" and ta.cross(emaFast, emaSlow)
// 创建标签
label.new(bar_index, high, text=signalText, color=color.black,
textcolor=color.white, size=size.large)
这个if
语句的判断条件signalText != ""
,确保了只有当用户确实在设置里输入了内容后,脚本才会在交叉点创建标签,否则图表将保持整洁。
当您将此脚本添加到图表时,由于“信号消息”输入框默认是空的,因此最初不会显示任何信号标签:
如果我们输入任何文本,指标会在移动平均线每次交叉时显示标签。这些标签的内容就是我们输入的文本:
总结
什么是空?:一个字符都没有的""
或者值为na
。只包含空格的字符串不是空字符串。
两种判断方法:用myString != ""
(推荐,更直观)或str.length(myString) > 0
。两者效果相同。
核心避坑点:if
语句后必须跟一个明确的布尔比较,不能直接放一个字符串变量。
主要用途:优雅地处理用户输入,让你的脚本在用户未提供信息时,保持图表整洁,避免显示无效内容。
评论前必须登录!
立即登录 注册