关于 mph-pine
用于按 mphinance 风格构建或移植 TradingView Pine Script v6 指标与策略的技能。重点包括忠实移植、v6 检查、仪表板,以及由用户在 TradingView 中完成编译。
主要功能
- 01构建与移植 Pine Script v6
- 02匹配源逻辑与常量
- 03遵循 mphinance 代码风格
- 04添加仪表板与 AI 可读数据行
- 05使用可复用的数学与告警模式
- 06检查 v6 陷阱与格式要求
适用场景
- 01将 Python 扫描器移植到 Pine
- 02为指标扩展告警功能
- 03创建 v6 图表仪表板
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mphinance/ alpha-skills --skill mph-pine安装后在 Claude Code 中输入/mph-pine确认已加载。
附带文件channels.pineREADME.md
详细介绍
Mph Pine
构建 TradingView Pine Script v6 指标,使其外观和行为与 mphinance 自有套件中的脚本一致(channels.pine、ghost_dashboard.pine、ghost_alpha.pine)。数学逻辑忠实、v6 代码整洁、合成波风格仪表盘,以及一行压缩的 AI 可读载荷,让 Gemini 或 Sam 能读取图表。
适用场景
当用户要求构建、移植或扩展 TradingView 指标或策略时使用:“编写一个 pine 指标”“针对 X 的 TradingView 指标”“将此 Python 信号移植到 Pine”“为我的脚本添加警报”“/mph-pine”。如果用户提到现有引擎(Python 扫描器、筛选规则),则将其视为事实依据,先忠实移植,再添加其他内容。
流程
- 先以 v6 为准。 编写前查阅当前文档(context7 / pine-script 文档 MCP,或 tradingview.com/pine-script-docs)。不要依赖 v5 的习惯。确认版本行是
//@version=6。 - 找到事实依据。 如果要移植,请从头到尾阅读 Python 或现有 Pine 代码,并准确匹配字段名称、常量和阈值。在头部注释中注明这些常量。只有在忠实移植完成后才能添加新行为,并明确说明哪些部分是新增的。
- 按内部风格搭建框架。 头部注释块、调色板常量、分组输入、计算、绘图、图表绘制、警报、仪表盘。参见下方模板。
- 根据 v6 易错点检查清单(见下方)检查最终文件。
- 检查长破折号。 搜索文件中的 U+2014 和 U+2013,包括代码注释和字符串字面量。将其替换为连字符或逗号。这是生成代码中最常见的内部规范遗漏。
- 交付编译。 没有离线 Pine 编译器。将完成的脚本放入用户的剪贴板,并告知他们将其粘贴到 TradingView 的 Pine 编辑器中,点击 Save 和 Add to chart,然后报告任何红色错误。修复报告的错误,并重新加载剪贴板。
- 保存并提出交付。 将文件写入相关仓库中的
docs/pine/<name>.pine。提出使用/ship。未经用户要求,绝不提交。
v6 易踩坑清单
从 v5 迁移或凭记忆编写时,以下 v6 破坏性变更和陷阱容易导致问题:
bool不能是na。 切勿写var bool x = na。三态标志请使用int(0 / 1 / -1)。na()、nz()、fixnan()不再接受 bool。int或float不会隐式转换为 bool。 请写显式比较:if count > 0,而不是if count。and/or采用惰性求值。 短路求值没有问题,但不要依赖右侧操作数中的副作用。- 枚举和
input.enum。 使用可选的field = "Title"字符串声明enum Name,然后写input.enum(Name.first, "Label")。请使用==比较。这样比魔法字符串更简洁。 - 动态
request.security。 一次调用可以接受series string类型的标的或时间周期。使用lookahead=barmerge.lookahead_off,避免重绘。 input.timeframe("")的时段外技巧。 空时间周期表示图表时间周期。对于可选的高时间周期确认,切勿在空字符串上用三元运算符控制request.security的调用(Pine 会求值两个分支)。应在回退值(htf_on ? htf_tf : timeframe.period)上调用request.security,并在关闭时忽略结果。plotchar/plotshape参数必须是 const。char、text和location不能是 series。方向相关的标记应拆成两次调用,分别固定使用location.belowbar/location.abovebar。- 用户函数必须位于全局作用域。 在顶层声明每个
f_*(),切勿将其放在if块或局部作用域中。 - 中位数。 Pine 没有
ta.median。请使用ta.percentile_linear_interpolation(src, len, 50)。 - Pine 不会直接提供斜率或 r2。 请自行实现最小二乘法(见下方代码片段)。
- 绘制持久对象或循环遍历历史数据时,在
indicator()中设置较大的max_bars_back、max_lines_count、max_labels_count。 - 每根柱线执行开销较大的循环(枢轴扫描、多轮拟合)可能会在较长的日内历史数据上触发执行时间限制。请适度设置回看长度,并说明相应的权衡。
代码风格模板
// <Name> [mph1nance] - <one line purpose>
// (c) mph1nance + Sam the Quant Ghost
//
// PURPOSE: <what it does and why it beats the generic version>
// Faithful port of <source>. Constants: <list them>.
//@version=6
indicator("<Name> [mph1nance]", "<glyph>", overlay=true, max_bars_back=600, max_lines_count=30, max_labels_count=50)
// Synthwave palette (reuse these names)
const color C_BULL = #00FFFF
const color C_BEAR = #FF00FF
const color C_NEUTRAL = #9C27B0
const color C_BREAK = #FF3D00
const color C_CONF = #00FFCC
const color C_WARN = #FFD740
const color C_BG = #090014
const color C_BORDER = #FF00FF
const color C_TEXT = #00FFFF
// Grouped inputs
g_main = "--- Main ---"
// ... input.int / input.float / input.enum, all with group=g_main
仪表板脚手架及 AI 载荷行
在 barstate.isfirst 时创建一次表格,在 barstate.islast 时填充表格。左列为标签,右列为数值,颜色表示含义。最后添加一行压缩的管道符分隔数据,方便 OCR 或截图读取器解析。
var table tbl = na
if barstate.isfirst and show_tbl
tbl := table.new(tbl_pos, 2, 16, bgcolor=C_BG, border_width=2, border_color=C_BORDER, frame_width=3, frame_color=C_BORDER)
if barstate.islast and show_tbl
int row = 0
table.cell(tbl, 0, row, "<TITLE>", text_color=C_TEXT, text_halign=text.align_center, bgcolor=color.new(C_BORDER, 70))
table.merge_cells(tbl, 0, row, 1, row)
row += 1
// ... one row per metric, color-coded ...
// Final AI payload row, merged across both columns:
string ai = syminfo.ticker + "|" + timeframe.period + "|" + verdict + "|" + str.tostring(value)
table.cell(tbl, 0, row, ai, text_color=color.new(C_TEXT, 75), text_size=size.tiny, text_halign=text.align_center)
table.merge_cells(tbl, 0, row, 1, row)
警报模式
将静态 alertcondition 调用(每个离散事件调用一次)与单个动态 alert() 配合使用,在柱线收盘时传递完整的上下文字符串。
alertcondition(brk_above, "Breakout up", "Price broke above")
if barstate.isconfirmed and (brk_above or brk_below)
alert(syminfo.ticker + " " + timeframe.period + " | " + verdict + " | " + str.tostring(score), alert.freq_once_per_bar_close)
可复用数学代码片段
最小二乘法:斜率、截距、r2
数组索引约定:a = 0 表示窗口中最旧的柱线,a = len-1 表示最新的柱线。索引 a 对应的序列偏移量为 src[(len-1)-a]。
f_linreg(float src, int len) =>
float n = len, sx = 0.0, sy = 0.0, sxx = 0.0, sxy = 0.0, syy = 0.0
for i = 0 to len - 1
float xi = i, yi = src[(len - 1) - i]
sx += xi
sy += yi
sxx += xi * xi
sxy += xi * yi
syy += yi * yi
float denx = n * sxx - sx * sx
float deny = n * syy - sy * sy
float slope = denx == 0.0 ? 0.0 : (n * sxy - sx * sy) / denx
float icept = (sy - slope * sx) / n
float r2 = (denx == 0.0 or deny == 0.0) ? 0.0 : math.max(0.0, math.min(1.0, math.pow(n * sxy - sx * sy, 2) / (denx * deny)))
[slope, icept, r2]
注意:在实际代码中,每个局部变量都应单独声明一行。Pine 不接受在一行中用逗号分隔多个声明。以上代码仅为文档示例而压缩。
残差标准差(用于标准差轨道)
循环遍历窗口,累加 (yi - (slope*i + icept))^2,返回 sqrt(sum / len)。结果与 numpy 的 np.std 一致。
成交量确认中位数
float vol_med = ta.percentile_linear_interpolation(volume, 20, 50)
bool vol_strong = vol_med > 0.0 and volume > 1.5 * vol_med // VOLUME_CONFIRM_MULT
盈亏几何关系
将止损设置在相关水平线之外一段缓冲距离(例如 0.5 ATR)。通道内的设置以另一侧轨道为目标;突破设置以测量走势幅度(一倍通道高度)为目标。除以数值前,务必确保 risk > 0。
受上下文过滤的蜡烛图形态
先检测原始形态,然后仅在该形态出现在某个水平位时才标记。在空白区域出现的锤子线只是噪声;在上升通道下轨处出现的锤子线则是信号。
float body = math.abs(close - open), rng = high - low
float up = high - math.max(close, open), dn = math.min(close, open) - low
bool doji = rng > 0.0 and body <= rng * 0.1
bool hammer = rng > 0.0 and dn >= body * 2.0 and up <= body and not doji
bool bull_eng = close > open and close[1] < open[1] and close >= open[1] and open <= close[1]
bool react_bull = tag_lower and (hammer or bull_eng) // tag_lower = price reached the level
硬性规则
- 任何地方都不能出现长破折号,包括代码注释和字符串字面量。交付前检查 U+2014 和 U+2013。将它们替换为连字符或逗号。
- 面向 Substack 的任何正文都不能使用 Markdown 表格。本规则针对交付内容,不针对此技能文件。
- 忠于原文优先于修饰。移植引擎时,首先准确匹配其字段名和常量。将每项新增内容标注为新增。
- 绝不能擅自编造用户未要求的指标行为。先提出方案,再着手实现。
- 没有离线 Pine 编译器。始终通过剪贴板交接到 TradingView 进行验证,绝不能仅凭检查就声称代码可以编译。
- 将脚本写入
docs/pine/<name>.pine。提供绝对路径。提供/ship选项,绝不自动提交。
不在范围内
- 自动编译或自动部署脚本。TradingView 是唯一的编译器,操作由用户负责。
- 下单或接入实盘订单。指标仅供参考。
- 以上未描述的任何内容。如果用户想扩展到相关领域,先征求同意,再扩展技能。