На примере
Комплексного советника можно было убедиться в прибыльности множества
простейших стратегий, основанных на одном-двух стандартных индикаторах. Среди
прочих очень хорошо зарекомендовал себя осциллятор Stochastic.
Результаты, показанные на валютной паре GBPJPY
стратегией, основанной на пересечении главной и сигнальной линии индикатора,
воодушевляют и требуют новых исследований в этом направлении.
Основным недостатком стратегии,
реализованной в рамках Комплексного советника, является полное отсутствие
уровней профита и стоп-приказа. Это делает систему уязвимой перед возможными
сбоями в средствах связи и непосредственно в оборудовании, в среде которого
функционирует программа. Второй, но не менее существенный, недостаток -
отсутствие системы фильтрации сигналов. В результате при отсутствии размашистых
движений рынка эксперт запаздывает с входом, что приводит к появлению серьезных
просадок.
На решение перечисленных проблем и
направлено данное исследование. В первую очередь необходимо повысить качество
сигнала, что достигается фильтрацией первичного сигнала при помощи
дополнительных индикаторов. Руководствуясь выражением "Клин клином вышибают", в
качестве дополнительного индикатора стоит взять...
Stochastic. Смысл подобной фильтрации заключается в использовании таких
параметров осциллятора, которые делают индикатор более чувствительным к
изменению рыночных тенденций. Повышенная чувствительность достигается за счет
уменьшения периодов K и D
осциллятора. Поэтому по отношению к первичному Stochastic
фильтрующий индикатор будет "быстрым". Соответственно, имеющийся
Stochastic становится "медленным".
В итоге условия заключения длинных сделок
будут следующими (см. рис. 1).
Рис. 1. - Открытие и закрытие
рыночного ордера BUY.
Первичный сигнал поступает от "медленного"
Stochastic, на котором должно быть зафиксировано
пересечение сигнальной линии (красный пунктир)
главной линией (сплошная цвета морской волны) снизу вверх. После этого
проверяется положение главной и сигнальной линий "быстрого"
Stochastic. Для подтверждения необходимо, чтобы главная линия была выше
сигнальной.
Казалось бы, фильтр собран "наоборот".
Обычно первичный сигнал снимается с более чувствительного индикатора, а менее
чувствительный выступает подтверждающим звеном. Но в данном случае логика
обратная. "Медленный" Stochastic позднее реагирует на
смену тенденции и поэтому может подавать сигнал, когда основное движение уже
заканчивается. В этот момент "быстрый" Stochastic будет сигнализировать о начале противоположного тренда, чем отфильтрует ложный
сигнал.
Решение основной части задачи - установка
уровней стопа и профита - производится свойственным
MQLabs методом. Уровень стопа устанавливается ниже минимального значения
цены за время пребывания главной линии "медленного"
Stochastic ниже сигнальной линии. Уровень профита рассчитывается из
значения средней волатильности за последние 24 бара (в случае использования
таймфрейма H1 это последние сутки). Значение средней
волатильности умножается на соответствующий коэффициент (чаще всего 5) и
прибавляется к цене открытия сделки.
Кроме случаев достижения рыночной ценой
уровней стопа и профита остается возможность закрытия позиции при получении
обратного сигнала. Поэтому длинная сделка может быть закрыта при появлении
сигнала SELL. Условия открытия короткой позиции
показаны на рис. 2.
Рис. 2. - Открытие и закрытие
рыночного ордера SELL.
Снова первичный
сигнал поступает от "медленного" Stochastic. На этот
раз сигнальная линия (красный пунктир) должна пересечь главную линию (сплошная
цвета морской волны) снизу вверх. После фиксации пересечения проверяется
положение линий "быстрого" Stochastic. Главная линия
должна быть ниже сигнальной линии.
Установка уровня стопа производится выше
максимального значения цены за время нахождения главной линии "медленного"
Stochastic выше сигнальной линии. Уровень профита
рассчитывается из среднего значения волатильности за предыдущие 24 бара, которое
умножается на коэффициент, равный 5. Полученное значение вычитается из цены
открытия позиции. Последним штрихом в вычислении уровня является добавление спрэда, так как
рассчитанный уровень - это цена Bid, в то время как
короткие позиции закрываются по цене Ask.
По мере движения
цены между уровнями стопа и профита короткой позиции может поступить сигнал
открытия длинной позиции. В этом случае имеющаяся сделка принудительно
закрывается и открывается новый рыночный ордер BUY.
Для указания
периодов "медленного" и "быстрого" Stochastic, объема
сделок, а также коэффициента умножения, используемого при расчете уровня
профита, новый эксперт TwoStochastics располагает
такими входными параметрами:
Lots - объем сделок. При
указании недопустимого значения (слишком малого, слишком большого или
несоответствующего принятому шагу) робот сам преобразует значение к
ближайшему допустимому.
FastK - период
K "быстрого"Stochastic. Должен быть больше 1.
FastD - период
D "быстрого"Stochastic. Должен быть больше 1.
FastSlowing - период замедления
"быстрого"Stochastic.
Должен быть больше 1.
SlowK - период
K "медленного"Stochastic. Должен быть больше 1.
SlowD - период
D "медленного"Stochastic. Должен быть больше 1.
SlowSlowing - период замедления
"медленного"Stochastic.
Должен быть больше 1.
Factor - коэффициент умножения
для расчета уровня профита. Любое положительное число.
От большинства экспертов, разработанных в
рамках проекта MQLabs, текущий эксперт отличается
всего лишь двумя функциями: GetSignal и
Trade. Код функции GetSignal,
отвечающей за расчет сигнала, приведен ниже:
//+-------------------------------------------------------------------------------------+
//| Генерация сигналов покупки и продажи по значениям двух стохастиков |
//+-------------------------------------------------------------------------------------+
void GetSignal()
{
Signal = 0;
// - 1 - ====== Определение значений главной и сигнальной линий обоих стохастиков =======
double FastM1 = iStochastic(NULL,0,FastK,FastD,FastSlowing,MODE_SMA,0,MODE_MAIN,1);
double FastS1 = iStochastic(NULL,0,FastK,FastD,FastSlowing,MODE_SMA,0,MODE_SIGNAL,1);
double SlowM1 = iStochastic(NULL,0,SlowK,SlowD,SlowSlowing,MODE_SMA,0,MODE_MAIN,1);
double SlowS1 = iStochastic(NULL,0,SlowK,SlowD,SlowSlowing,MODE_SMA,0,MODE_SIGNAL,1);
double SlowM2 = iStochastic(NULL,0,SlowK,SlowD,SlowSlowing,MODE_SMA,0,MODE_MAIN,2);
double SlowS2 = iStochastic(NULL,0,SlowK,SlowD,SlowSlowing,MODE_SMA,0,MODE_SIGNAL,2);
// - 1 - ========================== Окончание блока =====================================
// - 2 - ======================== Генерация сигнала покупки =============================
if (FastM1 > FastS1 && SlowM1 > SlowS1 && SlowM2 < SlowS2)
{
// - 2.1 - ===== Поиск предпоследнего пересечения главной и сигнальной линий ========
// ============================ медленного стохастика ===============================
int i = 2;
while (SlowM2 < SlowS2 && i < Bars)
{
SlowM2 = iStochastic(NULL,0,SlowK,SlowD,SlowSlowing,MODE_SMA,0,MODE_MAIN,i);
SlowS2 = iStochastic(NULL,0,SlowK,SlowD,SlowSlowing,MODE_SMA,0,MODE_SIGNAL,i);
i++;
}
// - 2.1 - ========================= Окончание блока ================================
// - 2.2 - ============= Определение уровня стопа и генерация сигнала ===============
StopLoss = Low[iLowest(NULL, 0, MODE_LOW, i - 2, 2)] - Tick;
Signal = 1; // Сигнал покупки
// - 2.2 - ========================= Окончание блока ================================
}
// - 2 - ========================== Окончание блока =====================================
// - 3 - ======================== Генерация сигнала продажи =============================
if (FastM1 < FastS1 && SlowM1 < SlowS1 && SlowM2 > SlowS2)
{
// - 3.1 - ===== Поиск предпоследнего пересечения главной и сигнальной линий ========
// ============================ медленного стохастика ===============================
i = 2;
while (SlowM2 > SlowS2 && i < Bars)
{
SlowM2 = iStochastic(NULL,0,SlowK,SlowD,SlowSlowing,MODE_SMA,0,MODE_MAIN,i);
SlowS2 = iStochastic(NULL,0,SlowK,SlowD,SlowSlowing,MODE_SMA,0,MODE_SIGNAL,i);
i++;
}
// - 3.1 - ========================= Окончание блока ================================
StopLoss = High[iHighest(NULL, 0, MODE_HIGH, i - 2, 2)] + Spread + Tick;
Signal = -1; // Сигнал продажи
}
// - 3 - ========================== Окончание блока =====================================
}
Как обычно, за наличие сигнала отвечает переменная Signal,
нулевое значение которой соответствует отсутствию сигнала. Положительное значение
указывает на наличие сигнала покупки, а отрицательное - на наличие сигнала
продажи.
В первом блоке рассчитываются значения главной и
сигнальной линий обоих осцилляторов Stochastic на
первом и втором барах, если считать от текущего бара.
Второй блок выполняется при условии свершившегося
пересечения главной линией "медленного" Stochastic
сигнальной линии снизу вверх и нахождения главной линии "быстрого"
Stochastic выше сигнальной линии. Вложенный блок 2.1
при этом выполняет поиск ближайшего, кроме первого, бара, на котором главная
линия "медленного" Stochastic находится выше
сигнальной линии. Найденный номер бара применяется во вложенном блоке 2.2, где
рассчитывается уровень стопа (переменная StopLoss) для
будущей длинной позиции и устанавливается положительное значение
Signal.
Третий блок выполняется при
условии пересечения главной линией "медленного" Stochastic
сигнальной линии сверху вниз и нахождения главной линии "быстрого"
Stochastic ниже сигнальной линии. Подобно вложенному
блоку 2.1, блок 3.1 выполняет поиск ближайшего бара, на котором главная линия
"медленного" Stochastic находится ниже сигнальной
линии. Номер такого бара используется для расчета уровня стопа будущей короткой
позиции во вложенном блоке 3.2. Там же устанавливается
отрицательное значение переменной Signal.
Всоответствии со значением переменной Signal
исполняется функция Trade:
//+-------------------------------------------------------------------------------------+
//| Открытие позиций |
//+-------------------------------------------------------------------------------------+
bool Trade()
{
// - 1 - ==================== Открытие длинной позиции ==================================
if (Signal > 0)
{
int Res = CheckOrders(OP_SELL);
if (Res == 0) // Открытых позиций нет, можно открывать новую
{
double TP = Ask + iATR(NULL, 0, 24, 1)*Factor;//Уровень профита - 5 волатильностей
if (OpenOrderCorrect(OP_BUY, Lots, NP(Ask), NP(StopLoss), NP(TP)) != 0)
return(False);
}
if (Res == 1) return(False);//Существует короткая позиция, которую закрыть не удалось
}
// - 1 - ==================== Окончание блока ===========================================
// - 2 - ==================== Открытие короткой позиции =================================
if (Signal < 0)
{
Res = CheckOrders(OP_BUY);
if (Res == 0) // Открытых позиций нет, можно открывать новую
{
TP = Bid - iATR(NULL, 0, 24, 1)*Factor;// Уровень профита - 5 сред. волатильностей
if (OpenOrderCorrect(OP_SELL, Lots, NP(Bid), NP(StopLoss), NP(TP)) != 0)
return(False);
}
if (Res == 1) return(False);// Существует длинная позиция, которую закрыть не удалось
}
// - 2 - ==================== Окончание блока ===========================================
return(True);
}
Исполнение первого блока происходит при
положительном значении Signal, то есть когда
существует сигнал открытия длинной позиции. Первым действием при этом является
проверка существования короткой позиции. Для этого вызывается функция
CheckOrders, которая применялась в последних трех
экспертах MQLabs. Новый рыночный ордер открывается при
возвращении нулевого значения функцией CheckOrders,
что свидетельствует об отсутствии каких бы то ни было ордеров, установленных
текущим экспертом на активной валютной паре. Значение 2 говорит об уже
установленном ордере BUY, а 1 - об ошибке закрытия
сделки SELL.
Перед открытием сделки
BUY производится расчет уровня профита по описанному
выше алгоритму. Только после выполнения расчета вызывается функция
OpenOrderCorrect, совершающая открытие рыночного
ордера BUY с установленными уровнями стопа и профита.
Удачное открытие сделки позволяет функции Trade
вернуть значения True. А при наличии ошибки функция
Trade будет вынуждена вернуть результат
False.
Второй блок выполняется при
отрицательном значении Signal, то есть когда
существует сигнал открытия короткой позиции. Как и в блоке 1, сначала
проверяется существование длинной позиции, открытой экспертом. При возврате
функцией CheckOrders значения 0происходит расчет уровня профита и открытие рыночного ордера
SELL. В зависимости от результата операции открытия,
функция Trade возвращает результат
False или True.
Во всем остальном код эксперта стандартный. Поэтому самое время перейти к
тестированию стратегии на исторических данных.
Исторический период
тестирования устанавливается с 01.01.2009 до 08.05.2010,
таймфрейм Н1. Для каждой из валютных пар подобраны индивидуальные значения
периодов K, D и замедления "быстрого" и "медленного"
Stochastic.
Остальные параметры использовались со значениями по умолчанию: Lots
= 0.1, Factor = 5. Результаты
тестирования приведены на рис. 3 -
6.
Рис. 3. - Результаты тестирования эксперта
TwoStochastics на валютной паре EURUSD.
EURUSD.
Значения изменяемых параметров были взяты такие: FastK=
5, FastD = 4, FastSlowing = 5, SlowK = 25, SlowD = 11, SlowSlowing = 20.
Кривая баланса выглядит достаточно надежно. Единственный минус - неравномерность
роста. Так, до 60 сделки было зафиксировано больше половины конечной чистой
прибыли. В то же время на оставшиеся 190 сделок пришлась остальная (меньшая)
часть прибыли. Итоговая чистая прибыль составила 6639 долларов при максимальной
просадке 669 долларов. Таким образом, фактор восстановления достиг рекордной для
евро отметки - 9.92.
При желании использовать стратегию с парой EURUSD в
реальной торговле необходимо иметь депозит 2000 долларов (для работы объемом 0.1
лот). В итоге можно рассчитывать на годовую доходность порядка 250%.
Рис. 4. - Результаты тестирования эксперта
TwoStochastics на валютной паре USDCHF.
USDCHF.Оптимальные параметры для франка такие:
FastK= 6,
FastD = 4, FastSlowing = 4, SlowK = 20,
SlowD = 11, SlowSlowing = 19. Кривая баланса
менее устойчива, чем в случае с евро, но ее рост более равномерный. Чистая
прибыль 2864 доллара при максимальной просадке 626 долларов, что дает фактор
восстановления 4.58. Большим минусом стратегии применительно к франку является
количество непрерывных убыточных сделок - 12. Правда, в денежном эквиваленте эта
серия приносит не очень большой убыток - 420 долларов.
Для использования эксперта TwoStochastics на валютной
паре USDCHF необходим капитал такой же, как и в случае
с евро - 2000 долларов. Но рассчитывать на подобную евро годовую доходность не
приходится. В данном случае показатели более скромные - около 110% годовых.
Рис.
5. - Результаты тестирования эксперта
TwoStochastics на валютной паре GBPUSD.
GBPUSD.Входные параметры эксперта:
FastK= 8,
FastD = 6, FastSlowing = 10,
SlowK = 17, SlowD = 15,
SlowSlowing = 16. Кривая баланса самая
стабильная из предыдущих двух рассмотренных. Но снова наблюдается
неравномерность роста. Первая половина тестирования показывает более крутой
подъем баланса. В то же время, вторая половина демонстрирует достаточно пологий
вид кривой, которая к концу тестирования практически вырождается в прямую.
Чистая прибыль 6720 долларов, максимальная просадка 793 доллара. Фактор
восстановления 8.47, что для фунта далеко не предел.
Для использования системы в реальной торговле потребуется депозит 2500 долларов.
Ожидаемая годовая доходность выходит около 200% годовых.
Рис. 6. - Результаты тестирования эксперта
TwoStochastics на валютной паре USDJPY.
USDJPY.Результаты показаны при параметрах:
FastK= 15,
FastD = 10, FastSlowing = 5,
SlowK = 25, SlowD = 24,
SlowSlowing = 22. В отличие от всех предыдущих
кривых баланса, эта отличается равномерностью роста, но вот стабильности кривой
не хватает. Несомненным достоинством текущего результата тестирования является
низкая максимальная просадка - 512 долларов при чистой прибыли 4691 доллар.
Фактор восстановления 9.16, что является очень хорошим результатом для йены. Еще
два примечательных статистических показателя: количество прибыльных сделок
больше, чем убыточных (54% против 46% - единственный подобный результат
сегодня), и малое количество убыточных сделок подряд - 5. Эти показатели как раз
и свидетельствуют о высокой надежности системы, что дает возможность более
уверенного ее использования в реальных условиях.
Размер стартового капитала при использовании на паре USDJPY
потребуется небольшой - 1600 долларов. Ожидаемая годовая доходность при
этом солидная - 220%.
Подводя итоги по системе в целом, стоит отметить высокие значения фактора
восстановления при использовании на любой валютной паре из числа рассмотренных.
Все кривые баланса выглядят стабильно, а уровень просадок достаточно мал.
Если использовать эксперт TwoStochastics на всех
четырех валютных парах, то потребуется капитал 8100 долларов. Совокупная
ожидаемая доходность в этом случае будет 190% годовых.
Доработка стратегии для
использования в AutoGraf 4.0
Эксперт
TwoStochastics может быть преобразован в стратегию, используемую в среде
AutoGraf 4.0.С этой целью
входные параметры советника FastK,
FastD, FastSlowing, SlowK, SlowD, SlowSlowing и
Factor выносятся во входные параметры
AutoGraf с AT_1 до
AT_7 включительно в названном порядке. Настройка объема сделок стратегии, как обычно,
осуществляется при помощи значка Lots панели
управления AutoGraf.
Для запуска советника из-под AutoGraf 4.0
требуется совершить такие шаги:
Для работы советника в ключе приведенных
результатов
в окне настроек AutoGraf (закладка "Входные
параметры") выставить правильные значения
параметров
AT_1 - AT_7 (полное повторение результатов при
этом не гарантируется).
Выбрать
стратегию №3. Для этого
необходимо передвинуть вверх значок
So и среди названий стратегий найти
значок S3, который также потянуть вверх.
Запустить функцию
автоматической торговли, передвинув значок AT в верхнее положение.
Использование полученного советника
рекомендуется только в полуавтоматическом режиме под присмотром трейдера и после
всестороннего изучения слабых и сильных сторон стратегии.
Комментарии
Отправить комментарий