在做日内交易时,我们最关心的就是特定时间。
比如,你可能只想在美股的交易时段执行策略,而过滤掉盘前和盘后的信号。
input.session() 函数就是Pine Script提供的、用来在输入面板上创建时间区间选择器的工具 。
它的实战用途非常明确:
- 指定策略只在某个时间区间内模拟交易 。
- 让脚本只在特定时间内生成警报 。
- 为图表的某个特定时段(如“伦敦盘”)添加背景色 。
input.session() 有两种形态:一种是让用户手动输入时间,另一种是提供一个预设好的时段下拉菜单(使用 options 参数) 。
input.session() 的“使用秘钥”
这是新手最容易卡住的地方,input.session() 函数本身,只返回一个时段字符串,比如 "0930-1600" 。
这个字符串本身不能直接用于 if 判断。你必须借助Pine Script的内置函数 time() 来激活它。
time() 函数能帮你判断当前K线是否落在了你指定的这个时段内,因此我们通常会封装一个辅助函数来重复使用:
// 检查当前K线是否发生在指定时段内
InSession(sessionTimes) =>
not na(time(timeframe.period, sessionTimes))
拆解:
time(timeframe.period, sessionTimes):这就是秘钥。它会检查当前K线(timeframe.period)是否位于sessionTimes之内。- 如果在时段内,它会返回一个时间值;如果不在时段内,它会返回
na(空值)。 not na(...):我们用not na()来判断结果。如果结果不是空值(即not na为true),就说明当前K线在时段内。
在后续的代码中,你就可以用 if InSession(你的输入变量) 来做各种判断了。
input.session() 的参数
defval:(必填) 默认的时段字符串 。必须使用24小时制,如"0930-1600"。对于隔夜时段(如从17:15到第二天17:00),你可以写"1715-1700"。title:(强烈建议) 输入项的名称,即显示在设置面板上的标签,如"交易时间"。options:(推荐) 提供一个固定的时段列表(字符串数组),让输入框变成一个下拉菜单。例如options=["0930-1600", "0800-1200", "1300-1700"]。tooltip:鼠标悬停在“i”图标上时,显示的详细帮助文本 。group:分组标题,用于组织多个相关的输入项 。inline:内联ID,用于将多个输入项显示在同一行 。
重要提醒: 所有这些参数(如 defval, title 等)的值,都必须是常量(写死的值),不能是动态的变量 。
实战代码示例
基础示例:为交易时间上色
我们来实战一下前面讲的 InSession() 辅助函数,用它来给指定的交易时段添加背景色。
// 1. 定义
InSession(sessionTimes) =>
not na(time(timeframe.period, sessionTimes))
// 2. 创建
tradeTimes = input.session("0700-1300", title="交易时间")
// 3. 应用
bgcolor(InSession(tradeTimes) ? color.new(color.orange, 80) : na)
这段代码会把 “07:00” 到 “13:00” 之间的所有K线都涂上80%透明度的橘色背景,非常直观 。
进阶示例:带分组和提示的隔夜时段
// 定义
stratSession = input.session("1715-1700", title="策略时段",
group="其他设置",
tooltip="指定策略在一天中的哪个时间生成交易。适用于周一到周日。")
这个输入:
- 默认是一个从17:15到第二天17:00的隔夜时段 。
- 在设置面板上,它会出现在一个名为“其他设置”的分组下面 。
- 当用户鼠标悬停时,会显示
tooltip里的详细说明 。
input.session() 的局限性
- 最大时长23:59: 一个时段输入的最大持续时间是23小时59分钟 ,如果你的时间范围需要跨越多天(比如回测窗口),请不要用它,改用两个
input.time()来分别设置开始和结束日期。 input.session()vsinput.time():input.session()是一个循环的时间区间(比如“每天的09:30到16:00”)。而input.time()是一个特定的时间点(比如“2020年12月7日下午2:35”)。- 不支持秒: 只能精确到分钟 。
- 24小时制: 必须使用24小时制,不支持AM/PM 。
完整示例脚本:只在特定时段显示均线
这个脚本将演示如何使用 input.session() 来控制绘图,让均线只在指定时段内显示。
//@version=6
indicator(title="交易时段输入示例", overlay=true)
// --- 1. 定义 ---
InSession(sessionTimes) =>
not na(time(timeframe.period, sessionTimes))
// --- 2. 创建 ---
sessionTime = input.session("0930-1200", title="交易时间")
fastAvgLength = input.int(20, title="快线平均周期")
slowAvgLength = input.int(80, title="慢线平均周期")
// --- 3. 计算 ---
fastAverage = ta.ema(close, fastAvgLength)
slowAverage = ta.sma(close, slowAvgLength)
// --- 4. 绘图 ---
plot(InSession(sessionTime) ? fastAverage : na, style=plot.style_linebr,
color=color.orange, title="快线 EMA")
plot(InSession(sessionTime) ? slowAverage : na, style=plot.style_linebr,
color=color.teal, title="慢线 SMA")
这个脚本的精髓在于 plot() 函数中的条件操作符 (?:) 。 InSession(sessionTime) ? fastAverage : na 这行代码的意思是:“如果当前K线在 sessionTime 时段内,就绘制 fastAverage 的值;否则,就绘制 na(空值),即不画。” plot.style_linebr(带断点的线)这个样式是必须的,它能确保线条在 na 值出现时正确地中断,而不会强行连接起来 。
总结
input.session() 函数是日内交易策略和时间分析的利器。
- 它只返回一个时段字符串(如 “0930-1600″) 。
- 它必须配合
time()函数(通常封装在InSession()辅助函数中)才能发挥作用 。 - 善用它可以极大地优化你的策略逻辑和图表视觉效果。


