В течение апреля 2010 в рамках проекта
MQLabs было рассмотрено две стратегии Александра
Элдера:
Моментум доктора Элдера и
Рентген Элдера.
Повышенный интерес к этим системам был подкреплен результатами тестирования,
которые показали высокий потенциал каждой из стратегий. Наличие интереса в
совокупности с положительным конечным результатом подталкивает к дальнейшему
исследованию методик доктора Элдера. На этот раз объектом изучения является
импульсная система знаменитого трейдера.
Для получения сигналов заключения и
ликвидации сделок по импульсной системе Элдера используется два самых популярных
в трейдерской среде индикатора - Moving Average (MA) и
Moving Average Convergence/Divergence (MACD). Сигналом к продаже
выступает
уменьшение значений линии МА на двух последних сформированных свечах. При этом
гистограмма MACD также должна указывать на нисходящее
движение, то есть падать (см. рис. 1). Сделка заключается в расчете на захват
импульса цены в направлении сделки. Поэтому позиции в импульсной системе Элдера
открытыми долго не удерживаются. Как только один из двух индикаторов (или оба
сразу) перестают подавать сигнал продажи, сделку необходимо закрывать. В случае,
показанном на рис. 1, сигнал закрытия поступает от МА, которая переходит в
состояние флэта.
Рис. 1. - Открытие и закрытие
коротких
позиций.
Аналогичным образом происходит генерация
сигналов для открытия и закрытия длинных позиций. Одновременный рост значений МА
и гистограммы MACD дают сигнал открытия сделки (см.
рис. 2). Сигналом закрытия является отсутствие сигнала открытия длинной сделки.
Такое случается, когда значения МА не растут или останавливается рост
гистограммы MACD. На рис. 2 длинная сделка закрывается
из-за прекращения роста МА.
Рис. 2. - Открытие и закрытие
длинных
позиций.
Для более наглядного представления сигналов системы можно
использовать индикатор EldersImpulse, который
окрашивает свечи в синий цвет при получении сигнала BUY
и в красный цвет при получении сигнала SELL
(см. рис. 3). При отсутствии сигнала свеча не меняет
свой цвет и отображается в соответствии с установленной гаммой цветов графика
цены.
Для установки параметров MACD
используются внешние переменные индикатора:
FastMACD (период быстрой средней),
SlowMACD (период медленной средней)и
SignalMACD (период сигнальной средней).
Параметры МА указываются в переменных: MAPeriod
(период MA), MAMethod (метод
МА - простой, экспоненциальный, смешанный, линейно-взвешенный)
и MAPrice (цена применения МА -
close, Open, High, Low, Median, Typical, Weighted).
Рис. 3. - Индикатор
EldersImpulse.
Для полноты картины не хватает фильтрации сигналов в
соответствии с направлением тренда, который может быть выявлен при анализе
графика более высокого временного масштаба. Александр Элдер предлагает брать за
основу дневной график, на котором построена экспоненциальная средняя скользящая
линия с периодом 26. Рост дневной МА будет позволять заключать только длинные
сделки, а падение - только короткие.
Вторым фильтром системы является сигнальная линия
MACD, взятая с текущего рабочего графика. Нахождение
гистограммы ниже сигнальной линии подтверждает сигналы падения цены, а
нахождение гистограммы выше сигнальной линии подтверждает сигналы роста цены.
В индикаторе EldersImpulse
фильтрация сигналов при помощи перечисленных дополнительных условий включается
при помощи параметра AddCondition. Включенному
состоянию соответствует значение True, а выключенному
- False (по умолчанию).
Для оценки прибыльности импульсной системы Элдера одного
индикатора явно недостаточно. Он не позволяет получить набор статистических
данных, необходимых для полного анализа методики торговли. В этом случае
потребуется разработка советника, удовлетворяющего описанным правилам заключения
сделок. Имя советника будет похоже на название индикатора -
EldersImpulseSystem. Генерация сигналов в коде советника, как всегда,
производится в одном блоке. Речь идет о функции GetSignal:
//+-------------------------------------------------------------------------------------+
//| Генерация сигналов покупки и продажи по значениям средней скользящей и MACD |
//+-------------------------------------------------------------------------------------+
void GetSignal()
{
Signal = 0;
// - 1 - ====== Значения MACD, средней скользящей на текущем ТФ и на "большом" ТФ =======
double MA1 = iMA(NULL, 0, MAPeriod, 0, MAMethod, MAPrice, 1);
double MA2 = iMA(NULL, 0, MAPeriod, 0, MAMethod, MAPrice, 2);
double MAL1 = iMA(NULL, LargeTF, MALPeriod, 0, MALMethod, MALPrice, 1);
double MAL2 = iMA(NULL, LargeTF, MALPeriod, 0, MALMethod, MALPrice, 2);
double MACD1 = iMACD(NULL, 0, FastMACD, SlowMACD, SignalMACD, PRICE_CLOSE, MODE_MAIN,1);
double MACD2 = iMACD(NULL, 0, FastMACD, SlowMACD, SignalMACD, PRICE_CLOSE, MODE_MAIN,2);
double SMACD = iMACD(NULL,0,FastMACD,SlowMACD, SignalMACD, PRICE_CLOSE, MODE_SIGNAL, 1);
// - 1 - ========================== Окончание блока =====================================
// - 2 - ======================== Генерация сигнала покупки =============================
if (MAL1 > MAL2 && // рост средней на "большом" ТФ
MA1 > MA2 && // рост средней на текущем ТФ
MACD1 > MACD2 && // рост гистограммы МАСД
MACD1 > SMACD) // гистограмма выше сигнальной линии
Signal = 1; // Сигнал покупки
// - 2 - ========================== Окончание блока =====================================
// - 3 - ======================== Генерация сигнала продажи =============================
if (MAL1 < MAL2 && // падение средней на "большом" ТФ
MA1 < MA2 && // падение средней на текущем ТФ
MACD1 < MACD2 && // падение гистограммы МАСД
MACD1 < SMACD) // гистограмма ниже сигнальной линии
Signal = -1; // Сигнал продажи
// - 3 - ========================== Окончание блока =====================================
}
В начале функции переменной Signal, отвечающей за
тип сигнала, присваивается нулевое значение, которое свидетельствует об
отсутствии сигналов открытия сделок. При наличии открытых сделок такое значение
Signal заставит советник закрыть все имеющиеся
позиции.
В первом блоке функции происходит получение значений индикаторов МА и
MACD на двух последних сформированных барах. В
дополнение вычисляется значение МА на том таймфрейме, который указан
пользователем в качестве трендопределяющего. Для указания таймфрейма, на котором
определяется текущий тренд, используется внешняя переменная
LargeTF. Величина LargeTF задается в
минутах и может принимать такие значения: 0 - текущий таймфрейм, 1 - 1
минута, 5 - 5 минут, 15 - 15 минут, 30 - полчаса, 60 - час, 240 - четыре часа,
1440 - день, 10080 - неделя, 43200 - месяц.
Второй и третий блоки подобны. При выполнении условий открытия длинной или
короткой сделки, значение Signal устанавливается в 1
или -1.
//+-------------------------------------------------------------------------------------+
//| Открытие позиций |
//+-------------------------------------------------------------------------------------+
bool Trade()
{
// - 1 - ============== Закрытие позиций, если какой-либо сигнал отсутствует ============
if (Signal == 0)
if (CheckOrders(-1) != 0)
return(False);
// - 1 - ============================== Окончание блока =================================
// - 2 - ==================== Открытие длинной позиции ==================================
if (Signal > 0)
{
int Res = CheckOrders(OP_SELL);
if (Res == 0) // Открытых позиций нет, можно открывать новую
if (OpenOrderCorrect(OP_BUY, Lots, NP(Ask), 0, 0) != 0)
return(False);
if (Res == 1) return(False);//Существует короткая позиция, которую закрыть не удалось
}
// - 2 - ==================== Окончание блока ===========================================
// - 3 - ==================== Открытие короткой позиции =================================
if (Signal < 0)
{
Res = CheckOrders(OP_BUY);
if (Res == 0) // Открытых позиций нет, можно открывать новую
if (OpenOrderCorrect(OP_SELL, Lots, NP(Bid), 0, 0) != 0)
return(False);
if (Res == 1) return(False);// Существует длинная позиция, которую закрыть не удалось
}
// - 3 - ==================== Окончание блока ===========================================
return(True);
}
Первый блок отслеживает ситуации отсутствия какого-либо сигнала, то есть
когда значение Signal равно
нулю. В таких случаях от эксперта требуется лишь одно действие - закрытие всех
открытых в рамках стратегии позиций. Это действие выполняется вызовом функции
CheckOrders с аргументом -1, чем разрешается закрытие
всех типов сделок.
В теле второго блока осуществляется проверка наличия сигнала открытия длинной
позиции. Об этом будет свидетельствовать положительное значение переменной
Signal. Перед открытием рыночного ордера
BUY совершается проверка существования позиции
SELL. Для этого выполняется вызов функции
CheckOrders с аргументом OP_SELL.
Возврат функцией нулевого значения разрешает открытие новой сделки.
Результат, равный 1, означает, что найденная короткая позиция не была закрыта и
требуются дополнительные попытки закрытия. При возврате значения 2 новую сделку
открывать нельзя, так как уже существует подобная сделка.
Третий блок отслеживает сигнал открытия короткой позиции. На такую
необходимость указывает отрицательное значение переменной
Signal. Перед открытием рыночного ордера SELL
совершается проверка существования позиции BUY.
Проверка вновь производится при участии функции CheckOrders,
но уже с аргументом OP_BUY.
Все выполняемые действия проверяются на предмет ошибок. Появление любой
ошибки приводит к возврату функцией Trade значения
False. Только в случае успешного выполнения всех
операций возвращаемый результат будет True.
Используемая в теле функции Trade функция
CheckOrders выглядит следующим образом:
//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров. Возвращает: |
//| 0 - Своих позиций нет. Можно открывать новую позицию |
//| 1 - Не удалось закрыть указанную позицию. Требуется еще попытка |
//| 2 - Существует противоположная указанной поиция |
//+-------------------------------------------------------------------------------------+
int CheckOrders(int Type) // Type - Тип позиции, которую нужно закрыть или -1, если тип
{ // позиции не имеет значения
for (int i = OrdersTotal()-1; i >= 0; i--)
if (OrderSelect(i, SELECT_BY_POS))
if (OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol())
if (OrderType() == Type || Type < 0)
{
if (WaitForTradeContext())
{
if (Type == OP_BUY)
double Price = MarketInfo(Symbol(), MODE_BID);
else
Price = MarketInfo(Symbol(), MODE_ASK);
if (!OrderClose(OrderTicket(), OrderLots(), NP(Price), 3))
return(1);
}
}
else
return(2);
return(0);
}
Функция CheckOrders служит для закрытия рыночных
ордеров заданного типа. Тип ордера указывается во входном параметре функции
Type. Отрицательное значение параметра означает
закрытие всех позиций, открытых экспертом.
Поиск позиций, открытых экспертом, производится при помощи проверки всего
списка имеющихся ордеров. Среди них отбираются те ордера, которые открыты по
текущему инструменту (валютной паре) со значением поля
MagicNumber, равного значению, которое указал пользователь во входном
параметре эксперта MagicNumber. Тип найденного ордера
сравнивается со значением, указанным в переменной Type.
При равенстве значений или отрицательном значении Type
производится попытка закрытия рыночного ордера. Провал
попытки закрытия приводит к возврату функцией значения 1. При удачном закрытии
цикл проверки ордеров продолжается и после его окончании функция возвращает
результат 0.
Если тип ордера не равен значению Type, то функция
CheckOrders завершается с возвратом значения 2, что
сигнализирует о наличии противоположной Type позиции.
Во всем остальном код эксперта стандартный. Поэтому самое время перейти к
тестированию стратегии на исторических данных.
Исторический период
тестирования устанавливается с 01.01.2008 до 01.05.2010,
таймфрейм Н4. Для каждой из валютных пар подобраны индивидуальные значения
периода быстрой средней MACD (FastMACD), медленной
средней MACD (SlowMACD) и периода МА (MAPeriod).
Остальные параметры для всех валютных пар одинаковые.
Объем сделок Lots установлен 0.1, период сигнальной
линии MACD (Signal MACD) равен 9. Метод средней
MAMethod равен 1 (экспоненциальная средняя),
цена MAPrice установлена в 0 (по ценам закрытия).
Таймфрейм для определения тренда взят дневной, то есть параметр
LargeTF установлен в 1440. Период дневной средней
MALPeriod равен 26, метод дневной средней
MALMethod равен 1 (экспоненциальная средняя) и цена
дневной средней MALPrice равна 0 (по ценам закрытия). Результаты
тестирования приведены на рис. 4 -7.
Рис. 4. - Результаты тестирования эксперта
EldersImpulseSystem на валютной паре EURUSD.
EURUSD.
Значения изменяемых параметров были взяты такие: FastMACD= 28,
SlowMACD = 36, MAPeriod = 55.
Кривая баланса настолько хаотичная, что не оставляет никаких сомнений в
неприспособленности стратегии к валютной паре EURUSD.
При этом конечный итог тестирования все же положительный. Чистая прибыль 1266
долларов, но с максимальной просадкой 1620 долларов, что дает фактор
восстановления 0.78. Очень сомнительно, что найдутся люди, готовые рисковать
всем своим депозитом для получения прибыли в 78% от него.
Рис. 5. - Результаты тестирования эксперта
EldersImpulseSystem на валютной паре USDCHF.
USDCHF.Оптимальные параметры для франка такие:
FastMACD
= 11, SlowMACD = 21, MAPeriod = 9.
Кривая баланса не такая хаотичная, как в случае с евро, но имеет явную
предрасположенность к движению вниз. В данном случае ни один трейдер не станет
ей попутчиком. Еще больше усугубляет картину конечный итог тестирования. Чистая
прибыль -516 долларов при максимальной просадке 1921 доллар. Если даже при
тестировании получается отрицательная чистая прибыль, то далее обсуждать
попросту нечего.
Рис.
6. - Результаты тестирования эксперта
EldersImpulseSystem на валютной паре GBPUSD.
GBPUSD.Входные параметры эксперта:
FastMACD = 14, SlowMACD = 32, MAPeriod =
7. Особенной стабильностью кривая баланса не блещет. Но начальный участок
тестирования, который явно не подходит для стратегии в целом, система выдержала
достойно, показав не очень большую просадку. Последние две трети кривой баланса
вселяют оптимизм, так как явно указывают восходящую тенденцию линии. Чистая
прибыль зафиксирована на отметке 4220 долларов, а максимальная просадка 1427
долларов. Фактор восстановления получается 2.96, что можно принять как
положительный итог.
Для использования системы в реальной торговле потребуется депозит 4200 долларов.
Но ожидаемая годовая доходность получается не очень высокая - около 40% годовых.
Правда, это все равно больше, чем предлагает любой банк мира по частным вкладам.
Рис. 7. - Результаты тестирования эксперта
EldersImpulseSystem на валютной паре USDJPY.
USDJPY.Результаты показаны при параметрах:
FastMACD = 14, SlowMACD = 23,
MAPeriod =
44. Несмотря на смазанную последнюю треть теста, кривая баланса имеет
восходящую направленность. Но стабильности ей очень не хватает. Чистая прибыль
901 доллар при максимальной просадке 1235 долларов. То есть вновь выходит малый
фактор восстановления 0.73, что не дает никаких перспектив для использования
системы.
Вывод о системе в целом получается неутешительный. В отличие от первых двух
рассмотренных стратегий Элдера, импульсная система не является такой уж
универсальной и имеет ограниченное применение на избранных валютных парах. Но
даже на таких, избранных, инструментах получить приемлемую прибыль видится
маловероятным событием.
Доработка стратегии для
использования в AutoGraf 4.0
Преобразование эксперта в стратегию
для AutoGraf 4.0 требует вынесения десяти входных
параметров во внешние переменные AutoGraf.
Все они будут указываться во входных параметрах AutoGraf
с AT_1 до AT_10
включительно. Соответствие выбрано следующее: FastMACD -
AT_1, SlowMACD - AT_2, SignalMACD - AT_3, MAPeriod - AT_4, MAMethod - AT_5,
MAPrice - AT_6, LargeTF - AT_7, MALPeriod - AT_8, MALMethod - AT_9, MALPrice -
AT_10. Задание объема сделок стратегии, как обычно,
осуществляется при помощи значка Lots панели
управления AutoGraf.
Для запуска советника из-под AutoGraf 4.0
требуется совершить такие шаги:
Для работы советника в ключе приведенных
результатов
в окне настроек AutoGraf (закладка "Входные
параметры") выставить правильные значения
параметров
AT_1 - AT_10 (полное повторение результатов при
этом не гарантируется).
Выбрать
стратегию №3. Для этого
необходимо передвинуть вверх значок
So и среди названий стратегий найти
значок S3, который также потянуть вверх.
Запустить функцию
автоматической торговли, передвинув значок AT в верхнее положение.
Использование полученного советника
рекомендуется только в полуавтоматическом режиме под присмотром трейдера и после
всестороннего изучения слабых и сильных сторон стратегии.
Комментарии
Отправить комментарий