Учебное пособие по стратегии Dukascopy

Учебник по стратегии.

Это руководство содержит информацию о том, как создавать и развивать стратегии JForex. Учебное пособие начинается с простой стратегии, которая только печатает сообщение, а затем переходит к торговой стратегии, которая с каждым разделом становится все более развитой по мере добавления исторических данных, использования индикаторов и графиков. Хотя все указанные стратегии могут быть разработаны на платформе JForex, пожалуйста, рассмотрите возможность использования интегрированной среды разработки (IDE) для разработки стратегии..

Простая стратегия.

Сначала мы создадим простую стратегию, щелкнув правой кнопкой мыши узел «Стратегии» на панели «Навигатор» и выбрав «Новая стратегия»..

Платформа JForex генерирует новый файл и открывает его в редакторе. Попробуйте скомпилировать файл, нажав F5 или кнопку компиляции:

JForex попросит вас указать имя и сохранить файл java на жестком диске..

Если вы сохраните файл с другим именем, не забудьте изменить имя класса в сгенерированном файле. Имя файла и имя класса должны совпадать. Например. если мы сохраним файл как StartStrategy.java, тогда имя класса также должно быть StartStrategy.

Изменить onStart.

Сгенерированный класс стратегии реализует интерфейс IStrategy. Методы стратегии реализуются с пустыми телами методов в сгенерированном java-файле стратегии. Измените метод onStart. Этот метод вызывается каждый раз при запуске стратегии. Заполните тело метода onStart следующим кодом:

Скомпилируйте файл, нажав F5 или кнопку компиляции.

Запустите стратегию.

Протестируйте стратегию, щелкнув ее правой кнопкой мыши в JForex и выбрав Local Run. .

Есть три признака, которые указывают на то, что стратегия была вызвана:

Значок стратегии изменится под узлом Стратегии — добавлен зеленый треугольник, указывающий, что стратегия находится в рабочем состоянии:

Во вкладке Сообщения добавляется новое сообщение:

Открывается новая вкладка для запущенной стратегии. Эта вкладка показывает результат работы стратегии. В этом случае мы видим, что оператор println был успешно выполнен и напечатан. " Вызывается метод onStart () ":

Сделать простую торговлю.

Определить параметры.

Параметры стратегии устанавливаются перед выполнением метода onStart. Откройте java-файл стратегии в редакторе и добавьте параметр в java-файл. Прочтите статью Параметры стратегии, чтобы узнать больше о параметрах стратегии..

Скомпилируйте файл. При запуске стратегии "Определить параметры" появится диалоговое окно. Здесь можно изменить значения параметров стратегии..

После установки значений параметров выберите «Выполнить», чтобы запустить стратегию..

Получение полосок и тиков.

В этой части урока мы используем ранее определенные параметры. Эти параметры используются для получения объектов IBar и ITick. Чтобы узнать больше о барах и тиках, можно посетить History Bars или History Ticks..

Сначала определите бар и отметьте галочкой. ссылки на объекты в классе:

Инициализируйте ссылки на объекты previousBar и myLastBar в методе onStart с помощью методов IHistory.getBar и IHistory.getLastTick:

Затем мы должны дать некоторый вывод, чтобы можно было проверить значения на диаграмме и в выводе стратегии:

Перед запуском стратегии необходимо подписаться на инструмент с помощью метода IContext.setSubscribedInstruments. Поместите следующий код перед кодом инициализации IBar:

Скомпилируйте файл.

Когда кто-то запускает стратегию, происходят три вещи:

Если выбранного инструмента нет в списке окна инструментов, он добавляется (поэтому нам нужно подписать инструмент; если инструмент не подписан, то стратегия работать не будет)

Отображается сообщение на вкладке «Сообщения». В сообщении также показаны значения параметров..

Выходные сообщения стратегии отображаются на вкладке стратегии..

Обратите внимание на значения открытия и закрытия бара. Они потребуются для сравнения значений диаграммы и значений столбцов..

Сравните результаты стратегии с результатами диаграммы!

Откройте нужный график по инструменту, который будет выбран в "Определить параметры" диалог. Установите для графика то же значение периода, что и в "Определить параметры" диалог. Далее запускаем стратегию. Сравните параметры открытия, закрытия, максимума, минимума и объема на вкладке вывода стратегии и на последнем завершенном баре графика. Они должны быть одинаковыми:

Совершить сделку.

Сначала напишите оператор импорта для импорта перечисления OrderCommand. Это перечисление определяет команды — ПРОДАЖА и КУПИТЬ. Эти константы перечисления нам понадобятся позже..

В этом примере мы используем ранее созданный java-файл стратегии — BarsAndTicks.java. Теперь добавьте код для торговли. Сначала напишите строку кода, которая будет решать, продавать или покупать. В этом случае мы принимаем это решение на основании последнего завершенного бара. Весь следующий код добавляется в метод onStart. Если значение, полученное методом getOpen бара меньше, чем значение getClose (зеленая полоса), тогда мы будем покупать, если напротив (красная полоса), тогда мы будем продавать:

Когда мы знаем, какую торговую операцию мы будем выполнять, мы можем выполнить нашу команду OrderCommand с помощью метода submitOrder IEngine. Метод submitOrder принимает в качестве параметра объект String — метку заказа. Помните, что этот ярлык для каждого заказа должен быть уникальным. .

Вот полный файл java — BarsAndTicks.java.

Скомпилируйте файл и запустите стратегию. Обратите внимание, что на вкладке «Позиции» появилась новая запись, в которой Ext.ID равно " MyStrategyOrder2 ". Это метка заказа, которую мы передали в качестве параметра методу IEngine.submitOrder..

Можно закрыть ордер, установив флажок ордера на вкладке «Позиции», затем щелкнув правой кнопкой мыши и выбрав «Закрыть позицию»:

Торговля в соответствии с последним завершенным баром.

В этой части урока мы модифицируем ранее созданную стратегию BarsAndTicksTrade.java. Метод onBar вызывается на каждом баре для каждого базового периода и каждого инструмента, на который подписано приложение. Чтобы работать с конкретными инструментами только в методе onBar, нам нужно будет их отфильтровать. В этом примере мы покажем, как регистрировать события заказа с помощью метода onMessage. Чтобы зарегистрировать сообщения, относящиеся к заказу, из всех других сообщений, нам нужно будет их отфильтровать. В этом примере мы моделируем ведение журнала, просто выводя его на вкладку вывода стратегии..

Создайте логику в методе onBar.

Переместите логику нашей ранее созданной стратегии из метода onStart в метод onBar. Вот метод onStart после движения:

Определите новый параметр экземпляра типа IOrder. Нам понадобится этот объект IOrder позже, чтобы проверить существующие заказы с той же меткой:

Затем реализуйте метод onBar следующим образом:

Зарегистрировать заказ.

Реализуйте метод onMessages следующим образом:

Щелкните здесь, чтобы узнать больше о ведении журнала. Вот полный java-файл стратегии — OnBarExample.java.

Проверить, как стратегия работает в реальных ситуациях, можно на реальных исторических данных с помощью исторического тестера. Тестируем нашу стратегию на данных за последний день. Для этого выберите Инструменты — Исторический тестер, чтобы открыть вкладку исторического тестера. Выберите стратегию из выпадающего списка; нажмите кнопку «Инструмент», чтобы установить нужный инструмент; установите период в раскрывающемся списке на Последний день; установите период в Ticks. Наконец, нажмите кнопку воспроизведения, чтобы начать тест..

Если вас интересует более подробная информация о том, как работать с Historical Tester, посетите вики-страницу Historical Tester..

По умолчанию результаты теста открываются в браузере..

Торговля согласно SMA Trend.

Стратегия этой части руководства будет торговать в соответствии с изменениями индикатора SMA — покупать при восходящем тренде и продавать при нисходящем тренде. Мы будем использовать индикатор SMA (Simple Moving Average) и обновим наш ранее созданный java-файл стратегии..

Идея состоит в том, чтобы использовать метод Indicators.sma для получения значений для двух последних завершенных баров (предпоследнего и последнего) и принятия решения в соответствии со значениями этих баров. В этом случае мы используем метод sma, который принимает в качестве параметров свечные интервалы. Нажмите здесь, чтобы узнать, как использовать интервалы свечей для расчета индикатора..

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

Вот полный код метода onBar:

public void onBar (инструментальный инструмент, период периода, IBar askBar, IBar bidBar) выдает исключение JFException.

Вот полный java-файл стратегии — SMASampleTrade.java.

Протестируйте нашу стратегию в течение нескольких дней с помощью Historical Tester. Когда график откроется, убедитесь, что период такой же, как вы указали в качестве параметра. В этом примере мы используем следующие параметры:

Добавьте индикатор SMA на график, нажав кнопку f (x), затем выберите «Добавить индикатор». В быстром фильтре найдите SMA — Simple Moving Average и установите следующие параметры:

Видно, что решение принимается по двум последним завершенным барам. Если линия тренда SMA начинает расти, мы продаем, если вниз, то покупаем. Также проверьте результат стратегии — здесь вы можете увидеть индикаторы SMA для двух последних завершенных баров (последнего и предпоследнего) и сообщения ордеров..

Нажмите здесь, чтобы узнать больше о расчете индикатора..

Представление событий на графике.

В этой части учебного пособия можно узнать, как добавлять объекты диаграммы на диаграмму и как их настраивать. Мы добавим и настроим индикатор SMA, объекты IOhlcChartObject, ISignalDownChartObject и ISignalUpChartObject. Эта стратегия будет делать заказы в соответствии со значениями SMA и добавлять объект ISignalDownChartObject или ISignalUpChartObject на диаграмму в момент временной шкалы при создании нового заказа. Мы строим эту новую стратегию на ранее созданном файле SMASampleTrade.java. Щелкните здесь, чтобы узнать больше о добавлении объектов на диаграмму.

Сначала добавьте следующий импорт:

Для работы с диаграммами мы будем использовать объекты IChart и IChartObjectFactory. Итак, мы создаем параметр экземпляра для каждого из них. В качестве дополнения мы создаем один экземпляр.

При запуске стратегии можно будет выбрать, добавлять или нет значения индикатора и OHLC на график, а также закрывать ли график после закрытия стратегии. Итак, добавляем в код следующие параметры:

Затем инициализируйте переменные экземпляра, необходимые для добавления индикатора SMA на диаграмму, и вызовите метод (addToChart), который выполнит эту работу. Метод onStart:

Измените метод onStop, чтобы он учитывал выбор пользователя, закрывать или нет график, если стратегия будет закрыта:

В дополнение к ранее созданной логике мы будем добавлять на график объект ISignalDownChartObject или ISignalUpChartObject каждый раз, когда вызывается метод onBar для нашего инструмента и периода. Рассмотрим следующий код в методе onBar:

Добавьте новый служебный метод для вывода сообщений об ошибках в вывод стратегии:

Наконец, реализуйте метод addToChart. Этот метод добавит на график индикатор SMA и, возможно, переменные OHLC:

Вот полный java-файл стратегии — ChartUsage.java.

Протестируйте стратегию с помощью Historical Tester. Не выбирайте закрытие графика методом onStop при тестировании с помощью Historical Tester (он будет показывать сообщения об ошибках), необходимо вручную закрыть старый график перед запуском нового теста. В этом примере мы запускаем нашу стратегию со следующими параметрами:

Вот итоговая диаграмма:

Добавить стоп-лосс и тейк-профит.

В этой части руководства мы используем значения стоп-лосса (SL) и тейк-профита (TP) ордера. Модифицируем ранее созданный java-файл стратегии — ChartUsage.java.

Начнем с добавления нового импорта и удаления ненужного. Ранее мы назначали объекты повышения и отключения сигналов типу IChartObject, но теперь мы будем использовать другой (более конкретный) ссылочный тип — IChartDependentChartObject. Используя этот тип объекта, можно указать, что объект не будет прилипать к полосе при добавлении на диаграмму (с типом объекта IChartObject это невозможно).

Определите новые переменные экземпляра. Они нам понадобятся позже:

Как упоминалось ранее, мы собираемся использовать значения SL и TP ордера, поэтому мы добавляем новые параметры, чтобы иметь возможность устанавливать необходимые значения при запуске стратегии. Переменная breakEventPips используется для установки уровня прибыли в пипсах. Когда достигается этот уровень прибыли в пунктах, SL ордера устанавливается на уровне цены открытия ордера..

Определите перечисление, которое будет содержать константы всех возможных состояний линии тренда SMA:

Безубыточность в onTick.

Рассмотрим метод onTick, который вызывается при каждом тике инструмента. Мы отфильтровываем только те инструменты, которые нас интересуют, поэтому метод выполняется только тогда, когда нам нужно. Позже в методе onBar мы добавляем каждый новый порядок в объект Map. Здесь мы просматриваем Карту ордеров, чтобы увидеть, переместили ли мы уже SL в соответствии с уровнем безубыточности. Если не меняется, то проверяем, больше ли прибыль в пунктах, чем параметр breakEventPips. Если это так, то мы можем изменить значение SL до уровня цены открытия ордера. Каждый раз, когда значение SL устанавливается равным цене открытия, мы добавляем треугольник (вызывая метод addBreakToChart, который описан ниже), чтобы визуально обозначить процесс на графике. Наконец, мы меняем цену SL ордера и обновляем запись на карте. Вот реализация метода onTick:

Торговля согласно SMA.

Модифицируем наш ранее созданный метод onBar. Мы изменяем метод onBar таким образом, чтобы он использовал значения перечисления SMATrend для проверки, когда создавать новый ордер. Мы также устанавливаем значения SL и TP. Одно отличие от предыдущего примера заключается в том, что мы не закрываем предыдущий ордер, если открывается новый. Ордера закрываются автоматически при достижении значений SL или TP. Кроме того, все новые заказы сохраняются на карте для последующей проверки в методе onTick..

Добавление индикатора на график.

Измените метод addToChart, чтобы проверка диаграммы происходила в новом методе — checkChart:

Метод проверки графика:

Построение треугольника безубыточности на графике.

Реализуйте метод addBreakToChart, который вызывается из метода onTick, чтобы показать визуальное представление изменений SL на диаграмме. В этом методе мы добавляем треугольник на наш график, если значение SL для ордера изменяется. Зеленый треугольник представляет изменение SL для длинных ордеров, красный — для коротких. Треугольник нарисован так, что он начинается при создании ордера и заканчивается при изменении значения SL. Мы добавляем текст в треугольник, чтобы представить старые и новые значения SL. .

Вот полный java-файл стратегии — StopLossStrategy.java.

Щелкните здесь, чтобы узнать больше о SL.

Тестирование стратегии.

Запустите стратегию в историческом тестере. В этом примере мы используем следующие параметры:

Рассмотрим вывод диаграммы! Красные и зеленые стрелки показывают на графике короткие и длинные ордера в момент создания ордера. Правая сторона треугольников показывает время смены SL, а также новое и старое значения SL. Левый угол треугольника начинается в той же позиции во времени, когда создается ордер — таким образом можно легко отследить, для какого порядка производится изменение SL..

Использование канала данных.

В этом разделе мы собираемся изменить тип данных фида с 10-минутного на 2-пипсовые бары ренко (и, как вариант, 30-секундные бары с настраиваемым периодом), оставив остальную логику стратегии прежней. Чтобы создать стратегию, которая работает с различными потоками данных, необходимо создать класс, реализующий интерфейс IFeedListener. В этом классе должен быть реализован только один метод — IFeedListener.onFeedData. Этот метод вызывается каждый раз, когда поступают данные фида. В этом примере мы собираемся изменить ранее созданный java-файл стратегии — StopLossStrategy.java..

Объявление типа фида.

Измените файл StopLossStrategy.java и добавьте следующий импорт:

Как упоминалось во введении, нам необходимо реализовать интерфейс IFeedListener для получения данных канала. Мы реализуем интерфейс в том же классе, где реализован интерфейс IStrategy:

Если мы используем в коде более одного типа фида данных, тогда нам нужно использовать Instrument, OfferSide, PriceRange, Period в соответствии с подписанным фидом. Все эти значения можно получить из элемента IFeedDescriptor. Замените эти переменные во всех методах вызовами методов IFeedDescriptor, которые получают те же переменные в соответствии с типом канала. Итак, удалите параметры myInstrument, myOfferSide и myPeriod..

В этом примере мы предоставим выбор при запуске стратегии для выбора между двумя типами каналов, поэтому мы добавляем новый параметр. Нам нужно будет определить, какой канал выбрал пользователь, и подписаться на него. По этой причине мы объявляем новое перечисление. В этом перечислении есть конструктор, который присваивает значение переменной IFeedDescriptor константы. Поступая таким образом, мы можем позже использовать константу перечисления (FeedType) для получения информации о выбранном потоке данных (Instrument, OfferSide и т. Д.).

Подписка на ленту.

Мы подписываемся на определенный тип ленты в методе onStart. Добавляем код, который подписывается на ленту:

Реализация интерфейса IFeedListener.

Мы переносим всю логику из onBar в метод onFeedData. Нас больше не интересует выполнение метода onBar, поскольку мы используем поток данных. Мы заинтересованы в том, чтобы наша логика выполнялась каждый раз при поступлении новых данных. Чтобы получить данные, нам нужно реализовать интерфейс IFeedListener. В этом интерфейсе объявлен только один метод — onFeedData. Одно отличие от кода ранее созданной стратегии состоит в том, что значения Instrument и OfferSide извлекаются из объекта IFeedDescriptor. Весь код вставлен в блок try-catch, поскольку некоторые методы (например, IIndicators.calculateIndicator) вызывают исключение JFException. Объект IBar извлекается путем отбрасывания объекта ITimedData (интерфейс IBar расширяет интерфейс ITimedData). Канал индикатора также извлекается немного по-другому — мы используем метод IIndicators.calculateIndicator вместо IIndicators.sma из-за использования объекта IFeedDescriptor..

Метод onBar остается с пустым телом:

Модификация метода проверки карт.

В методе проверки графиков мы заменяем способ получения объектов Instrument и OfferSide. Мы используем объект IFeedDescriptor для их получения. Логика проверки графика также немного отличается от предыдущей. Нам нужно определить тип потока данных и проверить диаграмму в соответствии с ним:

Полный исходный код стратегии — Feeds.java.

Тестирование стратегии.

В этом примере мы используем более конкретные временные (30 секунд) и ценовые (2 пункта) диапазоны. Перед запуском стратегии необходимо открыть график с теми же параметрами, что указаны в параметрах стратегии. Чтобы добавить определенные диапазоны временных / ценовых диапазонов, нужно выбрать Инструменты -> Предпочтения -> Период и добавьте требуемые периоды. Для запуска стратегии необходимо добавить периоды Ренко 2 пипса и 30 секунд..

Тестирование с кормом Renko.

Мы проводим тест Renko 2 Pips со следующими параметрами:

Вот пример изображения результатов по типу фида Ренко (2 пункта). Мы видим, что на график добавлены индикатор SMA и длинные / короткие ордера:

Тестирование с использованием свечей с настраиваемым периодом.

При тестировании 30-секундного фида Time Bar мы используем меньшие пипы Stop Loss и Break Event, потому что с большими значениями будет трудно отслеживать изменения SL (нанесенные на график треугольники будут очень широкими). Используемые параметры:

Добавление графического интерфейса в стратегию.

В этом примере мы добавляем элемент GUI (графический интерфейс пользователя) (JDialog), который будет отображать диалоговое окно с предупреждением при каждой отправке нового заказа. Диалог будет содержать текст сообщения с меткой созданного заказа. Если случается, что новый ордер создается до закрытия старого диалога, тогда диалог просто меняет метку нового ордера в тексте сообщения..

Мы доработаем нашу ранее созданную стратегию — Feeds.java.

Сначала мы добавляем новый импорт для графического интерфейса. Мы собираемся использовать объект JDialog, который будет включать (обертывать) объект JOptionPane (содержимое JDialog)..

Объявить переменные экземпляра для диалога.

По умолчанию диалог блокирует доступ к платформе, пока диалог находится в открытом состоянии. Чтобы диалоговое окно не было модальным, добавьте следующую строку кода в метод onStart:

Чтобы показать диалог, мы вызываем метод showNotification из метода onDataFeed. Вызовите метод showNotification, если создается новый заказ. Вот фрагмент кода:

Метод showNotification показывает диалог каждый раз, когда создается новый заказ (если старый диалог закрыт) или изменяет сообщение существующего диалога (если старый диалог не закрыт). Если диалог не закрыт, то метод добавляет логику, которая прослушивает события диалога. В этом случае мы слушаем события закрытия окна. Если окно диалога закрывается, тогда для переменной dialogClosed устанавливается значение false, поэтому при следующем выполнении метода мы теперь увидим, что диалог находится в закрытом положении..

Вот java-файл готовой стратегии — FeedsGUI.java.

При запуске стратегии появляется новое диалоговое окно с предупреждением. Если мы закроем диалог, то при следующей отправке заказа появится новый диалог. Если мы не закроем диалоговое окно до того, как будет отправлен новый заказ, сообщение в диалоговом окне будет изменено. Диалог должен выглядеть следующим образом:

Можно щелкнуть здесь, чтобы узнать больше о том, как использовать JDialog и другие объекты Swing Java ™..

Похожие статьи