如何在Pine Script中按时间帧切换security函数并统一结果类型及指标计算?
在Pine Script中按时间帧切换security函数并统一返回类型
要解决request.security()(返回float序列)和request.security_lower_tf()(返回float数组)的类型不一致问题,核心思路是将数组转换为序列,确保两者返回值格式统一,从而无缝使用ta.sma()这类需要序列输入的指标函数。
关键逻辑修正
首先明确:request.security_lower_tf()仅用于请求比当前主时间帧周期更短的更低时间帧数据。你原代码中的判断条件写反了,正确的判断逻辑应为:
- 当目标时间帧
tf的周期短于主时间帧时,使用request.security_lower_tf() - 否则(
tf是更高或相同时间帧),使用request.security()
统一返回类型的实现
将request.security_lower_tf()返回的数组提取最后一个元素(对应主时间帧K线内最新的更低时间帧数据),转换为float序列,与request.security()的返回类型对齐。
完整代码示例
//@version=5 indicator("时间帧切换Security示例", overlay=false) // 配置参数 string target_symbol = syminfo.tickerid // 目标标的,可自行替换 input_timeframe tf = input.timeframe("D", "目标时间帧") // 初始化持久化序列变量,存储统一后的结果 var float unified_result = na // 按时间帧切换函数并处理返回值 if timeframe.in_seconds(tf) < timeframe.in_seconds(timeframe.period) // 请求更低时间帧数据,返回数组 lower_tf_data_arr = request.security_lower_tf(target_symbol, tf, close - open) // 提取数组最后一个元素,转为序列 unified_result := array.size(lower_tf_data_arr) > 0 ? array.get(lower_tf_data_arr, array.size(lower_tf_data_arr) - 1) : na else // 请求更高/相同时间帧数据,直接返回序列 unified_result := request.security(target_symbol, tf, close - open) // 基于统一后的序列计算指标 sma_50 = ta.sma(unified_result, 50) // 可视化结果 plot(unified_result, color=color.new(color.blue, 0), title="统一序列") plot(sma_50, color=color.new(color.red, 0), title="50周期SMA", linewidth=2)
核心说明
- 变量类型声明:用
var float unified_result = na声明一个持久化的float序列,确保每次K线更新时能持续存储数据,符合指标函数对序列输入的要求。 - 数组转序列:通过
array.get()提取数组最后一个元素,将数组类型转换为单值序列,与request.security()的返回格式完全统一。 - 边界处理:加入
array.size(lower_tf_data_arr) > 0判断,避免数组为空时触发错误。
内容的提问来源于stack exchange,提问作者Damiano Dotto
相关产品推荐
相关产品推荐

