策略测试器

本手册介绍如何使用 JForex4 的策略测试器(Strategy Tester)对策略进行回测,内容涵盖设置方法、测试方式、订单执行逻辑以及如何解读测试结果。


1. 打开策略测试器

  1. 在顶部菜单栏中转到 View,然后选择 Strategy Tester
  2. 测试器将作为新标签页打开,与 Orders(订单)、Positions(仓位)和 Messages(消息)标签页并列。
  3. 从下拉菜单中选择您的策略。如果该策略尚未添加到工作区,请先点击 Open 将其添加。
  4. (可选) 点击 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. 运行测试

  1. 点击 Start 按钮。
  2. Define Parameters(定义参数) 窗口将打开——在此设置策略的可配置数值(品种、交易量、滑点、止损/止盈等)。具体显示的字段取决于您的策略代码。
  3. 点击 Run 开始模拟运行。
  4. 如果启用了可视化模式,可使用回放控制功能在测试运行过程中暂停或降低速度。
  5. 测试完成后(基于大量逐笔数据的测试可能需要较长时间),测试报告将自动在浏览器中打开(前提是已启用 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成交。
  • 请记住: 测试器中显示的历史表现并不能可靠地预示未来表现——在实盘交易之前,请始终在模拟账户环境中进一步验证。