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