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