Рентген Элдера
Советник Elders_X-Ray
Продолжая рассмотрение методик торговли доктора Элдера,
обратим внимание на стратегию с интригующим названием "Рентген Элдера".
Такое наименование, по замыслу автора, должно отображать способность тактики
видеть подноготную рынка, а именно: силу быков и силу медведей. Зная соотношение
сил, можно выстроить свою торговлю таким образом, чтобы всегда двигаться в
направлении доминирующего рыночного настроения.
Для определения силы медведей текущий минимум свечи
вычитается из значения экспоненциальной средней скользящей. Полученная разность
отображается в виде гистограммы. Такой принцип реализован в стандартном
индикаторе МТ4 BearsPower.
Определение силы быков
производится по разнице между текущим максимумом свечи и значением
экспоненциальной средней скользящей. Все полученные данные также отображаются в
виде гистограммы. Соответствующий стандартный индикатор МТ4 называется
BullsPower.
Для подтверждения сигналов каждого индикатора используется
направление экспоненциальной скользящей средней. Растущая средняя подтверждает
возможность открытия длинных сделок, а падающая - коротких. Изюминкой стратегии является открытие
длинных сделок на основании одного индикатора, а коротких - на основании
другого. Рассмотрим условия открытия и закрытия длинных сделок, которые
графически представлены на рис. 1.

Рис. 1. - Открытие и закрытие длинных
позиций.
Длинные позиции открываются, исходя из показаний индикатора
BearsPower (на рис. 1 - Bears).
Гистограмма индикатора должна находиться в отрицательной области и расти,
то есть предыдущий столбец гистограммы имеет значение больше (ближе к нулю), чем
предшествующий ему. Подтверждением сигнала выступает рост средней скользящей.
Условия выхода из длинных позиций определяются по другому
индикатору - BullsPower (на рис. 1 -
Bulls). В данном случае подтверждением сигнала
выступает не средняя скользящая, а непосредственно цена. Первым критерием
является уменьшение значение гистограммы индикатора. Причем, неважно в какой
области находятся значения индикатора. Второй критерий - максимум последней
свечи должен быть выше максимума предшествующей ей свечи. Получается что-то
вроде расхождения показаний индикатора и цены, то есть дивергенция, хотя такой
термин в стратегии "Рентген Элдера" не используется.
Большим минусом системы является отсутствие уровня стопа. А
ведь такое положение вещей может привести к весьма плачевным результатам.
Поэтому дополним условия открытия сделки вычислением уровня стоп-приказа. Исходя
из многочисленных опытов, проведенных в лаборатории MQLabs,
на сегодняшний день наиболее эффективным способом определения стопа
признана методика поиска экстремумов цены за время пребывания показаний
какого-либо индикатора с одной стороны от нуля. В случае с индикатором
BearsPower, по которому определяется момент открытия
длинной сделки, это означает, что нужно искать минимум цены на всем отрезке, где
значение гистограммы находилось ниже нуля. Но уровень стопа будет поставлен не
сразу за минимальным значением цены, а на некотором отдалении, чтобы исключить
случайные пробития. "Отдаленность" будет задаваться при помощи специального
коэффициента, на который необходимо умножить разность между ценой открытия
сделки и найденным минимальным значением цены.
Теперь рассмотрим условия, при которых производятся действия
с короткими позициями (см. рис. 2).

Рис. 2. - Открытие и закрытие коротких
позиций.
Критерием открытия коротких сделок
выступает уменьшение значений гистограммы индикатора
BullsPower (на рис. 2 - Bulls) в положительной
области. Подтверждением является падение экспоненциальной средней скользящей.
Условия выхода из коротких позиций
включают показания индикатора BearsPower (на рис. 2 -
Bears). Первым условием является рост гистограммы
индикатора (значение на последней свече больше значения на свече, предшествующей
ей) в любой из областей. Второе условие - на последней свече сформировался новый
минимум. В результате вновь получаем расхождение показаний цены и индикатора.
Уровень стопа для коротких позиций
вычисляется на основании максимума цены за время пребывания гистограммы
BullsPower в положительной области. Разница между
максимумом цены и уровнем открытия позиции будет умножаться на коэффициент
"отдаленности", задаваемый пользователем.
Для определения прибыльности
стратегии необходимо представить описанные условия в виде эксперта, который
назовем Elders_X-Ray. У эксперта имеются такие
входные параметры:
-
BearsPowerPeriod - период индикатора
BearsPower, по умолчанию - 82;
-
BullsPowerPeriod - период
индикатора BullsPower, по умолчанию - 73;
-
MAPeriod - период скользящей
средней, по умолчанию - 60;
-
MAMethod - метод
скользящей средней, по умолчанию 1 - экспоненциальная;
-
MAPrice - цена, на основе которой рассчитывается средняя,
по умолчанию 0 - по цене закрытия;
-
SLKoef - коэффициент умножения для вычисления уровня
стопа, по умолчанию - 3;
-
OpenOrderSound - имя звукового файла
(должен находиться в папке sounds), который
проигрывается при открытии позиции, по умолчанию "ok.wav";
-
MagicNumber - идентификатор
позиций советника для нахождения сделок, открытых экспертом, по умолчанию
10012.
Эксперт Elders_X-Ray составлен на
основе уже имеющегося эксперта EldersMomentum, который
был рассмотрен в статье
"Моментум доктора Элдера". Поэтому большинство функций
экспертов схожи. Но все же существенные отличия имеются. Все эти отличия будут
рассмотрены.
Центром принятия решений в коде эксперта выступает функция
GetSignal, с которой и начнем:
//+-------------------------------------------------------------------------------------+
//| Генерация сигналов открытия и закрытия позиций |
//+-------------------------------------------------------------------------------------+
void GetSignal()
{
Signal = 0;
CloseLong = false;
CloseShort = false;
// - 1 - ============ Получение значений BearsPower, BullsPower и МА ====================
double Bear1 = iBearsPower(Symbol(), 0, BearsPowerPeriod, PRICE_CLOSE, 1);
double Bear2 = iBearsPower(Symbol(), 0, BearsPowerPeriod, PRICE_CLOSE, 2);
double Bull1 = iBullsPower(Symbol(), 0, BullsPowerPeriod, PRICE_CLOSE, 1);
double Bull2 = iBullsPower(Symbol(), 0, BullsPowerPeriod, PRICE_CLOSE, 2);
double MA1 = iMA(NULL, 0, MAPeriod, 0, MAMethod, MAPrice, 1);
double MA2 = iMA(NULL, 0, MAPeriod, 0, MAMethod, MAPrice, 2);
// - 1 - ========================== Окончание блока =====================================
// - 2 - ======================== Генерация сигнала покупки =============================
if (Bear1 < 0 && Bear1 > Bear2 && MA1 > MA2)
{
// - 2.1 - ============================= Сигнал покупки =============================
Signal = 1;
// - 2.1 - ============================= Окончание блока ============================
// - 2.2 - ====== Поиск минимума цены за время нахождения BearsPower ниже нуля ======
int i = 2;
while (Bear2 < 0 && i < Bars)
{
Bear2 = iBearsPower(Symbol(), 0, BearsPowerPeriod, PRICE_CLOSE, i);
i++;
}
double Min = Low[iLowest(NULL, 0, MODE_LOW, i)];
StopPrice = Open[0] - (Open[0] - Min)*SLKoef; // Стоп - наименьшая цена
// - 2.2 - ============================= Окончание блока ============================
}
// - 2 - ========================== Окончание блока =====================================
// - 3 - ======================== Генерация сигнала SELL ================================
if (Bull1 > 0 && Bull1 < Bull2 && MA1 < MA2)
{
// - 3.1 - == Поиск первого пробития средней скользящей линии ценой закрытия свечи ==
Signal = -1;
// - 3.1 - ============================= Окончание блока ============================
// - 3.2 - ========= Поиск минимума цены за время нахождения BullsPower выше нуля ===
i = 2;
while (Bull2 > 0 && i < Bars)
{
Bull2 = iBullsPower(Symbol(), 0, BullsPowerPeriod, PRICE_CLOSE, i);
i++;
}
double Max = High[iHighest(NULL, 0, MODE_HIGH, i)];
StopPrice = (Max - Open[0])*SLKoef + Open[0]; // стоп - наибольшая цена
// - 3.2 - ============================= Окончание блока ============================
}
// - 3 - ========================== Окончание блока =====================================
// - 4 - ===================== Генерация сигнала закрытия длинной позиции ===============
if (High[1] > High[2] && Bull1 < Bull2)
CloseLong = True;
// - 4 - ========================== Окончание блока =====================================
// - 5 - ===================== Генерация сигнала закрытия короткой позиции ==============
if (Low[1] < Low[2] && Bear1 > Bear2)
CloseShort = True;
// - 5 - ========================== Окончание блока =====================================
}
Сигнализация открытия сделок в эксперте поручена переменной
Signal.
Ее нулевое значение свидетельствует об отсутствии сигнала открытия сделки,
положительное - о наличии сигнала открытия длинной и отрицательное - сигнала открытия
короткой. Подача сигналов закрытия сделок возложено на переменные
CloseLong и CloseShort. Их
ложное значение (false)
сообщает о ненадобности закрытия, а истинное (true)
- о необходимости закрытия сделки. CloseLong
сигнализирует о закрытии длинных сделок, а CloseShort -
о закрытии коротких.
Для оперирования данными,
поступающими от индикаторов BearsPower, BullsPower и
Moving Average, в первом блоке производится расчет
всех необходимых значений на двух последних сформированных свечах.
Первый анализ показаний индикаторов в теле функции происходит
в блоке под номером 2. Здесь проверяются условия формирования сигнала открытия
длинной сделки. Выполнение условий сразу же переводит значение переменной
Signal в 1. Далее следует цикл поиска положительного
значения гистограммы BearsPower, что необходимо для
определения диапазона, на котором будет найдена минимальная цена. Напомним, что
минимальная цена требуется для определения уровня стоп-приказа длинной позиции.
Подобный алгоритм действий представлен в блоке 3. Первое
условие выполняет проверку выполнения критериев открытия короткой позиции. При
истинности условия переменной Signal присваивается
значение -1. Следующий вложенный блок 3.2 производит поиск отрицательного
значения гистограммы BullsPower. До свечи, которой
соответствует первое положительное значение гистограммы, впоследствии
производится поиск максимального значения цены. Полученная величина используется
для определения уровня стоп-приказа короткой позиции.
Блоки 4 и 5 генерируют сигналы закрытия длинных и коротких
позиций, проверяя условия формирования дивергенции. При выполнении одного из
условий возводятся флаги CloseLong или
CloseShort.
Последней функцией, которая отличается от первоисточника
(эксперт EldersMomentum),
является функция Trade:
//+-------------------------------------------------------------------------------------+
//| Открытие позиций |
//+-------------------------------------------------------------------------------------+
bool Trade()
{
// - 1 - ==================== Открытие длинной позиции ==================================
if (Signal > 0 || CloseShort)
{
int Res = CheckOrders(OP_SELL);
if (Res == 0) // Открытых позиций нет, можно открывать новую
if (Signal == 1) // Активен сигнал открытия длинной
if (OpenOrderCorrect(OP_BUY, Lots, NP(Ask), NP(StopPrice-Tick), 0) != 0)
return(False);
if (Res == 1) return(False);//Существует короткая позиция, которую закрыть не удалось
}
// - 1 - ==================== Окончание блока ===========================================
// - 2 - ==================== Открытие короткой позиции =================================
if (Signal < 0 || CloseLong)
{
Res = CheckOrders(OP_BUY);
if (Res == 0) // Открытых позиций нет, можно открывать новую
if (Signal == -1) // Активен сигнал открытия короткой
if (OpenOrderCorrect(OP_SELL, Lots, NP(Bid), NP(StopPrice+Spread), 0) != 0)
return(False);
if (Res == 1) return(False);// Существует длинная позиция, которую закрыть не удалось
}
// - 2 - ==================== Окончание блока ===========================================
return(True);
}
Функция выполняет техническую работу по открытию
и закрытию позиций. Первый блок оперирует открытием длинных и закрытием коротких
позиций, а второй - открытием коротких и закрытием длинных. Для выполнения
каждого из блоков требуется ненулевое значение переменной
Signal или возведение флага CloseLong (CloseShort).
Стоит заметить, что даже отсутствие сигналов закрытия позиции может
привести к ликвидации сделок. Это происходит в случае, если поступает обратный,
относительно текущей сделки, сигнал.
Первый блок выполняется, если Signal имеет
положительное значение или возведен флаг CloseShort.
Первым действием блока в таком случае является проверка существования коротких
позиций. При выявлении таковых будет произведена попытка закрытия сделок. Только
при отсутствии коротких сделок выполнение блока продвинется дальше. Но для
открытия длинной сделки потребуется только положительное значение
Signal.
Второй блок выполняется, если переменная Signal имеет
отрицательное значение или возведен флаг CloseLong.
Начало блока сопровождается проверкой существования длинных позиций, которые
будут закрыты в случае обнаружения. Когда длинные сделки закрыты (или их
попросту нет), то проверяется наличие сигнала открытия коротких сделок. Если
сигнал есть, то производится попытка открытия короткой позиции.
Любые ошибки, возникающие в процессе выполнения функции, приводят к возврату
значения false, что заставляет исполнение вернуться
сюда со следующим тиком. Успешное выполнение всех операций позволяют вернуть
значение True, что даст возможность "отдохнуть"
эксперту до открытия следующей свечи.
Следующим этапом после изготовления советника является его тестирование. Для
этого необходимо определить исторический период тестирования, таймфрейм и набор
входных параметров. По рекомендациям автора стратегии, Александра Элдера, она
должна использоваться на дневном таймфрейме с периодами всех индикаторов,
равными 13. Но такой подход приведет к очень низкой частоте совершения сделок,
что не позволит в полной мере определить прибыльность или убыточность системы.
Поэтому уменьшим таймфрейм до Н1, а периоды индикаторов будем подбирать
индивидуально для каждой валютной пары. Исторический период тестирования возьмем
стандартный - прошлый и текущий годы, то есть с 01.01.2009 до 17.04.2010. Результаты
тестирования приведены на рис. 3 -
6.

Рис. 3. - Результаты тестирования эксперта
Elders_X-Ray на валютной паре EURUSD.
EURUSD.
Оптимальные значения периодов индикаторов оказались следующими:
BearsPowerPeriod = 82,
BullsPowerPeriod = 73, MAPeriod = 60, множитель SLKoef =
3.0.
Кривая баланса олицетворяет собой стабильность, которая немного дрогнула в
течение первых 60 сделок. К слову, количество сделок (329) позволяет уважительно
относиться к результатам, так как уменьшает фактор случайности итогов. Чистая
прибыль смогла добраться до отметки 4558 долларов, что для евро является очень
хорошим показателем. При этом максимальная просадка в численном эквиваленте
осталась далеко позади - 1008 долларов. Фактор восстановления получился и вовсе
высоким для евро - 4.52.
В контексте использования стратегии в условиях реальной торговли потребуется
минимальный депозит 3000 долларов. Плановая доходность при этом будет составлять
около 120% годовых.

Рис. 4. - Результаты тестирования эксперта
Elders_X-Ray на валютной паре USDCHF.
USDCHF.
Оптимальные параметры для франка такие: BearsPowerPeriod
= 110, BullsPowerperiod = 99, MAPeriod = 16 и
SLKoef =
2.0. Кривая баланса вновь блещет стабильностью. Причем, по сравнению с
парой EURUSD, не наблюдается глубоких зон просадки. И
все же чистая прибыль показана на более низкой отметке - 4017 долларов.
Некоторой компенсацией в данном случае выступает значительное уменьшение
максимальной просадки - 693, что дает больший, чем у евро, фактор восстановления
- 5.8.
Для торговли на валютной паре USDCHF потребуется
начальный депозит 2000 долларов с планируемой доходностью 150% годовых.

Рис.
5. - Результаты тестирования эксперта
Elders_X-Ray на валютной паре GBPUSD.
GBPUSD.
Входные параметры эксперта: BearsPowerPeriod = 23,
BullsPowerPeriod = 91, MAPeriod =
400, SLKoef = 5.0. Кривая баланса больше свидетельствует о случайности
полученной чистой прибыли, так как имеет взрывной характер. Наступление
некоторой стабильности во второй части тестирования не должно вводить в
заблуждение - так торговать нельзя. Чистая прибыль 1191 долларов, максимальная
просадка 1476 долларов, что дает фактор восстановления ниже единицы. Такие
результаты нельзя рассматривать для возможности ведения реальной торговли.

Рис. 6. - Результаты тестирования эксперта
Elders_X-Ray на валютной паре USDJPY.
USDJPY.
Результаты показаны при параметрах: BearsPowerPeriod = 98,
BullsPowerPeriod = 67,
MAPeriod =
20, SLKoef = 1.1. Кривая баланса выглядит очень уверенно, за исключением
первых 30 сделок и последних 40 сделок. Отсутствие резких выпадов говорит о не
случайности результатов. Чистая прибыль 2893 доллара, а максимальная просадка
наиболее низкая из всех сегодняшних результатов - 480 долларов. Снова получаем
подтверждение, что за последние два года валютная пара USDJPY
стала наиболее стабильной и прогнозируемой по сравнению с другими
мажорами. Итоговый фактор восстановления системы также получается самым большим
сегодня - 6.03.
Для использования стратегии в торговле на валютной паре
USDJPY потребуется стартовый депозит 1500
долларов с планируемой доходностью 150% годовых.
Доработка стратегии для
использования в AutoGraf 4.0
Вновь доработка эксперта для
применения в качестве стратегии в среде AutoGraf 4.0 требует вынесения ряда входных
параметров во внешние переменные AutoGraf.
На сей раз это также шесть параметров:
BearsPowerPeriod, BullsPowerPeriod, MAPeriod, MAMethod,
MAPrice и SLKoef. Им будут соответствовать
параметры AutoGraf в той же последовательности
- от AT_1 до
AT_6. Задание объема сделок стратегии, как обычно,
осуществляется при помощи значка Lots панели
управления AutoGraf.
Для запуска советника из-под AutoGraf 4.0
совершите такие шаги:
-
Воспользуйтесь ссылкой
Файлы стратегий для Autograf 4.0 и
распакуйте полученный архив
в папку MT4\experts\libraries.
-
Запустите AutoGraf.
-
Для работы советника в ключе приведенных
результатов
в окне настроек AutoGraf (закладка "Входные
параметры") выставьте правильные значения
параметров
AT_1 - AT_6 (полное повторение результатов при
этом не гарантируется).
-
Выберите
стратегию №3. Для этого передвиньте вверх значок
So и среди названий стратегий найдите
значок S3, который также потяните вверх.
-
Запустите функцию
автоматической торговли, передвинув значок AT в верхнее положение.
Использование полученного советника
рекомендуется только в полуавтоматическом режиме под присмотром трейдера и после
всестороннего изучения слабых и сильных сторон стратегии.
Игорь Герасько
Апрель 2010
Специально для компании Admiral
Markets