mcpField
M
mph-pine

mph-pine

github.com/mphinance开发3236 次安装2 天前更新
代码仓库

关于 mph-pine

用于按 mphinance 风格构建或移植 TradingView Pine Script v6 指标与策略的技能。重点包括忠实移植、v6 检查、仪表板,以及由用户在 TradingView 中完成编译。

主要功能

  1. 01构建与移植 Pine Script v6
  2. 02匹配源逻辑与常量
  3. 03遵循 mphinance 代码风格
  4. 04添加仪表板与 AI 可读数据行
  5. 05使用可复用的数学与告警模式
  6. 06检查 v6 陷阱与格式要求

适用场景

  1. 01将 Python 扫描器移植到 Pine
  2. 02为指标扩展告警功能
  3. 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 扫描器、筛选规则),则将其视为事实依据,先忠实移植,再添加其他内容。

流程

  1. 先以 v6 为准。 编写前查阅当前文档(context7 / pine-script 文档 MCP,或 tradingview.com/pine-script-docs)。不要依赖 v5 的习惯。确认版本行是 //@version=6。
  2. 找到事实依据。 如果要移植,请从头到尾阅读 Python 或现有 Pine 代码,并准确匹配字段名称、常量和阈值。在头部注释中注明这些常量。只有在忠实移植完成后才能添加新行为,并明确说明哪些部分是新增的。
  3. 按内部风格搭建框架。 头部注释块、调色板常量、分组输入、计算、绘图、图表绘制、警报、仪表盘。参见下方模板。
  4. 根据 v6 易错点检查清单(见下方)检查最终文件。
  5. 检查长破折号。 搜索文件中的 U+2014 和 U+2013,包括代码注释和字符串字面量。将其替换为连字符或逗号。这是生成代码中最常见的内部规范遗漏。
  6. 交付编译。 没有离线 Pine 编译器。将完成的脚本放入用户的剪贴板,并告知他们将其粘贴到 TradingView 的 Pine 编辑器中,点击 Save 和 Add to chart,然后报告任何红色错误。修复报告的错误,并重新加载剪贴板。
  7. 保存并提出交付。 将文件写入相关仓库中的 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 是唯一的编译器,操作由用户负责。
  • 下单或接入实盘订单。指标仅供参考。
  • 以上未描述的任何内容。如果用户想扩展到相关领域,先征求同意,再扩展技能。

评论

支持 Markdown