如何把 NinjaTrader 的图表数据、OHLCV 和指标数值导出为 CSV
NinjaTrader 通过其 Data Manager 原生导出 OHLCV K 线数据:右键点击某个品种,选择导出,就会得到一个以分号分隔的 CSV,包含日期、时间、开盘价、最高价、最低价、收盘价和成交量。指标数值不在该导出之内。要取出指标数值,需要编写一个把数值输出到文件的 NinjaScript 指标。下面介绍这两条路径的做法。
- NinjaTrader 的 Data Manager 把 OHLCV K 线数据导出为分号分隔的 CSV;格式是日期和时间,然后依次是开盘价、最高价、最低价、收盘价、成交量。
- 标准的 OHLCV 导出不包含指标数值,需要用 NinjaScript 导出指标把数值写入文件。
- 要得到 OHLCV 加指标的合并输出,需要在导出 K 线数据的同时运行 NinjaScript 导出,再把两份输出合并。
如何从 NinjaTrader 导出 OHLCV K 线数据
NinjaTrader 8 把历史 K 线数据存储在自己的本地数据库中。导出方法:打开 Control Center,进入 Tools > Historical Data(某些版本中叫 Data Manager),右键点击你想要的品种,选择 Export。选择日期范围和周期,然后确认。NinjaTrader 会把 CSV 写入你所选的输出文件夹。
导出的 CSV 默认使用分号而不是逗号作为分隔符。日内周期的列顺序是:Date;Time;Open;High;Low;Close;Volume,日线则是 Date;Open;High;Low;Close;Volume。日期格式为 YYYYMMDD,时间格式为 HHMMSS。
OHLCV 导出涵盖 NinjaTrader 已为该品种和周期下载的所有历史数据。如果你需要更多历史数据,请先通过平台的历史数据下载工具下载,再进行导出。
标准的 NinjaTrader OHLCV 导出不包含什么
Data Manager 的 OHLCV 导出只包含 K 线数据。它不包含:基于这些 K 线计算出的指标数值、绘图对象或批注数据、交易历史,以及交易时段层面的笔记。
这个文件只是原始价格数据的导出。指标计算层完全存在于 NinjaTrader 的执行环境中,不会被序列化到 K 线数据文件里。如果你的分析工作流依赖价格旁边的特定指标读数,只有 OHLCV 的导出无法携带这些上下文。
关于在导出 OHLCV 的同时结构化导出绘图和批注数据,请阅读 /resources/articles/ninjatrader-drawing-export。
| 数据类型 | 是否包含在 Data Manager 导出中 |
|---|---|
| 开盘价、最高价、最低价、收盘价(每根 K 线) | 是 |
| 成交量(每根 K 线) | 是 |
| 日期和时间戳 | 是 |
| 指标数值(EMA、RSI、VWAP 等) | 否 |
| 绘图对象和批注 | 否 |
| 交易历史和成交 | 否 |
| 交易时段层面的笔记 | 否 |
NinjaTrader 的品种列表和合约月份:按季度还是按月
品种列表位于 NinjaTrader 控制中心 Tools 菜单下的 Instrument Lists。一个列表把多个品种归为一组,让你可以一次对所有品种运行 Strategy Analyzer 或 Market Analyzer,或者快速把它们加载到其他窗口。
NinjaTrader 中的期货名称带有到期月份,例如 ES 12-26。新合约月份多久出现一次由交易所决定:ES 和 NQ 等 CME 股指期货按季度挂牌合约(3 月、6 月、9 月和 12 月),而原油(CL)每个月都挂牌一张合约。常见的股指期货都不是一年只挂牌一次。
合约到达展期日期时,依次选择 Tools、Database Management,即可把品种向前展期。NinjaTrader 的帮助指南说明,展期会更新所有品种列表以及已打开工作区中各窗口的到期月份,你需要保存工作区来保留这项更改。NinjaScript 策略不会自动展期。
导出时,请检查 Tools、Options、Market data 下的 Merge Policy。MergeBackAdjusted 会把各个到期月份拼接成一段连续的历史,并在展期日期加上偏移;Do Not Merge 只保留一个合约月份。把合约月份和合并设置写进文件名,以后才能对上这些 K 线。
- 股指期货(ES、NQ):按季度,3 月、6 月、9 月、12 月。
- 原油(CL):每个月一张新合约。
- 在 Database Management 中展期会更新每个品种列表;请重新保存工作区。
- Merge Policy 决定导出的历史只涵盖一张合约还是多张合约。
如何从 NinjaTrader 导出指标数值
要把指标数值放进 CSV 文件,你需要编写一个 NinjaScript 指标,计算出你想要的数值,并在每根 K 线更新时把它写入文件。NinjaTrader 的 NinjaScript 环境可以使用 System.IO 来写文件。
基本模式是:在 State.DataLoaded 的 OnStateChange 中,打开一个指向目标文件路径的 StreamWriter。在 OnBarUpdate 中,如果 BarsInProgress == 0 并且 IsFirstTickOfBar,就把当前 K 线的 Date、Time 和指标数值写入 StreamWriter。在 State.Terminated 的 OnStateChange 中,关闭 StreamWriter。
StreamWriter 的方法,可以为 NinjaTrader 库中任何可用的指标,或你自己编写的任何自定义指标,生成逐根 K 线的记录。输出是一个带分隔符的文本文件,你可以在电子表格中打开,或导入任何分析工具。关于不依赖平台的导出替代方案,请阅读 /resources/articles/thinkorswim-to-csv-xlsx-annotations。
把 OHLCV 和指标数值合并到一个文件
合并 OHLCV K 线和指标数值有两种方法。第一种是编写一个 NinjaScript 导出指标,在每一行中同时输出 OHLCV 字段和指标数值,这样所有内容都与同一个 K 线时间戳对齐。
第二种方法是从 Data Manager 导出 OHLCV,再通过 NinjaScript 单独导出指标数值,然后在电子表格或脚本中以共同的时间戳作为连接键,把两个文件合并。两个文件之间的时间戳格式必须一致,合并才能正确进行。
单文件的 NinjaScript 方法更便于分析,但实现需要具备 NinjaScript 技能。合并的方法在时间戳格式一致的情况下无需自定义代码。
NinjaTrader 导出的不足,以及何时需要补充
无论是通过 Data Manager 还是通过 NinjaScript,NinjaTrader 的导出工作流在逐根 K 线提取数据方面都很可靠,但只要超出原始 OHLCV,就需要 NinjaScript 开发。对于非开发者,指标数值的导出是一道不小的门槛。
另一个局限是批注的可移植性:在 NinjaTrader 中画的图表绘图、笔记文字和支撑阻力价位,都不在 OHLCV 或指标的导出里。对于需要把图表上下文和 K 线数据一起带走的工作流,需要补充一层批注导出。
关于这一层独立于平台的批注,请阅读 /resources/articles/chart-annotation-export-for-trading-journal-xlsx-csv;想跨平台对比各种指标导出方法,请阅读 /resources/articles/export-tradingview-indicator-values-csv。
常见问题
- NinjaTrader 能原生把指标数值导出为 CSV 吗?
- 不能。Data Manager 的 OHLCV 导出只包含 K 线的价格和成交量数据。要导出指标数值,需要编写一个使用 System.IO.StreamWriter 的 NinjaScript 指标,在每次 K 线更新时把数值写入文件。
- 可以从 NinjaTrader 图表导出哪些 OHLCV 数据?
- 使用 Data Manager,你可以导出 NinjaTrader 已下载的任何品种和周期的日期、时间、开盘价、最高价、最低价、收盘价和成交量。输出是分号分隔的 CSV。日内导出包含时间列;日线导出不包含。
- 获取 NinjaTrader 图表数据用于外部分析的最佳方式是什么?
- 对于 OHLCV K 线数据:使用 Data Manager 导出。对于指标数值:编写一个 NinjaScript 导出指标,把每根 K 线的指标读数连同 OHLCV 字段一起写入文件。如果使用两次独立的导出,就按时间戳合并输出。
- NinjaTrader 的 CSV 导出使用什么分隔符格式?
- NinjaTrader 的默认 CSV 导出使用分号而不是逗号作为分隔符。导入 Excel 或其他工具时,请在导入过程中选择“分号”而不是逗号作为分隔符。
- NinjaTrader 的期货合约是按季度还是按月?
- 这取决于交易所的挂牌方式。ES 和 NQ 在 3 月、6 月、9 月和 12 月挂牌季度合约;CL 每个月都挂牌。NinjaTrader 按到期月份为每张合约命名,例如 ES 12-26;依次选择 Tools、Database Management,可以把品种列表展期到下一个月份。