策略测试器
本手册介绍如何使用 JForex4 的策略测试器(Strategy Tester)对策略进行回测,内容涵盖设置、测试方法、订单执行逻辑以及如何解读测试结果。
打开策略测试器
- 在顶部菜单栏中点击 View,然后选择 Strategy Tester。
- 测试器将作为新标签页打开,与 Orders、Positions 和 Messages 标签页并列显示。
- 从下拉菜单中选择您的策略。如果该策略尚未添加到工作区,请先点击 Open 将其添加。
- (可选) 点击 Edit 可在代码编辑器中打开策略的源代码——仅当存在
.java源文件时可用。
配置测试
账户设置
点击 Account 以定义模拟交易账户:
- 初始存款金额及账户货币
- 杠杆比例
- 保证金止损水平(占已用杠杆的百分比)
- 净值止损(MC Equity)——当净值低于该水平时,自动停止测试
交易品种
点击 Instruments 以选择需要下载历史数据的交易品种。请选择策略在交易或计算中所用到的全部品种。
注意:这不是用来选择策略实际交易品种的地方——该品种是单独设定的,要么在策略中硬编码,要么稍后在 Define Parameters 窗口中选择。
采样周期与时间框架
选择历史数据的日期范围(Sample Period)以及时间框架(Time Frame):
- Ticks(逐笔数据)——使用真实的历史逐笔数据(最精确,但速度最慢)。
- 蜡烛图(Candles)(1 分钟 / 1 小时 / 1 天)——速度更快,通过插值方式从 OHLC 蜡烛数据生成逐笔数据。同时可选择以 Bid 或 Ask 作为基准。
可视化模式
启用可视化模式(Visual Mode)可在测试运行时于实时图表上观看模拟过程。启用后,Start 按钮还会解锁播放控制功能,可用于暂停测试或调整回放速度。
优化
如果您的策略含有可配置参数,可启用优化(Optimization)功能,在一次运行中测试多种参数组合。对于每个参数(除交易品种和周期外),您可以设定最小值、步进值和最大值——策略将针对每一种步进组合分别测试一次。
每种组合的结果会显示在测试器窗口下方区域。右键点击任意一行,可取消该项、复制其设置、查看其报告,或重新使用其输入参数。
利润因子(Profit Factor)= 总盈利 ÷ 总亏损(两者均取正值)。例如,总盈利为 1000、总亏损为 250 时 → 利润因子 = 4.0。该值始终为正数,数值越高,通常表示盈利交易与亏损交易的比例越有利。
逐笔数据过滤器(仅适用于 Ticks 时间框架)
当时间框架选择为 Ticks 时,可选择逐笔数据的过滤方式:
| 过滤器 | 行为 |
|---|---|
| Process all ticks(处理全部逐笔数据) | 最精确,但速度最慢——重放曾记录的每一笔数据。 |
| Process all ticks with a different non-recurrent price(处理价格非重复的逐笔数据) | 跳过价格与前一笔相同的数据。 |
| Process ticks on a market direction(按市场方向处理逐笔数据) | 跳过数据,除非其代表价格方向上真正的转折点。 |
| Process ticks on a predefined price range change(按预设价格区间变化处理逐笔数据) | 在价格变动达到设定区间之前跳过数据。 |
| Process ticks with the specified time interval(按指定时间间隔处理逐笔数据) | 根据设定的时间间隔跳过数据。 |
插值方法(仅适用于蜡烛图时间框架)
当时间框架选择为蜡烛图周期(1 分钟、1 小时、1 天)时可用。测试器不下载真实的逐笔数据,而是通过对 OHLC 蜡烛数据进行插值来生成合成逐笔数据——从而大幅提升测试速度。
| 方法 | 说明 |
|---|---|
| Cubic Spline(三次样条插值) | 基于蜡烛图数据中最精确的方法。以 OHLC 价格作为基准点,通过三次样条插值构建逐笔数据。对于极短周期(例如 10 秒),偶尔可能生成比真实数据源更多的逐笔数据。 |
| 4 ticks at OHLC(按 OHLC 生成 4 笔数据) | 现有插值方法中最可靠的一种。 将每根蜡烛插值为恰好 4 笔价格数据——开盘价(Open)、最高价(High)、最低价(Low)和收盘价(Close)。High 和 Low 的先后顺序取决于两者与开盘价的接近程度:距开盘价更近的一方将作为第二笔处理,排在另一方之前。 |
| Tick on Open(以开盘价生成单笔数据) | 使用蜡烛的开盘价生成一笔数据。 |
| Tick on Close(以收盘价生成单笔数据) | 使用蜡烛的收盘价生成一笔数据。 |
示例:如果您的策略基于 1 分钟蜡烛图交易,且不需要更精细的粒度,请选择 1 Min 作为时间框架,并选择 4 ticks at OHLC 作为插值方法——这样策略每分钟将恰好收到 4 笔数据(先是开盘价,随后按接近程度排列的最高价/最低价,最后是收盘价)。
自定义设置
- Save interpolated price data(保存插值生成的价格数据)——保留或丢弃通过插值生成的逐笔数据。
- 可视化模式: 显示/隐藏净值(Equity)、余额(Balance)和盈亏(P/L);选择已保存的图表模板(Template);设置可视化模式期间默认显示的周期(Period)。
- 消息: 启用 Save Messages to 将消息保存至文件;启用 Save Reports to 将报告保存至文件;启用 Show Reports 以在测试结束后自动打开报告。
订单处理逻辑
准确理解测试器的订单成交方式,对于信任回测结果至关重要。
一般规则: 订单按其自身价格执行——但出现市场跳空(gap)时除外(例如市场在中断后重新开盘并出现跳空)。在跳空情况下:
- LIMIT(限价)订单将以优于订单价格的价格成交。
- 未设置 MAX.SLIPPAGE 的 STOP(止损)订单将在跳空后以第一个可用价格成交。
- 设置了 MAX.SLIPPAGE 的 STOP 订单,若其执行价格将超出该滑点限制范围,则会自动重新提交为 LIMIT 订单。
详细成交逻辑:
- 在 BID 一侧触发的订单,将与插值生成的 BID 蜡烛价格进行比较;在 ASK 一侧触发的订单,将与插值生成的 ASK 蜡烛价格进行比较。
- 若订单(无论类型)由 CLOSE、HIGH 或 LOW 价格数据触发,则按订单自身价格成交,如有必要会根据最近已知点差进行调整(当触发来自相反一侧时,将进行此项调整)。
- 若订单由 OPEN 价格数据触发,则按相应一侧的该 OPEN 价格成交——但设置了 MAX.SLIPPAGE 的 STOP 订单除外:若 OPEN 数据超出该 STOP 订单的滑点限制范围,该订单将转换为 LIMIT 订单。
提示:由于"4 ticks at OHLC"始终为每根蜡烛包含一笔 Open 数据,因此每当您使用该插值方法进行测试时,此项由 OPEN 触发的逻辑(及其 STOP/MAX.SLIPPAGE 例外情况)都会直接适用。
运行测试
- 点击 Start 按钮。
- Define Parameters 窗口将打开——在此设置策略的可配置数值(交易品种、数量、滑点、止损/止盈等)。具体显示的字段取决于您策略的代码。
- 点击 Run 开始模拟。
- 若已启用可视化模式,可使用播放控制功能在测试运行期间暂停或减慢速度。
- 测试完成后(基于大量逐笔数据的测试可能需要较长时间),若已启用 Show Reports,测试报告将自动在浏览器中打开。
查看结果
报告内容包括逐笔交易结果、净值/余额曲线,以及利润因子等汇总统计数据(如上文所述)。如果您运行了优化扫描,请在测试器窗口下方的结果列表中比较各参数组合的报告,然后再选定要采用的配置。
最佳实践
- 在最终验证阶段,请从 Ticks / "Process all ticks" 开始测试——这是最接近真实市场状况的模拟方式,尽管速度最慢。
- 在快速迭代阶段使用蜡烛图插值。 在开发或调整策略期间,"4 ticks at OHLC" 无需下载完整的逐笔历史数据,即可提供快速、可靠的反馈。
- 使插值/逐笔过滤方式的选择与策略逻辑相匹配。 对 OPEN 价格作出反应的策略,在"4 ticks at OHLC"下与在"Tick on Close"下的表现会有所不同——请确保您的测试方法与策略在真实市场中的触发逻辑相匹配。
- 留意 MAX.SLIPPAGE 的相关影响。 如果您的策略依赖 STOP 订单,请分别在设置和未设置 MAX.SLIPPAGE 的情况下进行测试,以了解跳空及 OPEN 数据触发场景可能如何将您的订单转换为 LIMIT 成交。
- 请注意: 测试器中显示的历史业绩并不能可靠地预示未来表现——在实盘交易前,请务必在模拟环境中进一步验证。