Процесс создания своего свода правил для торговли достаточно прост, т.к. Omega Research предлагает вам язык команд, которые позволяют вам интерпретировать свои идеи на простом английском языке, понимаемом и вашим компьютером. Этот простой английский язык команд называется Easy Language (EL).
Существует два основных момента, которые следует учитывать, переводя свою идею в код EL.
1. Какие критерии будут использоваться для оценки событий, которые могут произойти.
2. Какие действия следует предпринять в каждом случае, т.е. выполнять команду «Buy»(покупать) или «Sell»(продавать).
Например, критерий, который следует учитывать, может быть следующим: средний показатель последних 10 баров должен быть выше среднего показателя последних 8 баров. Если вы хотите включить этот критерий в свое аналитическое исследование, вы можете использовать готовую функцию, которая поможет вам встроить эту идею в вашу систему. Например, существует функция, которая называется «Average» (среднее значение, скользящая средняя). Функция Average требует, чтобы вы указали два показателя, необходимые для расчета конечного значения: цена, среднее которой должно быть вычислено (например, Open, High, Low, Close или другие математические расчеты) и период (количество баров данных, которые следует использовать в расчете среднего: 20, 50, 100 баров и т.д.)
Большинство функций требует, чтобы вы указали параметры, которые будет использовать функция в своих вычислениях. Чаще всего, это цена и период. Если ценовой бар состоит из цен Open, High, Low, Close, пользователь должен уточнить, какую именно цену функция должна использовать в своих вычислениях. Период — это количество баров, которые функция должна использовать в своих вычислениях. Исходя из этого, «Идея» содержит всю информацию, необходимую для превращения ее в команду EL в соответствующем синтаксисе.
If Average(Close,10) is greater than Average(Close,8) then …
(если скользящая средняя цен закрытия за 10 периодов больше чем скользящая средняя цен закрытия за 8 периодов, то…)
Close,10 в скобках, означает, что значение функции Average (Простая скользящая средняя) основано на цене закрытия последних 10 баров.
Таким образом, часть «What has to happen» (Что должно произойти) завершена, а часть «What action must be taken for what has happened» (Что следует сделать, если это произошло) еще нужно добавить:
Действие Где Доп. мера Тип ордера Точка с запятой
Buy at Open plus 1 point stop ;
(Купить по стоп-ордеру на уровне цены открытия + 1 пункт).
Точка с запятой всегда означает конец завершенной команды. Ниже представлена полная команда в EL:
If Average(Close,10) > Average(Close,8) then buy at close +1 point stop;
(Если средняя цена закрытия за 10 баров больше средней цены закрытия за 8 баров, то покупаем на уровне цены закрытия + 1 пункт, по стоп-ордеру).
В систему можно добавить еще правила. Например, пользователь может добавить в систему следующее правило: покупать, только если RSI последних 14 баров меньше, чем RSI последних 20 баров. Это можно сделать следующим образом: Поместите слово «and» между двумя правилами. В обычной речи слово «and» («и») соединяет два объекта внутри одной принципиальной идеи. Так же оно используется и в EL. Используя предыдущий пример, добавим второе «условие» к существующему правилу:
If Average(Close,10) > Average(Close,8) and RSI(Close,14) < RSI(Close,20) then …
По мере того, как ваши правила накапливаются, вам может понадобиться разбить их на более мелкие части в рамках «Условных переменных» (Condition), которые могут принимать значения верно/неверно. Это сделает правила более легкими для понимания и использования. Например:
Condition1 = Average(Close,10) > Average(Close,8);
EL позволяет применять до 100 имен Условных переменных, используемых по умолчанию, Condition0,….Condition99. (Обратите внимание, что между словом Condition и числом нет пробела). Теперь, если записать Условную переменную Condition1 в систему, это будет означать:
Average(Close,10) > Average(Close,8);
Условная переменная Condition1 применима только к этой системе. Вы можете использовать слово Condition1 в других системах или методиках.
Второе правило нашей системы можно записать подобным же образом:
Condition2 = RSI(Close,14) < RSI(Close,20);
Здесь используется встроенная в PE функция RSI.
Теперь, чтобы записать все правило, можно просто объявить и вставить Условные переменные туда, куда необходимо:
Condition1 = Average(Close,10) > Average(Close,8);
Condition2 = RSI(Close,14) < RSI(Close,20);
If Condition1 and Condition2 then buy at close + 1 point stop;
(Эту запись можно перевести на русский язык примерно так:
Условие1 = Средняя по закрытию 10-и баров больше средней по закрытию 8-и баров;
Условие2 = RSI по закрытию 14-и баров меньше RSI по закрытию 20-и баров;
Если Условие1 и Условие2 верны, то покупаем по стоп-ордеру на уровне цены закрытия + 1 пункт;) Прим. переводч.
Это значит, что если оба приведенных выше правила верны, то система выполнит команду «купить». Если пользователю нужно, чтобы была выполнена команда «продать», с обратными условиями, необходимо записать следующее:
Condition1 = Average(Close,10) > Average(Close,8);
Condition2 = RSI(Close,14) < RSI(Close,20)[1]);
Condition3 = Average(Close,10) < Average(Close,8);
Condition4 = RSI(Close,14) > RSI(Close,20);
If Condition1 and Condition2 then buy at close + 1 point stop;
If Condition3 and Condition4 then sell at close — 1 point stop;
Использование Констант (Inputs).
В написанной выше системе, вместо Close могут использоваться другие компоненты бара — High, Low, Open. В случае если пользователь не уверен, какие значения он будет в дальнейшем использовать, например, для периодов средних и RSI, в EL можно использовать характеристику, которая называется Input (Константа). Эта характеристика позволяет пользователю вводить одно число в систему, а позже, при изменениях и оптимизации системы, она позволяет изменять эти значения, без изменения основного кода системы.
Предположим, пользователь хочет использовать различные периоды для вычисления функций в приведенном выше примере. Тогда процедура будет выглядеть следующим образом:
Inputs: Length1(10), Length2(8), Length3(14), Length4(20), Length5(10), Length6(8), Length7(14), Length8(20);
Condition1=Average(Close,Length1)> Average(Close,Length2);
Condition2=RSI(Close,Length3) < RSI(Close,Length4)[1]);
Condition3=Average(Close,Length5) < Average(Close,Length6);
Condition4=RSI(Close,Length7) > RSI(Close,Length8);
If Condition1 and Condition2 then buy at open +1 point stop;
If Condition3 and Condition4 then sell at close — 1 point stop;
Использование Числовых переменных (Values).
Другая возможность подстановки в код конкретных чисел — использование Числовых переменных (Values). Числовая переменная, так же как и Условная переменная (Condition) применяется в вычислениях. Но, если Условная переменная может принимать значения Верно/Неверно, то Числовая переменная имеет только числовое выражение. EL обеспечивает вас 100 именами Числовых переменных, используемых по умолчанию, Value0,…Value99. (Обратите внимание, что между словом Value и числом нет пробела).
В следующем примере, Числовой переменной 1 (Value1) присваивается величина «1 пункт». Возможность присвоения определенных величин Числовым переменным, сохраняет время пользователя и упрощает восприятие кода. Достаточно один раз присвоить определенную величину Числовой переменной и затем неоднократно использовать ее в кодах.
Inputs: Length1(10), Length2(8), Length3(14), Length4(20), Length5(10), Length6(8), Length7(14), Length8(20);
Value1 = 1 point;
Condition1 = Average(Close,Length1) > Average(Close,Length2);
Condition2 = RSI(Close,Length3) < RSI(Close,Length4)[1]);
Condition3 = Average(Close,Length5) < Average(Close,Length6);
Condition4 = RSI(Close,Length7) > RSI(Close,Length8);
If Condition1 and Condition2 then buy at open + Value1 stop;
If Condition3 and Condition4 then sell at close — Value1 stop;
Пример другой торговой идеи.
Часто трейдеры хотят входить в рынок тогда, когда цена или Методика пересекает определенный уровень 2, 3 , 4, или более раз. EL позволяет осуществлять это очень просто, с помощью устройства, называемого Счетчик (Counter), на основе Числовой переменной. Например, пользователь хочет войти в покупку, только после того, как 25-периодный RSI по ценам закрытия пересечет 5 раз вверх уровень зоны покупки = 80.
If RSI(Close,25) crosses above 80 then Value1 = Value1 + 1;
If Value1=5 then begin
Buy tomorrow at open + 1 Point stop;
Value1=0;
end;
Приведенный выше код содержит следующие компоненты:
RSI(Close,25) ... Значение RSI вычисленное по ценам закрытия последних 25 баров.
crosses above … «Пересекло вверх» уровень зоны покупки.
80 … Уровень зоны покупки.
Value1 = Value1 + 1 … — в данном примере Числовая переменная — это Счетчик, и он увеличивается на 1 каждый раз, когда RSI пересекает вверх зону покупки.
If Value1 = 5 then buy tomorrow at open + 1 point stop; … если Value1 = 5, программа размещает ордер на покупку на завтрашнее открытие + 1 пункт.
Value1 = 0; … после того, как Value1 = 5 и действие выполнено, Value1 возвращается к значению 0.
Тестирование другой идеи
Предположим, что вы хотите, чтобы команда на покупку поступала, когда 10-дневный RSI пересечет вверх 14-дневный Стохастик 3 раза. А команда на продажу поступала, когда 10-дневный RSI пересечет вниз 14-дневный Стохастик 4 раза. Эти условия можно записать в EL следующим образом:
Condition1 = RSI(Close, 10) crosses above SlowD(14);
Condition2 = RSI(Close,10) crosses below SlowD(14);
If Condition1 then Value1 = Value1 + 1;
If Value1 = 3 then begin
Buy today at close;
Value1 = 0;
end;
If Condition2 then Value2 = Value2 + 1;
If Value2 = 4 then begin
Sell today at close;
Value2 = 0;
end;
Приведенный выше код содержит следующее:
Condition1 = RSI(Close, 10) crosses above SlowD(14);
Condition2 = RSI(Close,10) crosses below SlowD(14);
Запись правил с помощью Условных переменных: Когда RSI пересекает вверх Стохастик (SlowD), Condition1 = Верно, а когда RSI пересекает вниз Стохастик, Condition2 = Верно.
If Condition1 then Value1 = Value1 + 1;
If Value1 = 3 then begin
Buy today at close;
Value1 = 0;
end;
If Condition2 then Value2 = Value2 +1;
If Value2 = 4 then begin
Sell today at close;
Value2 = 0;
end;
Каждый раз, когда Condition1 — верно, значение счетчика Value1 увеличивается на единицу; и каждый раз, когда верно условие Condition2, счетчик Value2 также увеличивается на единицу. Как только значение счетчика Value1 достигнет значения 3, поступит сигнал на покупку на закрытии. Когда значение счетчика Value2 достигнет значения 4, поступит сигнал на продажу по цене закрытия. После исполнения каждого из торговых сигналов, соответствующие счетчики обнуляются.
Использование Числовых переменных (Values) позволяет более удобно записывать различные коды Систем или Методик. Ниже приведены другие примеры их использования:
Value1 = 2 * H;
Value2 = Average(RSI(Close,14),10) — Average(RSI(Close,10),10);
Value3 = 50 points;
Value4 = High — Low + (Range[1] *.5);
Необходимо помнить, что Числовые переменные (Value) могут иметь только числовое выражение, в то время как Условные переменные (Сondition) принимают значения Верно/Неверно.
Использование Функций при работе с EL.
Многие необходимые понятия, для записи торговых идей в EL, уже встроены в программу. Они обычно выполняют определенную функцию внутри Системы, Индикатора, или другой Методики. Например, существует функция, определяющая среднюю цену за период (Скользящая средняя). Пользователю нужно лишь поместить ее в структуру кода EL, чтобы программа смогла ее понять.
Вот несколько примеров, которые могут быть полезными для записи торговых идей: Определение среднего значения 10-и последних цен закрытия (Простая скользящая средняя по ценам закрытия за 10 периодов):
Average(Close,10)
Где:
Average…функция, которая возвращает требуемое значение.
(Close,10)…цена и длина периода данных, на которых вычисляется среднее.
Вычисление значения RSI по ценам открытия за последние 20 периодов:
RSI(Open,20)
Где:
RSI…функция, возвращающая требуемое значение.
(Open,20)...цена и период данных, на которых вычисляется RSI.
Записывая Системы или Методики, пользователь может включать в них готовые функции. Ниже приведены примеры нескольких из встроенных в PE функций:
Average(Close,14) Простая скользящая средняя по ценам закрытия за 14 периодов;
RSI(High,20) RSI по ценам High за 20 периодов;
ADX(20) АDX за 20 периодов;
Highest(Close,15) Наивысшая цена закрытия за 15 периодов;
StdDev(Open,12) Стандартное отклонение цен открытия за 12 периодов;
WAverage(Low,10) Взвешенная скользящая средняя по ценам Low за 10 периодов;
SwingHigh(2,High,3,20) Точка разворота.
Обратите внимание, что для шести из приведенных функций требуется ввод периода и/или цены для вычислений. А последняя функция SwingHigh требует ввода большего количества значений: SwingHigh(Occur,Price,Strength,Length). Эта функция представляет собой точку на графике, значение которой больше, чем значение точки справа от нее и, по крайней мере, не меньше, чем значение точки слева от нее.
Occurrence это порядковый номер проявления свинга — первый, второй, третий раз и т.д.
Price это часть бара, которая интересует, например high, low, close, open и т.д. И которую будет использовать в своих вычислениях функция.
Strength это количество точек (бары слева и справа), выше которых должна быть точка SwingHigh.
Length это количество баров, используемое в вычислении SwingHigh.
Работа с Методиками.
Многие из предыдущих примеров в этом учебнике, касались Систем. Тем не менее, эти же правила применимы и к написанию Методик (Индикаторов, ShowMe и PaintBar). Основное различие заключается в том, что, основываясь на тех же правилах, Методика изображает информацию графически, в то время как Система дает только сигналы покупки и продажи.
Ниже представлен код Системы, которую мы использовали ранее в качестве примера:
Inputs: Length1(10), Length2(8), Length3(14), Length4(20), Length5(10), Length6(8), Length7(14), Length8(20);
Value1 = 1 point;
Condition1 = Average(Close,Length1) < Average(Close,Length2);
Condition2 = RSI(Close,Length3) > RSI(Close,Length4)[1]);
Condition3 = Average(Close,Length5) > Average(Close,Length6);
Condition4 = RSI(Close,Length7) < RSI(Close,Length8);
Предположим, пользователю необходимо изобразить эти данные в виде Индикатора. Прежде всего, необходимо преобразовать Условные переменные в Числовые переменные:
Value1 = Average(Close,Length1);
Value2 = Average(Close,Length2);
Value3 = RSI(Close,Length3);
Value4 = RSI(Close,Length4);
Если пользователю достаточно изобразить на графике только эти значения, то код Индикатора запишется следующим образом:
Plot1(Value1, «Avg1»);
Plot2(Value2, «Avg2»);
Plot3(Value3, «RSI1»);
Plot4(Value4, «RSI2»);
Где:
PlotN — команда нанесения изображения;
ValueN — результат вычислений;
«AvgN», «RSIN» — наименование изображения на графике.
Параметры, входящие в команду Plot заключены в скобки и разделены запятыми.
Пример другого индикатора:
Предположим, пользователь хочет изобразить наивысшее значение цены High последних 20-и баров и наименьшее значение цены Low последних 10-и баров. Так же он хочет изобразить разницу между значениями 14-дневной скользящей средней 2 дня назад и 10-дневной скользящей средней.
В первом случае необходимо нанести на график наивысший High за 20 периодов:
Вопрос1: Существует ли функция для наивысшего значения?
Ответ: Да.
Вопрос2: Какая цена используется для вычисления функции наивысшего значения?
Ответ: High.
Вопрос3: За какой период времени?
Ответ: 20.
Эта Методика может быть записана одним из двух способов. Первый — просто записать выражение Методики по правилам составления выражений. Второй — провести отдельные вычисления Числовых переменных.
Если правило записано простым выражением:
Plot1(Highest(High,20), «Highest»);
Если то же правило записано с использованием Числовой переменной:
Value1=Highest(High,20);
Plot1(Value1, «Highest»);
Таким же образом можно записать выражения для изображения наименьшего значения Low за 10 периодов.
Запись правила простым выражением:
Plot2(Lowest(Low,10), «Lowest»);
Запись того же правила с использованием Числовой переменной:
Value1=Lowest(Low,10);
Plot2(Lowest(Low,10), «Lowest»);
Следующее правило должно изобразить разницу между значениями 14-дневной скользящей средней 2 дня назад и 10-дневной скользящей средней. Произведем ту же последовательность действий: найдем функцию, необходимую для вычисления скользящей средней, и укажем цену и периоды для вычислений этой функции:
Value3=Average(Close,14)[2] — Average(Close,10);
Plot3(Value3, «Average»);
Обратите внимание: Числовая переменная (Value3) имеет числовое выражение. Действие Average(Close,14)[2] — Average(Close,10), дает в результате число, т.к. в нем используется «математический оператор» (-). Если бы мы использовали «относительные операторы» (< или >), то необходимо было бы применять Условные переменные (Condition), которые принимают значения Верно/Неверно.
Последнее правило можно так же записать в виде простого выражения:
Plot3(Average(Close,14)[2] — Average(Close,10), «Average»);
Теперь можно объединить все правила вместе и записать код индикатора следующим образом:
Value1=Highest(High,20);
Value2=Lowest(Low,10);
Value3=Average(Close,14)[2] — Average(Close,10);
Plot1(Value1, «Highest»);
Plot2(Value2, «Lowest»);
Plot3(Value3, «Average»);
Другим вариантом этого индикатора будет запись кода в виде простых выражений:
Plot1(Highest(High,20), «Highest»);
Plot2(Lowest(Low,10), «Lowest»);
Plot3(Average(Close,14)[2] — Average(Close,10), «Average»);
Однако обратите внимание, что основные компоненты нашего индикатора — Highest и Lowest имеют другую размерность (масштаб шкалы), чем разница между скользящими средними. В данном случае имеет смысл разделить Методику на два отдельных Индикатора, каждый из которых будет содержать компоненты с соизмеримым масштабом шкал.
Индикатор1:
Value1=Highest(High,20);
Value2=Lowest(Low,10);
Value3=Average(Close,14)[2];
Value4=Average(Close,10);
Plot1(Value1, «Highest»);
Plot2(Value2, «Lowest»);
Plot3(Value3, «Average»);
Plot4(Value4, «Average2»);
Индикатор2:
Value1=Average(Close,14)[2] — Average(Close,10);
Plot1(Value1, «Average3»);
Та же логика, которая используется для изображения Индикаторов, может применяться и для изображения Методик ShowMe и PaintBar. Необходимо помнить, что Методика — это графическое изображение информации.