Редактор кода

Это руководство объясняет, как создавать, открывать и редактировать исходный код стратегии, индикатора или плагина с помощью встроенного Редактора кода JForex4, а также как компилировать и сохранять изменения.

Переименовано: Этот инструмент ранее называлcя «Редактор стратегий» (Strategy Editor). Теперь он называется Редактором кода (Code Editor), поскольку используется для редактирования не только Стратегий, но и Индикаторов и Плагинов.


Открытие редактора

Вы можете открыть Редактор кода двумя способами:

  • Создание нового кода: В панели Навигатор (слева внизу) щёлкните правой кнопкой мыши на соответствующем узле — Strategies, Indicators, Plugins (или на их соответствующих подузлах Custom) — и выберите New Strategy, New Indicator или New Plugin. Платформа создаст новый файл .java с соответствующим шаблоном и откроет его непосредственно в редакторе.
  • Редактирование существующего кода: Щёлкните правой кнопкой мыши на стратегии, индикаторе или плагине в Навигаторе или в соответствующей панели и выберите Edit. Это откроет его исходный файл (.java) в редакторе. Если присутствует только скомпилированный файл .jfx (без исходного кода), редактирование невозможно — вам потребуется оригинальный файл .java.

Примечание: Новые файлы по умолчанию сохраняются в JCloud. Если вы сохраняете файл под пользовательским именем, не забудьте также переименовать имя класса Java внутри файла, чтобы оно совпадало — имя класса и имя файла должны совпадать для успешной компиляции.

Понимание шаблона кода

Генерируемый шаблон зависит от того, что вы выбрали для создания:

  • New Strategy генерирует класс, реализующий IStrategy.
  • New Indicator генерирует класс, реализующий IIndicator.
  • New Plugin генерирует класс, реализующий IPlugin.

Остальная часть данного руководства фокусируется на редактировании стратегий в качестве основного примера, но тот же рабочий процесс редактора (открытие, редактирование, компиляция, сохранение) применяется и к Индикаторам, и к Плагинам — различается лишь способ их запуска после компиляции (см. Раздел 6).

Каждая стратегия — это класс Java, реализующий IStrategy, с минимальным набором методов, необходимых для компиляции:

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 Выполняется при каждом поступающем тике для подписанных инструментов.
onBar Выполняется при закрытии нового бара для подписанных инструментов/периодов.
onAccount Выполняется при изменениях состояния счёта (баланс, эквити, маржа).
onMessage Выполняется при событиях жизненного цикла ордеров/позиций (исполнения, отклонения и т. д.).
onStop Выполняется один раз при остановке стратегии — логика очистки.

Индикаторы и Плагины имеют свои собственные обязательные методы интерфейса (например, calculate() для IIndicator). Редактор кода автоматически генерирует правильные заглушки методов на основе того, какой вариант «New ...» вы выбрали на шаге 1.

Редактирование кода

Работайте непосредственно в панели редактора, добавляя вашу логику внутри соответствующих методов жизненного цикла. Например, чтобы выводить входящие тики в лог в стратегии:

package jforex;
import com.dukascopy.api.*;

public class Strategy1 implements IStrategy {
    private IConsole con = null;

    public void onStart(IContext context) throws JFException {
        // сохраняем консоль для вывода на вкладку Messages
        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 (для стратегий).
  • Добавление собственных расчётов индикаторов или ссылок на встроенные индикаторы.

Совет: Собственные классы индикаторов, используемые стратегией, должны быть определены в том же файле, если вы планируете запускать стратегию удалённо — удалённая среда не может загружать отдельные локальные файлы классов. Это также применимо к вспомогательным классам, используемым Индикаторами или Плагинами.

Компиляция изменений

После редактирования скомпилируйте файл, используя один из следующих способов:

  • Кнопку Compile на панели инструментов Редактора кода, либо
  • Сочетание клавиш F5, либо
  • Щёлкнув правой кнопкой мыши на стратегии, индикаторе или плагине в соответствующем списке Навигатора и выбрав Compile.

Результат компиляции отображается на вкладке Messages:

  • Compiling... OK — код успешно скомпилирован, и соответствующий файл .jfx сохранён рядом с исходным файлом .java.
  • Детали ошибки — если компиляция завершилась неудачно, вкладка Messages выводит список конкретных ошибок (номера строк, синтаксические проблемы и т. д.), чтобы вы могли найти и исправить их в редакторе.

Сохранение работы

  • Стандартное сохранение (Ctrl+S или кнопка Save на панели инструментов) записывает ваши изменения в исходный файл .java.
  • Если вы используете Save As для сохранения под новым именем файла, откройте файл после этого и переименуйте объявление public class в соответствии с новым именем файла — Java требует, чтобы имя публичного класса и имя файла были идентичны.

Запуск отредактированного кода

Способ запуска отредактированного кода после его компиляции зависит от того, какой тип артефакта вы редактировали — Стратегия, Индикатор или Плагин имеют разные механизмы запуска в JForex4:

  • Стратегии запускаются через Local run или Remote run:

    1. Щёлкните левой кнопкой мыши на стратегии в Навигаторе или выберите её в панели Strategies.
    2. Выберите Local run или Remote run (см. различия режимов ниже).
    3. Настройте параметры в диалоге Define Parameters, если появится запрос, затем нажмите Run.
    Режим Особенности для отредактированного кода
    Local run Полный доступ к локальным файлам, другим классам Java и графикам — удобно при активной отладке.
    Remote run Выполняется на сервере Dukascopy. Нет доступа к файловой системе, нет доступа к графикам (IContext.getChart() возвращает null); все инструменты должны быть явно подписаны в onStart, а собственные индикаторы должны быть самодостаточны в файле стратегии.

    Только Стратегии поддерживают Remote run на сервере Dukascopy. Индикаторы и Плагины не имеют режима удалённого выполнения.

  • Индикаторы не «запускаются» так, как стратегии — вместо этого они добавляются на график. Выберите скомпилированный индикатор в Навигаторе или панели Indicators и добавьте его на открытый график (например, с помощью перетаскивания, двойного щелчка или через меню индикаторов графика), чтобы увидеть, как он рассчитывается и отображается на основе живых или исторических данных о ценах. Настройте его параметры @Configurable в диалоге настроек индикатора на графике.

  • Плагины запускаются внутри самой платформы, а не привязываются к графику и не выполняются удалённо. Выберите скомпилированный плагин в Навигаторе или панели Plugins и запустите его напрямую; он работает внутри приложения JForex4, интегрируясь с интерфейсом платформы или рабочей областью в соответствии с заданным дизайном.


Рекомендации по редактированию

  • Используйте внешнюю IDE для серьёзной разработки. Встроенный Редактор кода JForex4 удобен для быстрых правок, но IDE (Eclipse, IntelliJ IDEA, NetBeans) предлагает проверку ошибок в реальном времени, автодополнение и инструменты рефакторинга, которые позволяют обнаружить ошибки ещё до попытки компиляции.
  • Перекомпилируйте после каждого значимого изменения и проверяйте вкладку Messages — не предполагайте, что сохранение прошло успешно, без прохождения компиляции.
  • Сначала тестируйте на демо-счёте. После редактирования логики стратегии, влияющей на размещение ордеров или параметры риска, всегда проводите бэктестинг (через Historical Tester) и демо-тестирование перед запуском в реальном режиме.
  • Храните резервные копии рабочих версий перед крупными изменениями, поскольку редактор перезаписывает файл .java непосредственно при сохранении.
  • Соответствие имени файла и имени класса необходимо соблюдать при каждом переименовании или дублировании файла стратегии, индикатора или плагина, чтобы избежать ошибок компиляции.