Первые уроки по созданию индикатора и сборке стратегии в Омеге.
Попробуем вместе создать свой индикатор и собрать простую стратегию на его основе. В качестве учебного пособия воспользуемся Трендовым индикатором прорыва динамического ценового канала (NRTR) с применением взвешенного ATR. Напомню, что этот индикатор находится под ценами, когда на рынке присутствует повышательный тренд. Когда направление тренда меняется на снижающийся, индикатор "переключается" и оказывается над ценами.
1. Так как сам алгоритм этой методики будет применяться неоднократно, и в индикаторах и в торговых системах, удобней всего записать его в виде "функции" Easy Language, которую потом мы сможем вызывать в нужный момент.
Итак. Запускаем Power Editor, меню File->New, в появившемся окне дважды щелкаем по значку Function. Теперь необходимо дать название нашей функции. В поле Name набираем $NRTR_WATR (значок $ я применяю в названиях своих функций для того, чтобы долго не искать их потом в алфавитном списке EL). В появившемся окне мы будем вводить код функции в соответствии с правилами и синтаксисом EL.
Первое, что мы должны сделать, это объявить константы, значение которых мы будем использовать при расчете алгоритма функции. В первой строчке кода запишем:
Inputs: Len(Numeric) {WAverage TrueRange Length} , M(Numeric); {Multiplier}
Таким образом, мы "объявили" Len - период вычисления взвешенного реального торгового диапазона (WATR) и M - множитель для WATR. Слово Numeric в скобках после названия констант означает, что при расчете функции используются "числовые" значения (в отличие от "условных"). Текст заключенный в фигурные скобки является комментарием и в коде не исполняется. Следующим шагом и в следующей строке кода объявим переменные, значения которых будут изменяться в процессе вычисления.
Vars: Trend(0), HPrice(C), LPrice(C), Reverse(0), TrueHi(H), TrueLo(L), TrueRng(0), WATR(0);
Переменная Trend будет отвечать за направление тренда и принимать значение 1, -1. Переменные HPrice и LPrice будут принимать значения локальных максимумов и минимумов, соответственно, от которых и должен "отстоять" индикатор (переменная Reverse). TrueHi, TrueLo, TrueRng и WATR необходимы нам для вычисления взвешенного реального торгового диапазона. Собственно, к вычислению этого диапазона мы и приступим в следующих строчках кода:
{Calculate
Weighted Average TrueRange}
If Close[1] > High Then TrueHi = Close[1] Else TrueHi = High; {Calculate TrueHigh}
If Close[1] < Low Then TrueLo = Close[1] Else TrueLo = Low; {Calculate TrueLow}
TrueRng
= TrueHi - TrueLo; {Calculate TrueRange}
WATR = WAverage(TrueRng,Len); {Calculate WATR}
Обратите внимание, при вычислении WATR мы использовали встроенную функцию EL под названием WAverage, которая рассчитывает Взвешенную скользящую среднюю от значения TrueRng с периодом усреднения Len. Следует отметить, что мы могли еще больше упростить код, использовав сразу встроенную функцию EL и для вычисления True Range, но в целях лучшего закрепления материала, мы провели эти расчеты "вручную".
Теперь мы имеем рассчитанное расстояние, на которое должен быть удален индикатор от текущих локальных максимумов и минимумов цен. Настала пора вычислить сам этот уровень:
{Calculate
Trailing Reverse Level}
if Trend >=0 then begin {UpTrend}
if C >
HPrice
then HPrice
= C;
Reverse
= HPrice - M*WATR;
if C <
Reverse
then begin
Trend =
-1;
LPrice =
C;
end;
end;
if Trend
<= 0
then begin {DownTrend}
if C <
LPrice then
LPrice = C;
Reverse
= LPrice + M*WATR;
if C >=
Reverse then
begin
Trend =
1;
HPrice = C;
end;
end;
Финальным аккордом в создании нашей функции станет строчка, присваивающая ей значение вычисленного уровня:
$NRTR_WATR = Reverse;
Теперь необходимо проверить правильность наших экзерсисов и сохранить проделанную работу. Для этого воспользуемся специальной командой PowerEditor. Меню File->Verify, или нажав на клавишу F3.
Таким образом, мы создали функцию EL, которую теперь можно "вызывать" и использовать в других методиках. Например, написание индикатора NRTR_WATR займет всего несколько строчек кода. Для этого повторим начальные действия: меню File->New, в появившемся окне дважды щелкнем по иконке Indicator, зададим имя нашему индикатору, например 1_NRTR_WATR (единицу в начале названия я так же использую для быстрого нахождения моих индикаторов или сигналов в алфавитном списке EL). В окне для ввода кода, в первой строчке объявим числовые константы:
Inputs: Len(15), M(2);
Так мы указываем, что индикатор должен "отстоять" от цен на два взвешенных реальных торговых диапазона за последние 15 баров. В следующей строчке кода запишем команду нанесения индикатора на график:
Plot1($NRTR_WATR(Len,M),"NRTR_WATR");
Проверяем и сохраняем нашу работу (клавиша F3). Теперь необходимо задать нашему индикатору свойства "по умолчанию". Меню File->Properties. Так как индикатор должен находиться в одном окне с ценами и использовать ту же шкалу, на вкладке Scaling укажем "Same as symbol". На других вкладках можно задать цвет индикатора, толщину линий, программы в которых он может использоваться, и другие настройки.
Нетерпеливый читатель сразу захочет проверить, что же у нас получилось. Вперед. Открываем окно TradeStation с графиком выбранного эмитента. Нажимаем клавишу F7. В появившемся окне выбираем вкладку Indicator, находим наш индикатор 1_NRTR_WATR, выделяем его, нажимаем "OK". В появившемся окне, на вкладке Inputs мы увидим константы заданные в свойствах индикатора "по умолчанию". Можно поменять их, например, дважды щелкнем по строчке "Len" и в появившемся окне укажем значение 21, "ОК". Затем повторим ту же операцию со строчкой "М" и зададим значение множителя = 3. Еще раз "ОК", и наш индикатор нанесен на график цен. Enjoy!
***************
2. Следующий шаг в освоении Омеги - построение торговой стратегии на основе полученного индикатора. Одним из важнейших удобств этого программного продукта является возможность сборки торговых стратегий из различных сигналов, как из детского набора кубиков.
Итак, сначала необходимо определить алгоритм нашей стратегии, который мы запишем потом в виде "сигнала". Мы будем совершать сделки только Лонг по цене закрытия бара, на котором поступит сигнал. Сигналом к покупке будет нахождение цены закрытия над индикатором (повышательный тренд), сигналом к выходу из длинной позиции станет пересечение ценой индикатора вниз (что говорит о начале понижательного тренда). Для того чтобы отфильтровать некоторые неудачные сделки, воспользуемся известным правилом трендовой торговли: мы будем осуществлять покупки только в направлении "глобального" повышательного тренда, который будем определять тем же трендовым индикатором, но с более широкими параметрами. С целью сохранения капитала при резком движении цен против открытой позиции мы добавим условие на "финансовый" стоп-лосс с использованием стоп-ордера.
Начинаем: В окне PowerEditor меню File->New, двойной щелчок по иконке Signal, называем наш сигнал 1_NRTR_WATR, ОК. Сначала необходимо объявить константы:
Inputs: M1(1), {Signal ratio}
M2(5), {Trend ratio}
Len(21),
{WATR
length}
StpL(5); {Stop Loss order}
Множитель М1 будет использоваться в качестве параметра индикатора для получения торговых сигналов, множитель М2 будет определять индикатор показывающий "глобальный тренд", параметр Len - период усреднения при вычислении WATR, константа StpL задает размер "финансового" стоп-лосса в процентах. Следующим шагом объявляем переменные. В нашем варианте системы нам понадобится одна переменная, определяющая "глобальный" повышательный тренд:
Vars: UpTrend(False);
Обратите внимание, что эта переменная принимает "условные" значения. Т.е. она определяет "верно" или "неверно" наличие повышательного тренда, в направлении которого мы будем осуществлять сделки. В следующих строчках кода определим уровни, по которым мы вычисляем наличие тренда и осуществляем сделки. Для этого произведем "вызов" созданной нами ранее функции со значениями заданными в блоке объявления констант:
Value1 = $NRTR_WATR(Len,M1); {Signal Level}
Value2 = $NRTR_WATR(Len,M2); {Trend Level}
Добавим условие, определяющее наличие "глобального" ап-тренда:
If C > Value2 Then UpTrend = True Else UpTrend = False;
Теперь можно записать правила для открытия позиций:
{Trade
rules}
If C > Value1 and UpTrend = True and
MarketPosition = 0 Then Begin
Buy("LE") at Close;
Value3 =
Close*(1 - StpL*0.01); {StopOrder setup}
End;
Обратите внимание, в блок If-Then Begin-End, вместе с командой покупки, мы добавили расчет уровня стоп-лосса (Value3) от цены открытия позиции. Таким образом, для выхода из позиции нам необходимо записать две независимые команды - одна на выход по пересечению индикатора, вторая на выход по достижению уровня "финансового" стопа с помощью стоп-ордера:
If C < Value1 Then ExitLong("LX") at Close;
ExitLong("StpL") at Value3 Stop; {Exit at Stop Loss
Order}
Пожалуй, для начала достаточно. Проверяем и сохраняем нашу работу: меню File->Verify, или по клавише F3. Итак, мы имеем "сигнал", в котором записаны условия на открытие и закрытие длинных позиций в направлении "глобального" ап-тренда.
Теперь на основе этого сигнала можно "собрать" торговую стратегию. Для этого вернемся в TradeStation, меню Go->Strategy Builder. В открывшемся диалоговом окне нажмем кнопку "New" и зададим имя нашей стратегии, например 1_NRTR_WATR. Дальше, кнопка "Next". Теперь нам необходимо добавить "сигналы", которые будут использоваться в стратегии. Я уже говорил, что собирать стратегии в Омеге из разных сигналов можно по принципу детской игры в кубики. Можно выбрать отдельные сигналы для открытия длинных позиций, отдельные сигналы для открытия коротких позиций, добавить сигнал для стоп-лоссов и т.д.
Итак, для нашей стратегии мы используем один сигнал, который был ранее нами создан и который содержит все необходимые команды в одном коде. Нажимаем кнопку "Add" и выбираем из появившегося списка наш сигнал 1_NRTR_WATR, далее "ОК" и "Next". Последовательно нажимая кнопку "Next" мы пройдем через ряд диалоговых окон, в которых задаются параметры нашей стратегии (для начала можно оставить все значения "по умолчанию"). Стратегия создана. Теперь можно проверить ее работоспособность на графике цен.
Для того чтобы нанести стратегию на график цен воспользуемся командой меню Insert->Strategy, или вызовем список методик по клавише F7. Найдем в списке нашу стратегию 1_NRTR_WATR, выделим ее, "ОК". Появится окно для настройки параметров стратегии. Пройдя последовательно по всем вкладкам, зададим параметры констант (Inputs) стратегии, размер капитала на сделку, комиссию, проскальзывание, размер минимального лота и т.д. После нажатия на кнопку "ОК", мы увидим сигналы стратегии, нанесенные на график цен.
И последний момент, на котором я хотел бы остановиться в завершении этого урока. Оптимизация параметров стратегии. Для того чтобы провести оптимизацию, надо в окне настройки параметров стратегии, на вкладке Inputs дважды щелкнуть по нужному параметру и в появившемся окне поставить галочку "Optimize", в появившемся окне необходимо задать начало, конец и шаг диапазона оптимизации. После нажатия кнопки "ОК" стратегия проведет оптимизацию параметров, результаты которой можно увидеть в Strategy Optimization Report.
(c) konkop, 2001.