代码编辑器
本手册介绍如何使用 JForex4 内置的代码编辑器(Code Editor)创建、打开和编辑策略(Strategy)、指标(Indicator)或插件(Plugin)的源代码,以及如何编译和保存您的更改。
已更名: 该工具此前称为“Strategy Editor”(策略编辑器)。现在称为代码编辑器,因为它不仅用于编辑策略,还可用于编辑指标和插件。
1. 打开编辑器
您可以通过以下两种方式进入代码编辑器:
- 创建新代码: 在 Navigator(导航器)面板(左下方)中,右键点击相应的节点——Strategies、Indicators、Plugins(或其各自的 Custom 子节点)——然后选择 New Strategy、New Indicator 或 New Plugin。平台会生成一个带有相应骨架代码的新
.java文件,并直接在编辑器中打开。 - 编辑现有代码: 在 Navigator 或对应面板中,右键点击某个策略、指标或插件,选择 Edit。此操作会在编辑器中打开其源代码文件(
.java)。如果只有已编译的.jfx文件而没有源代码,则无法编辑——此时需要原始的.java文件。
注意:新文件默认保存到 JCloud。如果您以自定义名称保存文件,请记得同时修改文件内的 Java 类名(class name),使其与文件名一致——类名与文件名必须一致,编译才能成功。
2. 了解代码骨架
生成的骨架代码取决于您选择创建的内容:
- New Strategy 生成一个实现
IStrategy接口的类。 - New Indicator 生成一个实现
IIndicator接口的类。 - New Plugin 生成一个实现
IPlugin接口的类。
本手册的其余部分以策略编辑为主要示例,但相同的编辑器工作流程(打开、编辑、编译、保存)同样适用于指标和插件——只是编译后各自的启动方式有所不同(参见第 6 节)。
每个策略(Strategy)都是实现 IStrategy 接口的 Java 类,编译所需的最基本方法集如下:
package jforex;
import com.dukascopy.api.*;
public class Strategy1 implements IStrategy {
public void onStart(IContext context) throws JFException {}
public void onAccount(IAccount account) throws JFException {}
public void onMessage(IMessage message) throws JFException {}
public void onStop() throws JFException {}
public void onTick(Instrument instr, ITick tick) throws JFException {}
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}
}
| 方法 | 作用 |
|---|---|
onStart |
策略启动时运行一次——用于初始化、订阅交易品种、保存 IContext/IConsole。 |
onTick |
在每个订阅品种的新报价(tick)到达时运行。 |
onBar |
在订阅品种/周期的新 K 线(bar)收盘时运行。 |
onAccount |
在账户状态(余额、净值、保证金)发生变化时运行。 |
onMessage |
在订单/持仓生命周期事件(成交、拒单等)发生时运行。 |
onStop |
策略停止时运行一次——用于清理逻辑。 |
指标和插件各自有其所需实现的接口方法(例如
IIndicator的calculate()方法)。代码编辑器会根据您在第 1 步中选择的“New ...”选项,自动生成相应的方法框架。
3. 编辑代码
直接在编辑器窗格中工作,将您的逻辑添加到相应的生命周期方法中。例如,在策略中将传入的报价打印到日志:
package jforex;
import com.dukascopy.api.*;
public class Strategy1 implements IStrategy {
private IConsole con = null;
public void onStart(IContext context) throws JFException {
// store the console for printing to the Messages tab
this.con = context.getConsole();
}
public void onAccount(IAccount account) throws JFException {}
public void onMessage(IMessage message) throws JFException {}
public void onStop() throws JFException {}
public void onTick(Instrument instr, ITick tick) throws JFException {
con.getOut().println(instr + " " + tick.getAsk() + "/" + tick.getBid());
}
public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {}
}
此阶段常见的修改包括:
- 添加带有
@Configurable注解的公共字段,以便在运行策略、指标或插件时,参数能够在 Define Parameters(定义参数)对话框中显示。 - 在
onTick、onBar或onStart(策略)中添加订单逻辑(市价单/条件单、止损/止盈)。 - 添加自定义指标计算或引用内置指标。
提示:如果您打算远程(remotely)运行策略,策略所使用的自定义指标类必须定义在同一个文件内——远程环境无法加载单独的本地类文件。这同样适用于指标或插件所使用的辅助类。
4. 编译您的更改
编辑完成后,可通过以下任一方式编译文件:
- 点击代码编辑器工具栏中的 Compile(编译)按钮,或
- 使用快捷键 F5,或
- 在相应的 Navigator 列表中右键点击该策略、指标或插件,选择 Compile。
编译输出会显示在 Messages(消息)标签页中:
Compiling... OK——表示代码编译成功,并会在.java源文件旁生成对应的.jfx文件。- 错误详情——如果编译失败,Messages 标签页会列出具体错误(行号、语法问题等),以便您在编辑器中定位并修复。
5. 保存您的工作
- 标准保存(Ctrl+S 或工具栏中的 Save 按钮)会将您的更改写入
.java源文件。 - 如果您使用 Save As 以新文件名保存,之后请打开该文件,将
public class声明重命名以匹配新文件名——Java 要求公共类名与文件名必须一致。
6. 运行编辑后的代码
编译完成后如何启动编辑后的代码,取决于您编辑的是哪种类型的产物——策略、指标和插件在 JForex4 中各有不同的启动机制:
-
策略(Strategies)通过 Local run(本地运行)或 Remote run(远程运行)启动:
- 在 Navigator 中左键点击该策略,或在 Strategies 面板中选中它。
- 选择 Local run 或 Remote run(两种模式的区别见下表)。
- 如有提示,在 Define Parameters 对话框中配置参数,然后点击 Run。
模式 对编辑后代码的说明 Local run 可完全访问本地文件、其他 Java 类和图表——便于实时调试。 Remote run 在 Dukascopy 服务器上运行。无法访问文件系统,无法访问图表( IContext.getChart()返回null);所有交易品种都必须在onStart中显式订阅,且自定义指标必须完全包含在策略文件内。只有策略(Strategies)支持在 Dukascopy 服务器上进行 Remote run。指标和插件没有远程运行模式。
-
指标(Indicators)不像策略那样被“运行”——而是被添加到图表中。在 Navigator 或 Indicators 面板中选中已编译的指标,将其添加到已打开的图表上(例如通过拖放、双击或图表的指标菜单),即可看到它根据实时或历史价格数据进行计算和绘制。可在图表上指标的设置对话框中配置其
@Configurable参数。 -
插件(Plugins)是在平台内部启动的,而不是附加到图表或远程运行。在 Navigator 或 Plugins 面板中选中已编译的插件并直接启动;它会按照设计在 JForex4 应用程序内运行,与平台界面或工作区集成。
编辑最佳实践
- 正式开发请使用外部 IDE。 JForex4 内置的代码编辑器适合快速修改,但使用 IDE(如 Eclipse、IntelliJ IDEA、NetBeans)可获得实时错误检查、自动补全和重构工具,能在您尝试编译之前就发现错误。
- 每次重要修改后都重新编译并检查 Messages 标签页——不要仅凭保存成功就假设一切无误。
- 先在模拟账户中测试。 在修改涉及下单或风险参数的策略逻辑后,务必先通过历史测试器(Historical Tester)进行回测并在模拟环境中测试,然后再投入实盘运行。
- 在进行重大修改前备份可用版本,因为编辑器在保存时会直接覆盖
.java文件。 - 每次重命名或复制策略、指标或插件文件时,务必保持文件名与类名一致,以避免编译错误。