其他
在 TradingView 上用 Pine Script…
适用于创建、编写、实现或编码 Pine Script v6 指标与策略,并需要规避 2025 破坏性变更、重绘问题和 TradingView 限制。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 35/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 39/100 ×0.15
适用场景
在 TradingView 上用 Pin特定
解决思路
- 先确认脚本使用 `//@version=6`,并以生产级、高效、UDT 优先、最新 v6 特性为目标。
- 12 月 2025 行包裹规则:括号内表达式允许任意缩进,可灵活换行。
- 括号外换行仍严格:续行缩进不能是 4 的倍数,也不能与上一行同级。
- 三元运算符必须保持在同一行;长三元表达式先定义中间变量如 `trueText`/`falseText`,再 `result = condition ? trueText : falseText`。
- 3 月 2025 破坏性变更:传统 `for` 循环的 `to_num` 每次迭代前重新求值。
- 优先使用 `for...in` 遍历集合:`for element in myArray` 直接处理元素。
- 需要索引时用 `for [index, element] in myArray`。
- `for...in` 可用于数组、矩阵和映射;遍历映射用 `for [key, value] in myMap`。
- 如果必须用传统 `for`,先缓存边界:`size = array.size(arr)`,再 `for i = 0 to size`,避免数组增长导致无限循环。
- 注意 `for...in` 允许在迭代中修改数组/矩阵大小;映射不能在 `for...in` 中调整大小,应改用 `map.keys()` 数组。
- 2 月 2025 起作用域总数限制移除,函数、方法、循环、条件、类型和枚举的作用域现在无限制。
- 2 月 2025 `bid`/`ask` 变量只在 1T(tick)周期可用,其他周期返回 `na`。
- 7 月 2025 所有 input 函数支持 `active` 参数;用 `input.int(20, 'Custom MA Length', active=useCustomMA, tooltip=...)` 让控件在条件不满足时置灰。
- 7 月 2025 `syminfo.current_contract` 用于连续期货,返回标的合约 ticker,非连续品种返回 `na`。
- 11 月 2025 `syminfo.isin` 返回 12 位 ISIN,不可用时为空字符串。
- 9 月 2025 `plot` 支持 `linestyle`:`plot.linestyle_solid`、`plot.linestyle_dashed`、`plot.linestyle_dotted`。
- 10 月 2025 `time()` 和 `time_close()` 支持 `timeframe_bars_back` 参数;正数表示过去,负数表示未来预期时间戳,例如 `time('D', timeframe_bars_back=5)`。
- 8 月 2025 字符串最大长度增至 40,960 字符(旧为 4,096)。
- 6 月 2025 库可导出常量:`export const float PI = 3.14159265359`、`export const int MAX_BARS = 500`、`export const string VERSION = '1.0.0'`。
- 5 月 2025 在 Renko、Line Break、Kagi、Point & Figure、Range 等非时间图表上,开放实时 bar 的 `time_close` 返回 `na`,`time_close[1]` 在 bar 关闭后立即可用。
- 4 月 2025 百分比式 ticker 样式:对 Renko/Kagi/PnF 使用 `PercentageLTP`,例如 `ticker.renko(syminfo.tickerid, 'PercentageLTP', 1.0)`。
- 3 月 2025 可用 `box.set_xloc()` 创建后修改 box 的 x 坐标,支持 `xloc.bar_index` 和 `xloc.bar_time`。
- 绝不在局部作用域使用 `plot()`:`if`、`for`、自定义函数内均报错。
- 条件绘图用全局 `plot(condition ? value : na)`,条件着色用 `plot(value, color=condition ? color.blue : na)`。
- 局部作用域需要动态绘制时改用 `line.new(...)`、`label.new(...)`、`box.new(...)`。
- 对任何复杂数据结构,先定义 UDT(用户定义类型),再写其他代码。
- UDT 优先的收益:封装相关数据和绘图对象;用 `method` 添加行为;用 `xloc.bar_time` 获得无限回看;用单个 `array<MyType>` 替代多个并行数组;让绘图对象自管理。
- UDT 定义放在 input 之后、计算之前;类型内同时存时间坐标(如 `startTime`、`endTime`)和 bar 索引(如 `startBarIndex`、`endBarIndex`)。
- UDT 类型字段可包含数据参数(`slope`、`intercept`、`stdDev`、`pearsonR`)、状态标志(`isLive`、`isOriginal`)和绘图对象(`line centerLine = na`、`upperLine`、`lowerLine`、`linefill fill = na`)。
- 为 UDT 添加 `delete()` 方法,删除 `centerLine`、`upperLine`、`lowerLine`、`fill` 等绘图对象,并将字段设为 `na`。
- 为 UDT 添加计算方法,例如 `method calculateY(Regression this, int barIdx) => this.slope * barIdx + this.intercept`。
- 为 UDT 添加 `draw()` 方法;先调用 `this.delete()` 清理旧绘图,再用 `line.new(startTime, startY, endTime, endY, xloc=xloc.bar_time, color=baseColor, width=width)` 绘制。
- 对可能需要历史显示的绘图对象,始终使用 `xloc.bar_time`,不要用 `xloc.bar_index`(后者限制 5000 bar)。
- 正确示例:`line.new(time[100], y1, time, y2, xloc=xloc.bar_time)`;错误示例:`line.new(bar_index - 100, y1, bar_index, y2, xloc=xloc.bar_index)`。
- 事件发生时同时保存 `time` 和 `bar_index`:`eventTime := time` 用于绘图,`eventBarIndex := bar_index` 用于 Y 计算。
- 用单个 UDT 数组存储,如 `var array<Regression> regressions = array.new<Regression>()`,不要维护 6+ 个并行数组。
- 创建新 UDT 实例时使用命名参数填充所有字段:`Regression.new(startTime=..., endTime=..., startBarIndex=..., endBarIndex=..., slope=..., intercept=..., stdDev=..., pearsonR=...)`,再 `array.push(regressions, newRegression)`。
- 遍历 UDT 数组用 `for...in`:`for reg in regressions` 内根据 `reg.slope` 选择颜色并 `reg.draw(...)`。
- 需要索引时用 `for [i, reg] in regressions`,并对最后一个元素做特殊处理(如 `i == array.size(regressions) - 1`)。
- 事件开始/结束时捕获时间与 bar 索引,并创建同时包含两套坐标系统的 UDT,例如 `MyType.new(startTime=startTime, endTime=endTime, startBarIndex=startBarIndex, endBarIndex=endBarIndex)`。
- 按 UDT 架构检查清单执行:先定义 UDT;存 `time` 用于绘图坐标;存 `bar_index` 用于 Y 计算;把 `line`/`box`/`label` 作为 UDT 字段;提供 `delete()`;提供使用 `xloc.bar_time` 的 `draw()`;用单个 `array<MyType>`;用 `for...in` 遍历 UDT 数组。
- 需要查询 Pine Script 文档时,使用 `pinescript` MCP 服务器工具:`pine_reference` 查函数/变量/类型(如 `ta.sma`、`plot`)。
- 用 `pine_guide` 按主题检索指南页(语法、执行模型、重绘等)。
- 用 `pine_search` 在所有 Pine Script 文档中全文搜索。
- 用 `pine_examples` 查找带上下文的代码示例。
- 项目文件保存到 `/projects/[project-name].pine`,并更新文件头为准确项目信息;不要创建不必要文件。
- 指标模板:文件头写 `// built with PineScript Agents by TradersPost`,加 `//@version=6`,调用 `indicator(title='', shorttitle='', overlay=true)`。
- 策略模板:同样写文件头和 `//@version=6`,调用 `strategy(title='', shorttitle='', overlay=true)`,并在 `strategy()` 调用之后放置 `//@strategy_alert_message {{strategy.order.alert_message}}`。
- 策略模板按区段组织:INPUTS(按 Main Settings、Visual Settings 等分组,带 `tooltip`;视觉输入可用 `active=showPlots` 置灰);CALCULATIONS(循环前缓存边界);CONDITIONS;PLOTS(使用 `linestyle=plot.linestyle_solid` 等);ALERTS。
- 遵守 TradingView 2025 限制:历史引用最多 500 bars。
- 最多 500 个 `plot`/`hline`/`fill` 输出。
- 最多 64 个绘图对象(`label`/`line`/`box`/`table`)。
- 最多 40 个 `security()` 调用。
- 编译脚本最大 100KB。
- 表格最多 100 个单元格。
- 数组最多 100,000 个元素。
- 字符串最多 40,960 字符。
- 作用域无限制(2025 年 2 月起)。
- 平台怪癖:`bar_index` 从 0 开始。
- 注意计算中的 `na` 传播。
- 注意历史计算与实时计算的差异。
- 策略默认在 bar 收盘计算,除非启用 `calc_on_every_tick`。
- `bid`/`ask` 仅在 1T 周期可用。
- 避免重绘:信号使用 `barstate.isconfirmed`,例如 `if barstate.isconfirmed and buyCondition` 再 `strategy.entry('Long', strategy.long)`。
- 正确使用 `request.security()`:设置 `lookahead=barmerge.lookahead_off`。
- 性能优化:缓存重复计算(如先算 `sma20 = ta.sma(close, 20)`、`sma50 = ta.sma(close, 50)`,再算 `crossUp = ta.crossover(sma20, sma50)`)。
- 合并 `security()` 调用:用 `[htfClose, htfHigh, htfLow] = request.security(syminfo.tickerid, 'D', [close, high, low])`。
- 用户体验:使用 2025 的 input group 与 `active` 参数,例如 `advancedMode = input.bool(false, 'Advanced Mode', group='Settings')`,`advSetting = input.int(10, 'Advanced Setting', group='Settings', active=advancedMode, tooltip='...')`。
- 错误处理:检查 `na`,如 `safeValue = na(value) ? 0 : value`。
- 错误处理:防除零,如 `safeDiv = denominator != 0 ? numerator / denominator : 0`。
- 错误处理:传统循环前缓存 `array.size(arr)`,再 `for i = 0 to arrSize - 1`。
- 代码审查架构优先:检查复杂数据是否 UDT 优先;绘图对象是否用 `xloc.bar_time`;是否捕获时间值;是否用单个 UDT 数组而非并行数组。
- 代码审查脚本基础:检查 `//@version=6`;策略检查 `//@strategy_alert_message {{strategy.order.alert_message}}` 是否在 `strategy()` 调用之后;检查 title 和 overlay 设置。
- 代码审查输入与 UX:检查 inputs 是否有 tooltip 和 group;是否适当使用 `active`;是否使用新 plot linestyles;plot 样式是否合适。
- 代码审查代码质量:无重绘问题;处理 `na`;缓存循环边界;计算高效;变量命名清晰;必要时添加 alert conditions。
- 最终交付:编写生产可用、高效、采用 UDT 优先架构并使用最新 Pine Script v6 特性的代码。
适用边界 · 注意事项
- 不适用于 Pine Script v5 或更早版本。
- 不适用于非 TradingView 平台或其他语言的指标/策略开发。
- 若无法访问 `pinescript` MCP 服务器,则文档查询相关步骤不可用。