С давних пор, еще когда я был ребенком, меня вечно интересовал вопрос – как люди из абсолютно одинаковых арбузов, лежащих вповалку на прилавке, выбирают тот единственный, который впоследствии и покупают? Вопрос, казалось бы, риторический, но, как ни странно, покупатель арбуза всегда сможет найти тысячу причин, объясняющих его выбор. Пусть эти причины будут совершенно неочевидны для стороннего наблюдателя, но они реально существуют.
Точно также и с советниками, которые выбираются для «анализа крови». На первый взгляд читателю трудно определить, чем же так зацепил меня тот или иной программный код, что я решил вынести его на общее обозрение. Но и сегодня причина для этого имеется и она не одна.
Первая причина касается моего предубеждения насчет скальпирующих стратегий. Ведь чуть ли не математически доказано, что скальпер – это ненадолго. Время жизни стратегии-скальпера определяется личным везением трейдера, применяющего эту стратегию и очень редко превышает срок в два-три месяца. Тем не менее торговый робот, который будет сегодня представлен на суд общественности, как раз к скальперам и относится, пусть его профит не такой уж и маленький – 20 пунктов. И дело здесь еще в том, что система была разработана в далеком 2005-ом году, а обнадеживающие результаты показывает и по сей день.
Вторая причина касается еще одного моего предубеждения – не использовать показания индикаторов на несформированной свече (нулевой бар). Эксперт как раз активно использует показания нулевого бара, но делается это довольно оригинально, что не дает особого повода для обвинений в изобретении «тестерного грааля».
Дабы не тянуть кота за хвост, перейдем к представлению системы. Название у нее простое и незатейливое – DayTrading. Вот прямо в точку! Явно для того, чтобы никто не подумал, что трейдеры у монитора дрова рубят. Автор скальпера – Collector. Как говорится, фамилию не указали. Результатов тестирования автор не предоставил, поэтому остается только догадываться, на какой валютной паре и каком историческом периоде были добыты первые тестерные успехи.
Тестирование оригинальной версии DayTrading «в наше время» было произведено на таймфрейме М5 и на исторических данных с 01.01.2009 до 04.12.2009, как обычно на четырех валютных парах-мажорах (рис. 1 — 4).
Положительный конечный результат достигнут лишь по одной валютной паре – EURUSD. Все остальные пары показали абсолютную просадку в размере депозита. Да и то, соотношение чистой прибыли и максимальной просадки по паре EURUSD оставляет желать лучшего – 4475 долларов против 8475 долларов, что в итоге дает фактор восстановления меньше единицы (0.53). Тем не менее потенциал у стратегии заметен. Проблемы возникают по двум причинам: слишком частые входы, что уменьшает процент прибыльных сделок, и полное отсутствие уровня стоп-приказа.
С установкой стоп-приказа действительно ничего не поделаешь, так как автор настоятельно советует его не применять, пусть это и противоречит всем принципам надежной торговли. А вот с частотой входа вполне возможно кое-что придумать.
Рассмотрим сигнальную часть стратегии (см. рис. 5).
Эксперт использует данные от четырех индикаторов: Parabolic SAR, MACD, Stochastic и Momentum. Получение значений индикаторов и генерация сигнала очень удобно выделено в отдельную функцию и выглядит так:
void calculateIndicators()
{
macdHistCurrent = iMACD(NULL, 0, 12, 26, 9, PRICE_OPEN, MODE_MAIN, 0);
macdHistPrevious = iMACD(NULL, 0, 12, 26, 9, PRICE_OPEN, MODE_MAIN, 1);
macdSignalCurrent = iMACD(NULL, 0, 12, 26, 9, PRICE_OPEN, MODE_SIGNAL, 0);
macdSignalPrevious = iMACD(NULL, 0, 12, 26, 9, PRICE_OPEN, MODE_SIGNAL, 1);
stochHistCurrent = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 0);
stochHistPrevious = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, 1);
stochSignalCurrent = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 0);
stochSignalPrevious = iStochastic(NULL, 0, 5, 3, 3, MODE_SMA, 0, MODE_SIGNAL, 1);
// Parabolic Sar Current
sarCurrent = iSAR(NULL, 0, 0.02, 0.2, 0);
// Parabolic Sar Previuos
sarPrevious = iSAR(NULL, 0, 0.02, 0.2, 1);
// Momentum Current
momCurrent = iMomentum(NULL, 0, 14, PRICE_OPEN, 0);
// Momentum Previous
momPrevious = iMomentum(NULL, 0, 14, PRICE_OPEN, 1);
// Check for BUY, SELL, and CLOSE signal
isBuying = (sarCurrent <= Ask && sarPrevious>sarCurrent && momCurrent < 100 &&
macdHistCurrent < macdSignalCurrent && stochHistCurrent < 35);
isSelling = (sarCurrent >= Bid && sarPrevious<sarCurrent && momCurrent > 100 &&
macdHistCurrent > macdSignalCurrent && stochHistCurrent > 60);
isClosing = false;
}
Для сигнала к покупке необходимо, чтобы текущее значение Parabolic (на нулевом баре) было меньше цены Ask и при этом предыдущее значение SAR было больше текущего. То есть значения Parabolic должны последовательно уменьшаться, либо должна произойти смена направления движения значений индикатора. Далее текущее значение Momentum должно быть меньше 100, а гистограмма MACD должна находиться ниже сигнальной линии MACD. И в довершение, значение главной линии Stochastic должно быть меньше 35.
Как было упомянуто выше, автора трудно упрекнуть в манипулировании тиковыми данными, так как значения как минимум двух индикаторов – MACD и Momentum – используются неизменные, так как посчитаны по ценам открытия. Это позволяет беспрепятственно учитывать их значения на нулевом баре.
Вернемся к генерации сигналов. Сигнал к продаже поступает, когда текущее значение Parabolic превышает цену Bid, а предыдущее значение SAR оказывается меньше текущего. При этом индикатор Momentum находится выше линии 100, Stochastic – выше 60, а гистограмма MACD превышает свою сигнальную линию.
Как видим, сигналы полностью противоположны друг другу и рассчитаны на коррекцию трендового движения, которая определяется лишь по одному индикатору – Parabolic SAR. Все остальные индикаторы просто идентифицируют сложившееся движение.
В приведенной функции расчета сигнала calculateIndicators бросается в глаза избыточность расчетов индикаторов. Так, значения переменных macdHistPrevious, macdSignalPrevious, stochHistPrevious, stochSignalPrevious и momPrevious абсолютно нигде не используются и только занимают лишнее время при тестировании. Поэтому в новой версии советника они будут исключены. Еще одна переменная, которая, как оказалось, ничего и нигде не решает – IsClosing. Она тоже будет исключена. Также будет исправлено ложное пробитие точки Parabolic при генерации сигнала к покупке. В итоге сигнальная часть станет выглядеть так:
void calculateIndicators()
{
macdHistCurrent = iMACD(NULL, 0, FastMACD, SlowMACD, SignalMACD, PRICE_OPEN, MODE_MAIN, 0);
macdSignalCurrent = iMACD(NULL, 0, FastMACD, SlowMACD, SignalMACD, PRICE_OPEN,
MODE_SIGNAL, 0);
stochHistCurrent = iStochastic(NULL, 0, KStoch, DStoch, SlowingStoch, MODE_SMA, 0, MODE_MAIN, 0);
// Parabolic Sar Current
sarCurrent = iSAR(NULL, 0, SARStep, SARMax, 0);
// Parabolic Sar Previuos
sarPrevious = iSAR(NULL, 0, SARStep, SARMax, 1);
// Momentum Current
momCurrent = iMomentum(NULL, 0, MomPeriod, PRICE_OPEN, 0);
// Check for BUY and SELL signal
isBuying = (sarCurrent < Open[0] && sarPrevious>sarCurrent && momCurrent < 100 &&
macdHistCurrent < macdSignalCurrent && stochHistCurrent < 35);
isSelling = (sarCurrent > Open[0] && sarPrevious<sarCurrent && momCurrent > 100 &&
macdHistCurrent > macdSignalCurrent && stochHistCurrent > 60);
}
Параметры индикаторов было решено вынести во входные параметры советника, чтобы пользователь, при желании, мог легко изменить условия открытия позиций.
Остальные изменения кода коснулись свойств работы советника онлайн. В том числе продумана корректная работа нескольких советников одновременно или советника совместно с человеком.
Проверим же, насколько лучше или хуже стала стратегия, реализованная в роботе DayTrading_edit. Период тестирования выбран такой же: 01.01.2009 – 04.12.2009. Таймфрейм М5 (см. рис. 6 — 9):
Количество сделок на EURUSD уменьшилось в полтора раза. Но это обстоятельство принесло свои плоды – максимальная просадка снижена до 737.06 (более чем в 10 раз!). Правда и чистая прибыль соответственно стала меньше – 1147.67. В результате фактор восстановления вырос в три раза до 1.56. Следующим улучшением стал рост числа прибыльных сделок. Раньше они составляли 83% от общего количества, а теперь почти 87%. Да, совсем немного, но как преобразились результаты! Также стоит отметить рост максимального количества прибыльных сделок подряд. В первой версии мы могли рассчитывать лишь на 21 успех подряд. В новой же версии мы замахнулись на 52 прибыльные сделки к ряду.
Франк не поддержал оптимистичный порыв евро, но, учитывая первый результат, где в конце тестирования мы наблюдали бублик вместо депозита, удержание в пределах начального значения можно считать успехом. Максимальная просадка невелика – 765.17, хотя и без конечной прибыли -217.31.
Еще хуже чувствует себя стратегия на фунте, хотя, опять же, все познается в сравнении (держим в уме первый результат). Но в любом случае здесь можно констатировать, что «пациент скорее мертв, чем жив».
Если сравнивать рис. 8 и 9, то можно испытать чувство дежа-вю – настолько они похожи. Соответственно, выводы по иене будут точно такими же.
Заключение
Исходя из приведенных результатов, можно заключить, что скорее всего советник разрабатывался исключительно для пары EURUSD, так как прибыль видна и в 2005-ом году, и в 2009-ом. Другое дело, что реальное использование стратегии несет в себе огромный риск, так как изначально невозможно определить точку выхода из убыточной сделки. Ее можно лишь оценить после проведения тестирования. Ну а чисто по-человечески, думаю, очень многим хотелось бы понаблюдать на своем реальном счете серию прибыльных сделок в количестве 52 штук…
Файлы для скачивания:
Test.zip – развернутые результаты тестирования советников;
DayTrading.mq4 – оригинальная версия советника;
DayTrading_edit.mq4 – переработанная, исправленная и дополненная версия стратегии.ратегии.