Skip to content

交易信号

Language Details Code Coverage License Package Version

使用 JavaScript / TypeScript 运行技术分析的技术指标与叠加指标库。

动机

“trading-signals” 库为常见技术指标提供了 TypeScript 实现。它非常适合算法交易,让开发者能够为自动化交易策略执行信号计算。

所有指标都可以通过流式数据(价格或 K 线)调用 add 方法随时间更新。部分指标还提供了 static 批处理方法,当在回测或历史数据导入时一次性提供数据,可进一步提升性能。你可以通过运行提供的 演示脚本 并执行 npm start 来尝试流式输入数据,该脚本使用键盘输入流。

安装

bash
npm install trading-signals

用法

CommonJS:

ts
const {SMA} = require('trading-signals');

ESM:

ts
import {SMA} from 'trading-signals';

示例:

typescript
import {SMA} from 'trading-signals';

const sma = new SMA(3);

// 可以逐个添加数值:
sma.add(40);
sma.add(30);
sma.add(20);

// 也可以一次性添加多个数值:
sma.updates([20, 40, 80]);

// 可以替换之前的某个数值(在实时图表中很有用):
sma.replace(40);

// 可以检查指标是否已稳定:
console.log(sma.isStable); // true

// 如果指标已稳定,可以获取其结果:
console.log(sma.getResult()); // 50.0003

// 也可以在不使用可选链的情况下获取结果:
console.log(sma.getResultOrThrow()); // 50.0003

// 同样支持多种精度:
console.log(sma.getResultOrThrow().toFixed(2)); // "50.00"
console.log(sma.getResultOrThrow().toFixed(4)); // "50.0003"

// 每个指标还包含便捷功能,如“最低”和“最高”历史值:
console.log(sma.lowest?.toFixed(2)); // "23.33"
console.log(sma.highest?.toFixed(2)); // "53.33"

何时使用 add(...)

要输入数据,你需要调用指标的 add 方法。根据是否已达到该区间所需的最小输入数据量,add 方法可能会返回指标的结果,也可能不会。

何时使用 getResultOrThrow()

你可以在任何时候调用 getResultOrThrow(),但除非指标已接收到最小数据量,否则会抛出错误。如果在指标尚未接收到所需数量的输入值时就调用 getResultOrThrow(),将会抛出 NotEnoughDataError

示例:

ts
import {SMA} from 'trading-signals';

// 我们的周期为 3,因此需要 3 个输入值
const sma = new SMA(3);

// 我们提供 2 个输入值
sma.add(10);
sma.add(40);

try {
  // 我们会得到一个错误,因为最少需要 3 个输入值
  sma.getResultOrThrow();
} catch (error) {
  console.log(error.constructor.name); // "NotEnoughDataError"
}

// 我们提供第 3 个输入值
sma.add(70);

// 现在,我们将获得正确的结果
console.log(sma.getResultOrThrow()); // 40

大多数时候,所需的最小数据量取决于所使用的周期/时间区间。如果不确定,请查看该指标的测试文件,以了解正确用法的示例。

技术指标类型

  • 衰竭指标:识别趋势衰竭和潜在反转。
  • 动量指标:衡量价格在特定方向上的变动速度和力度
  • 趋势指标:衡量趋势的方向(上升趋势、下降趋势或横盘趋势)
  • 波动率指标:衡量价格随时间变化的幅度,不考虑方向
  • 成交量指标:基于成交量衡量趋势的强度

支持的技术指标

  1. 加速带(ABANDS)
  2. 加速震荡器(AC)
  3. 平均趋向指数(ADX)
  4. 平均真实波幅(ATR)
  5. 动量震荡器(AO)
  6. 布林带(BBANDS)
  7. 布林带宽度(BBW)
  8. 重心(CG)
  9. 商品通道指数(CCI)
  10. 动向指数(DMI / DX)
  11. 双指数移动平均线(DEMA)
  12. 双移动平均线(DMA)
  13. 指数移动平均线(EMA)
  14. 四分位距(IQR)
  15. 线性回归(LINREG)
  16. 平均绝对偏差(MAD)
  17. 动量(MOM / MTM)
  18. 移动平均收敛背离(MACD)
  19. 能量潮(OBV)
  20. 抛物线转向(PSAR)
  21. 区间扩张指数(REI)
  22. 变动率(ROC)
  23. 相对移动平均线(RMA)
  24. 相对强弱指数(RSI)
  25. 简单移动平均线(SMA)
  26. Spencer 15 点移动平均(SMA15)
  27. 随机震荡器(STOCH)
  28. 随机 RSI(STOCHRSI)
  29. Tom Demark 序列指标(TDS)
  30. 真实波幅(TR)
  31. 成交量加权平均价(VWAP)
  32. 加权移动平均线(WMA)
  33. 威尔德平滑移动平均线(WSMA / WWS / SMMA / MEMA)
  34. 之字形指标(ZigZag)

工具方法:

  1. 平均值 / 均值
  2. 网格划分(用于网格交易机器人
  3. 最大值
  4. 中位数
  5. 最小值
  6. 四分位数
  7. 标准差
  8. 连涨/连跌

性能

浮点运算注意事项

JavaScript 使用双精度浮点运算。例如,0.1 + 0.2 得到 0.30000000000000004,这是由于二进制浮点表示造成的。

JavaScript 算术

虽然这并不完全精确,但在实际应用中通常无关紧要,因为指标往往使用平均值,而平均值已经平滑了精度。在测试用例中,你可以使用 Vitest 的 toBeCloseTo 断言来控制精度。

该库的较早版本(直到版本 6)使用 big.js 进行任意精度运算,但这使计算平均慢了约 100 倍。因此,从版本 7 开始移除了对 big.js 的支持。

免责声明

trading-signals 的信息和发布不构成财务建议、投资建议、交易建议或任何其他形式的建议。trading-signals 的所有结果仅用于信息目的。

在根据您自己的个人情况做出任何投资之前,进行自己的分析非常重要。如果您需要财务建议或更一般的建议,建议您在自己的司法管辖区内确定一位具备相关资质的个人为您提供相应建议。

替代方案

维护者

Benny Neugebauer on Stack Exchange

⭐️ 成为 TypeScript 摇滚明星! ⭐️

该包由 Benny Code 构建。查看我的 TypeScript 课程,成为编程摇滚明星!

许可证

本项目采用 MIT 许可证。

Last updated: