Market News & Insights
Market News & Insights

TradingView编程系列4:条件框架

Michael Miao
8/12/2025
0 min read
Share this post
Copy URL

在TradingView的Pine Script®中,条件语句是构建智能交易策略和自定义指标的核心工具。Pine Script提供了两种主要的条件结构:if和switch。通过它们,开发者可以根据不同的市场情况动态地控制代码的执行路径,实现逻辑判断和决策处理。

类似于for和while循环,条件结构也可以嵌套使用。你可以在一个if或switch块中包含其他条件或循环结构,从而实现更复杂的逻辑判断。然而,需要注意的是,并非所有Pine Script内置函数都可以在条件结构的本地代码块中调用。例如,像plot()、barcolor()、bgcolor()以及alertcondition()等函数,在本地条件块内不可直接调用。

此外,为了保证代码的可读性和正确性,条件结构内部的本地代码块必须使用四个空格或一个制表符进行缩进。理解和合理运用这些条件结构,是每一位Pine Script开发者编写高效、可维护策略的关键一步。

if 结构具体语法如下:

if <表达式>

    <本地代码块>

{else if <表达式>

    <本地代码块>}

[else

    <本地代码块>]

说明:

  • 方括号 [] 中的部分可以出现零次或一次,大括号 {} 中的部分可以出现零次或多次。
  • <表达式> 必须是布尔类型(bool),或者可以自动转换为布尔类型,这只适用于整数(int)或浮点数(float)值(详见类型系统页面)。
  • <本地代码块> 由零条或多条语句组成,最后可以返回一个值,该值可以是一个元组。代码块必须缩进四个空格或一个制表符。
  • 可以有零条或多条 else if 子句。
  • 可以有零条或一条 else 子句。

执行规则:

  1. 当 if 后的 <表达式> 计算结果为 true 时,执行第一个本地代码块,if 结构执行结束,并返回本地代码块末尾计算得到的值(或元组)。
  2. 当 if 后的 <表达式> 计算结果为 false 时,会依次计算后续的 else if 子句(如果有)。当其中某个 <表达式> 为 true 时,执行对应的本地代码块,if 结构执行结束,并返回本地代码块末尾的值。
  3. 当没有任何 <表达式> 为 true 且存在 else 子句时,执行 else 的本地代码块,if 结构执行结束,并返回本地代码块末尾的值。
  4. 当没有任何 <表达式> 为 true 且不存在 else 子句时,返回 na。

比如下面示例:

if (ta.crossover(source, lower))
      strategy.entry("BBandLE", strategy.long,

                                         stop=lower,comment="BBandLE")
else
      strategy.cancel(id="BBandLE")

说明:

  • ta.crossover(a, b) 是 Pine Script 的内置函数,用来判断序列 a 是否从下向上穿过序列 b。
  • source 和 lower 分别是你定义的价格序列或指标线,比如 source 可能是收盘价,lower 可能是布林带下轨。
  • 当 source 向上穿越 lower 时,条件为 true,if 结构的第一个代码块将被执行;否则执行 else 部分。
  • strategy.entry() 用于在策略中开仓。
  • "BBandLE" 是这个订单的唯一标识符(ID)。
  • strategy.long 表示开多仓(买入)。
  • stop=lower 表示这是一个止损单,如果价格跌破 lower(布林带下轨)就触发止损。
  • comment="BBandLE" 是给订单加一个备注,方便策略回测或日志查看。
  • strategy.cancel(id="BBandLE") 用于取消先前创建的、ID 为 "BBandLE" 的挂单。
  • 换句话说,如果 source 没有向上穿越 lower,就取消该布林带下轨的挂单,防止无效订单留在市场上。

Pine Script中的条件语句,除了if之外,还有一种switch模式。Pine Script 中的 switch 是一种用于在多个条件或多个值之间进行选择的结构化分支语句,它从一组 case 中只执行一个对应的代码块,并返回该代码块的值(或执行副作用),还可以指定默认返回值。它适用于当你需要根据多个可能值或多种情况来返回不同结果时,使代码更简洁、更清晰。与之相比,if 更适合处理二分或少量条件判断,而 switch 在大量条件、特别是基于同一个关键值进行匹配时更具可读性。关键区别在于:switch 是“结构化单分支”,不会像 if-else 链一样逐个判断多个条件,更适合多选一的场景,而 if 更灵活但结构可能更冗长。

switch 结构有两种形式。第一种根据某个关键表达式的不同值进行切换:

[[<declaration_mode>] [<type>] <identifier> = ]switch <expression>

    {<expression> => <local_block>}

    => <local_block>

第二种形式不使用关键表达式;它根据不同表达式的求值结果进行切换:

[[<declaration_mode>] [<type>] <identifier> = ]switch

    {<expression> => <local_block>}

    => <local_block>

其中:

  • 方括号 [] 中的部分可以出现零次或一次;
    花括号 {} 中的部分可以出现零次或多次。
  • <declaration_mode> 是变量的声明模式。
  • <type> 是可选项,就像 Pine Script 中几乎所有变量声明一样(参见 types)。
  • <identifier> 是变量名。
  • <expression> 可以是字面量、变量、表达式或函数调用。
  • <local_block> 由零个或多个语句组成,并以一个返回值结束,该返回值可以是一个值的元组。它必须缩进四个空格或一个制表符。
  • 赋给变量的值是 <local_block> 的返回值;如果没有任何 local block 被执行,则返回 na
  • 最后的 => <local_block> 允许你指定一个默认返回值,当结构中没有任何 case 被执行时使用。

来看一个使用表达式的 switch 示例:

A screenshot of a computer codeAI-generated content may be incorrect.

代码说明:

  • 首先定义一个指标,名称为 "Switch using an expression",描述为空,overlay=true 表示在价格图表上叠加显示。
  • 创建一个 字符串类型输入变量 maType:默认值为 "EMA",标签为 "MA type",可选值为 ["EMA", "SMA", "RMA", "WMA"]。用户可以在图表设置中选择不同类型的均线。
  • 创建一个 整数类型输入变量 maLength:默认值为 10,标签为 "MA length",最小值限制为 2。用于指定均线计算的周期长度。
  • 使用 带表达式的 switch,根据 maType 的值选择对应均线计算:
  • 如果 maType == "EMA" → 执行 ta.ema(close, maLength)
  • 如果 maType == "SMA" → 执行 ta.sma(close, maLength)
  • 如果 maType == "RMA" → 执行 ta.rma(close, maLength)
  • 如果 maType == "WMA" → 执行 ta.wma(close, maLength)
  • 如果没有匹配的值 → 执行 => 后的兜底代码块:
    • 触发运行时错误 runtime.error("No matching MA type found.")
    • 返回 float(na),确保返回类型与其他 block 一致,避免编译报错。
  • 将 ma 的值绘制到图表上,显示所选类型和周期的均线。

编写完代码后,我们可以回到图表中进行操作,在设置中通过我们创建的变量下拉框选择均线的类型,最终将所选均线显示在图表上。

A screen shot of a graphAI-generated content may be incorrect.

总结而言,Pine Script 提供了灵活的条件语句,包括 if 和 switch 两种形式。通过它们,我们可以根据不同条件或用户输入动态控制指标的计算与显示,实现个性化的图表逻辑。掌握这些条件语句,是编写高效、可交互指标的关键。

Related Articles

Recent Articles