func — 技术指标公式计算 CLI
行为规则(必须遵守)
- 必须使用
~/projects/pi-go/bin/func 二进制执行指标计算,禁止自己编写 Python/JS/Go 等代码来实现相同功能。
- 如果用户没有提供 CSV 文件,先询问数据来源或帮用户准备 CSV(用 curl 下载、从 API 获取等),然后用
func 处理。
- 如果用户说的指标名不精确(如"均线"、"MA"),根据上下文推断合理的参数(如周期),构造 func 公式后执行。
- 执行后将输出展示给用户,必要时解读结果。
执行流程
Step 1 — 确认数据
用户是否已提供 CSV 文件?
- 已提供:直接进入 Step 2
- 未提供:
- 如果上下文中有标的(如"AAPL"),帮用户获取数据并保存为 CSV
- 否则询问:需要计算哪个标的/哪段时间的数据?
Step 2 — 构造公式
根据用户需求,用 func 语法构造公式。例如:
| 用户说 |
构造公式 |
| "算下 MA" |
ma5=ma(c,5); ma10=ma(c,10); ma20=ma(c,20) |
| "均线交叉" |
ma5=ma(c,5); ma20=ma(c,20); golden=cross(ma5,ma20) |
| "布林带" |
mid=ma(c,20); std=stddev(c,20); upper=mid+2*std; lower=mid-2*std |
| "涨跌幅" |
prev=ref(c,1); change=(c-prev)/prev*100 |
| "KDJ RSV" |
low9=llv(l,9); high9=hhv(h,9); rsv=(c-low9)/(high9-low9)*100 |
Step 3 — 执行
~/projects/pi-go/bin/func '<公式>' <csv文件路径>
或管道:
cat data.csv | ~/projects/pi-go/bin/func '<公式>'
如需保存结果:
~/projects/pi-go/bin/func '<公式>' input.csv > output.csv
Step 4 — 可视化展示(必须遵守)
计算完成后,在聊天回复中直接输出一个 ```html 代码块,画出 K 线 + 指标叠加图。
⚠️ 严格禁止:
- ❌ 不要把 HTML 写成文件(不要
write_file、不要 > xxx.html)
- ❌ 不要用
open 命令打开浏览器
- ✅ 唯一正确做法:在回复文本中直接写
```html\n<完整HTML>\n```,前端会自动渲染
步骤:
- 从
func 输出的 CSV 中提取 dates、open、high、low、close、volume 和计算出的指标列
- 按
visual-skills 的 Candlestick 模板,将数据内联到 DATA 对象
- 将指标(MA、EMA 等)作为 ECharts
line series 叠加到 K 线图上
- 在回复中直接输出完整 HTML,用
```html 围栏包裹
示例输出格式(回复中直接写):
```html
<!DOCTYPE html>
<html>
<head><meta charset="utf-8">
<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.3/echarts.min.js"></script>
<style>*{margin:0;padding:0}body{background:#0d1117}#main{width:100%;height:100vh}</style>
</head>
<body><div id="main"></div>
<script>
const DATA = {
title: "AAPL", dates: [...], open: [...], close: [...], low: [...], high: [...],
volume: [...], ma5: [...], ma20: [...]
};
// ... ECharts candlestick + line overlay
</script>
</body></html>
```
图表会自动显示在右侧 HTML Preview 面板中。
公式语法
变量名=表达式
- 多个公式用空格或分号
; 分隔
- 变量名可自定义(如
ma5、my_ema、signal)
- 表达式中可引用前面定义的变量
CSV 列名自动检测(大小写不敏感)
| 数据 |
可识别列名 |
| 开盘 |
open, o |
| 最高 |
high, h |
| 最低 |
low, l |
| 收盘 |
close, c |
| 成交量 |
volume, vol, v |
| 时间 |
time, timestamp, date, datetime, t |
时间排序自动检测(正序/倒序),输出保持原始顺序。
内置变量
| 变量 |
别名 |
含义 |
c |
C, close |
收盘价序列 |
o |
O, open |
开盘价序列 |
h |
H, high |
最高价序列 |
l |
L, low |
最低价序列 |
v |
V, volume, vol |
成交量序列 |
内置函数速查
均线
| 函数 |
签名 |
说明 |
ma |
ma(series, period) |
简单移动平均(同 sma) |
sma |
sma(series, period) |
简单移动平均 |
ema |
ema(series, period) |
指数移动平均 |
统计
| 函数 |
签名 |
说明 |
stddev |
stddev(series, period) |
滚动标准差 |
sum |
sum(series, period) |
滚动求和 |
corr |
corr(series1, series2) |
相关系数 |
slope |
slope(series, period) |
线性回归斜率 |
极值
| 函数 |
签名 |
说明 |
max |
max(s1, s2) |
逐元素取大 |
min |
min(s1, s2) |
逐元素取小 |
hhv |
hhv(series, period) |
滚动最高值 |
llv |
llv(series, period) |
滚动最低值 |
条件与逻辑
| 函数 |
签名 |
说明 |
if |
if(cond, true_val, false_val) |
条件选择 |
cross |
cross(s1, s2) |
上穿判断 |
not |
not(series) |
逻辑取反 |
count |
count(cond, period) |
窗口内为真次数 |
引用
| 函数 |
签名 |
说明 |
ref |
ref(series, n) |
引用 n 周期前的值 |
barssince |
barssince(cond) |
距上次为真的 bar 数 |
barslast |
barslast(cond) |
同 barssince |
barscount |
barscount(series) |
序列总长度 |
数学
| 函数 |
签名 |
说明 |
abs |
abs(series) |
绝对值 |
运算符
+ - * / > >= < <= == != && ||
所有函数名大小写均可(ma / MA)。
1---
2name: func
3version: 1.1.0
4description: >-
5 技术指标计算 CLI 工具。对 OHLCV CSV 数据执行公式计算(MA、EMA、SMA、STDDEV、CROSS、RSI 等),
6 输出原始列 + 新指标列。支持正序/倒序时间戳自动检测、灵活列名匹配、管道输入。
7 当用户需要计算均线、技术指标、量化策略回测指标时触发。
8author: pi-go
9---
10
11# func — 技术指标公式计算 CLI
12
13## 行为规则(必须遵守)
14
151. **必须使用 `~/projects/pi-go/bin/func` 二进制执行指标计算,禁止自己编写 Python/JS/Go 等代码来实现相同功能。**
162. 如果用户没有提供 CSV 文件,先询问数据来源或帮用户准备 CSV(用 curl 下载、从 API 获取等),然后用 `func` 处理。
173. 如果用户说的指标名不精确(如"均线"、"MA"),根据上下文推断合理的参数(如周期),构造 func 公式后执行。
184. 执行后将输出展示给用户,必要时解读结果。
19
20---
21
22## 执行流程
23
24### Step 1 — 确认数据
25
26用户是否已提供 CSV 文件?
27
28- **已提供**:直接进入 Step 2
29- **未提供**:
30 - 如果上下文中有标的(如"AAPL"),帮用户获取数据并保存为 CSV
31 - 否则询问:需要计算哪个标的/哪段时间的数据?
32
33### Step 2 — 构造公式
34
35根据用户需求,用 func 语法构造公式。例如:
36
37| 用户说 | 构造公式 |
38|--------|----------|
39| "算下 MA" | `ma5=ma(c,5); ma10=ma(c,10); ma20=ma(c,20)` |
40| "均线交叉" | `ma5=ma(c,5); ma20=ma(c,20); golden=cross(ma5,ma20)` |
41| "布林带" | `mid=ma(c,20); std=stddev(c,20); upper=mid+2*std; lower=mid-2*std` |
42| "涨跌幅" | `prev=ref(c,1); change=(c-prev)/prev*100` |
43| "KDJ RSV" | `low9=llv(l,9); high9=hhv(h,9); rsv=(c-low9)/(high9-low9)*100` |
44
45### Step 3 — 执行
46
47```bash
48~/projects/pi-go/bin/func '<公式>' <csv文件路径>
49```
50
51或管道:
52
53```bash
54cat data.csv | ~/projects/pi-go/bin/func '<公式>'
55```
56
57如需保存结果:
58
59```bash
60~/projects/pi-go/bin/func '<公式>' input.csv > output.csv
61```
62
63### Step 4 — 可视化展示(必须遵守)
64
65计算完成后,**在聊天回复中直接输出一个 ` ```html ` 代码块**,画出 K 线 + 指标叠加图。
66
67⚠️ **严格禁止**:
68- ❌ 不要把 HTML 写成文件(不要 `write_file`、不要 `> xxx.html`)
69- ❌ 不要用 `open` 命令打开浏览器
70- ✅ 唯一正确做法:在回复文本中直接写 ` ```html\n<完整HTML>\n``` `,前端会自动渲染
71
72**步骤**:
731. 从 `func` 输出的 CSV 中提取 dates、open、high、low、close、volume 和计算出的指标列
742. 按 `visual-skills` 的 Candlestick 模板,将数据内联到 DATA 对象
753. 将指标(MA、EMA 等)作为 ECharts `line` series 叠加到 K 线图上
764. 在回复中直接输出完整 HTML,用 ` ```html ` 围栏包裹
77
78**示例输出格式**(回复中直接写):
79
80````
81```html
82<!DOCTYPE html>
83<html>
84<head><meta charset="utf-8">
85<script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/5.4.3/echarts.min.js"></script>
86<style>*{margin:0;padding:0}body{background:#0d1117}#main{width:100%;height:100vh}</style>
87</head>
88<body><div id="main"></div>
89<script>
90const DATA = {
91 title: "AAPL", dates: [...], open: [...], close: [...], low: [...], high: [...],
92 volume: [...], ma5: [...], ma20: [...]
93};
94// ... ECharts candlestick + line overlay
95</script>
96</body></html>
97```
98````
99
100图表会自动显示在右侧 HTML Preview 面板中。
101
102---
103
104## 公式语法
105
106```
107变量名=表达式
108```
109
110- 多个公式用**空格**或**分号 `;`** 分隔
111- 变量名可自定义(如 `ma5`、`my_ema`、`signal`)
112- 表达式中可引用前面定义的变量
113
114---
115
116## CSV 列名自动检测(大小写不敏感)
117
118| 数据 | 可识别列名 |
119|------|-----------|
120| 开盘 | `open`, `o` |
121| 最高 | `high`, `h` |
122| 最低 | `low`, `l` |
123| 收盘 | `close`, `c` |
124| 成交量 | `volume`, `vol`, `v` |
125| 时间 | `time`, `timestamp`, `date`, `datetime`, `t` |
126
127时间排序自动检测(正序/倒序),输出保持原始顺序。
128
129---
130
131## 内置变量
132
133| 变量 | 别名 | 含义 |
134|------|------|------|
135| `c` | `C`, `close` | 收盘价序列 |
136| `o` | `O`, `open` | 开盘价序列 |
137| `h` | `H`, `high` | 最高价序列 |
138| `l` | `L`, `low` | 最低价序列 |
139| `v` | `V`, `volume`, `vol` | 成交量序列 |
140
141---
142
143## 内置函数速查
144
145### 均线
146
147| 函数 | 签名 | 说明 |
148|------|------|------|
149| `ma` | `ma(series, period)` | 简单移动平均(同 sma) |
150| `sma` | `sma(series, period)` | 简单移动平均 |
151| `ema` | `ema(series, period)` | 指数移动平均 |
152
153### 统计
154
155| 函数 | 签名 | 说明 |
156|------|------|------|
157| `stddev` | `stddev(series, period)` | 滚动标准差 |
158| `sum` | `sum(series, period)` | 滚动求和 |
159| `corr` | `corr(series1, series2)` | 相关系数 |
160| `slope` | `slope(series, period)` | 线性回归斜率 |
161
162### 极值
163
164| 函数 | 签名 | 说明 |
165|------|------|------|
166| `max` | `max(s1, s2)` | 逐元素取大 |
167| `min` | `min(s1, s2)` | 逐元素取小 |
168| `hhv` | `hhv(series, period)` | 滚动最高值 |
169| `llv` | `llv(series, period)` | 滚动最低值 |
170
171### 条件与逻辑
172
173| 函数 | 签名 | 说明 |
174|------|------|------|
175| `if` | `if(cond, true_val, false_val)` | 条件选择 |
176| `cross` | `cross(s1, s2)` | 上穿判断 |
177| `not` | `not(series)` | 逻辑取反 |
178| `count` | `count(cond, period)` | 窗口内为真次数 |
179
180### 引用
181
182| 函数 | 签名 | 说明 |
183|------|------|------|
184| `ref` | `ref(series, n)` | 引用 n 周期前的值 |
185| `barssince` | `barssince(cond)` | 距上次为真的 bar 数 |
186| `barslast` | `barslast(cond)` | 同 barssince |
187| `barscount` | `barscount(series)` | 序列总长度 |
188
189### 数学
190
191| 函数 | 签名 | 说明 |
192|------|------|------|
193| `abs` | `abs(series)` | 绝对值 |
194
195### 运算符
196
197`+` `-` `*` `/` `>` `>=` `<` `<=` `==` `!=` `&&` `||`
198
199所有函数名大小写均可(`ma` / `MA`)。