Главная > Обучение > Статьи > Приемы работы в Visual JForex, часть 2
Приемы работы в Visual JForex, часть 2

Откройте аккаунт, чтобы оценить удобство работы на MTBankFX.

Рекомендуем вам перед началом работы на реальном аккаунте обязательно потренироваться на демо-аккаунте.

Приемы работы в Visual JForex, часть 2

Чтобы выйти на новый уровень работы в конструкторе Visual JForex, трейдер должен освоить работу с циклами - повторяющимися действиями. Освоение циклов позволит трейдеру строить гораздо более сложные стратегии и быстро проверять их работоспособность на исторических данных.

Например, хочется ли вам написать стратегию, где входы совершаются по максимальным и минимальным значениям за N баров? А может, вы хотели проверить такой сигнал, как "дивергенция"? Или, может, нанести индикатор (например, скользящее среднее) на уже имеющийся индикатор? Все это возможно с применением циклов.

Блоки LoopViewer и Positions Viewer

В конструкторе Visual JForex имеются два блока, работающие по сходному принципу. Это LoopViewer и Positions Viewer.

Рис. 1. Логические блоки Loop Viewer и Positions Viewer.

На рабочем пространстве они выглядят очень похоже.

Рис. 2. Вид блоков.

Отличие между этими блоками в том, что Positions Viewer работает только с позициями, а Loop Viewer - со всеми остальными типами переменных.

Рассмотрим устройство.

Как работает цикл

В блоках всего два места под переменные. На первое место ставится массив данных, который будет сканироваться на соответствие определенным условиям. На второе место - текущий "указатель". Например, для Positions Viewer это может быть конкретная найденная позиция. А для Loop Viewer - конкретная, рассматриваемая в данный момент, например, свеча и все данные по ней.

Если в форме текста понять сложно, то гораздо проще все сделать на примере. Возьмем Loop Viewer.

Пример работы Loop Viewer

Предположим, нам необходимо найти максимальную цену за предыдущие 10 баров на часовом графике евро. Эта точка в дальнейшем будет использована как цена для ордера бай-стоп.

Коротко суть работы с Loop Viewer будет такой:

  1. Мы берем последние 10 закрывшихся исторических баров - с помощью блока Get Historical Candles.
  2. С помощью блока Loop Viewer просматриваем каждый из полученных 10-ти баров и сравниваем их максимальные цены (High) так, чтобы найти самую высокую.

Вперед.

Рис. 3. Предварительные настройки.

На рисунке первом мы задаем рабочий инструмент (евро) и таймфрейм (часовой). В третьем блоке мы получаем 10 (!) исторических баров слева от текущего. Важно в настройках этого блока указать Shift равное "1". Так мы получим бары именно слева от еще формирующегося бара.

Блок Get HistoricalCandles на выходе дает массив данных candles14. В нем как раз и содержится информация по всем 10-ти барам слева от текущего. В них мы и будем с помощью цикла находить максимальную цену High.

Перед включением цикла

Важнейшая манипуляция, которую необходимо сделать перед входом в цикл, - это сделать некое назначение. Что будет назначаться и чему?

Дело в том, что в цикле (так для краткости мы будем называть блок Loop Viewer) мы будем проводить сравнение цены High каждого бара с чем-то. Предположим, если 5-й бар слева имеет цену High выше, чем у 4-го, то нашей переменной Max_High (которую мы создадим) мы присвоим значение цены High 5-го бара.

Но как быть с 1-м баром, с чем сравнивать его цену High? Для этого и делается назначение. А заодно и создается та самая переменная Max_High, которая будет содержать в себе максимальную цену High из полученных 10-ти баров.

Итак, перед входом в цикл присвоим нашей переменной Max_High значение "0".

Рис. 4. Важное назначение перед входом в цикл.

В такой ситуации цена High уже первого бара (в массиве из 10-ти) точно будет выше нуля.

Теперь сам цикл. На первое место в блоке Loop Viewer ставим массив из 10-ти баров candles14. Не обращайте внимание на цифру "14", конструктор именует некоторые переменные и массивы по-своему.

Рис. 5. Вставка массива из 10-ти исторических баров.

На втором месте в цикле (текущий указатель или текущий бар) создаем новую переменную, которую назовем соответствующим образом - свеча в цикле - Cycle_Candle. В этой переменной будет в один момент времени содержаться информация по только одному бару, пока просмотрщик (отсюда Viewer) не перейдет к следующему бару.

Рис. 6. Создание переменной для текущего указателя.

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

Рис. 7. Список переменных Cycle_Candle.

Это как раз то, что нам нужно. Точнее, нам нужна только одна переменная из этого списка - Candle High. Это цена High бара, который сейчас рассматривается циклом.

Пора настроить сам цикл.

Сам цикл

Что мы будем делать внутри цикла? Программа 10 раз будет запускать просмотр баров. Потому что мы указали количество исторических баров 10. Т.е. каждый бар будет рассмариваться.

Что необходимо сделать на каждом просмотре? Мы попросим робота присвоить цену High рассматриваемого бара нашей переменной Max_High, но только в том случае, если максимальная цена рассматриваемого бара действительно выше текущего значения переменной Max_High.

Помните, что максимальная цена 1-го бара будет сравниваться с нулём, потому что именно "0" мы присвоили переменной Max_High перед входом в цикл.

Входим в цикл и добавляем блоки.

Рис. 8. Вход в цикл.

Это изображение заслуживаем особого внимания. Потому что выхода из блока Loop Viewer (как и Positions Viewer) - ДВА. Какой использовать и в какой ситуации?

Сам цикл - это первый выход. Выход из блока с полученными значениями - это вторая точка.

Пока заходим в цикл.

Рис. 9. Оформление первого блока If в цикле.

Обратите внимание, какие переменные получил блок If в цикле. На первом месте - цена High рассматриваемого бара. На втором месте - переменная Max_High, которую мы будем использовать как цену для Buy Stop, выйдя из цикла.

Рис. 10. Присвоить цену High переменной Max_High при выполнении условия.

В нашем цикле будут всего два блока. В первом мы сравниваем цену High рассматриваемого бара со значением переменной Max_High. Во втором, если мы действительно имеем дело с самой высокой ценой High, то мы присвоим ее значение переменной Max_High.

Так, когда цикл закончится (10 баров), переменная Max_High будет содержать в себе максимальную цену High из рассмотренных 10-ти баров.

Всё!

Пора применить полученную переменную Max_High.

Выход из цикла

На выходе из цикла добавляем торговый блок "Бай-стоп по биду".

Рис. 11. Применяем значение переменной Max_High.

В добавленный на выходе из цикла блок Pending Open вставляем полученную в цикле Max_High. Напомним, в Max_High на момент выхода из цикла уже содержится максимальная цена за последние 10 баров.

Так эта цена становится ценой бай-стопа.

Готово!

Заключение

С помощью блока Loop Viewer робот может просматривать огромные массивы данных и получать из них нужные значения, которые впоследствии можно использовать в торговых блоках либо вычислениях.

Умение работать с циклами выводит трейдера на качественно новый уровень создания торговых роботов.

Автор – Молодяшин Роман, тренер MTBankFX