Консультант-советник трейдера на основе расширенного анализа MACD
Введение
Одним из лучших признанных индикаторов направления движения цены является гистограмма MACD. По рекомендациям доктора А.Элдера тенденция направления движения цены (тренд) определяется двумя последними барами на соответствующем периоде. Однако по двум барам кроме направления движения ничего другого практически сказать нельзя. Конечно, опытный трейдер по внешнему виду гистограммы может представить себе несколько больше, опираясь на интуицию. А если для анализа взять три последних бара, то качество и количество информации значительно расширятся.
Немного о самом скрипте:
Скрипт можно использовать, по меньшей мере, в двух направлениях.
Первое - использование как советника-консультанта во время торговли для определения момента входа в рынок и выхода из него, а так же для определения объема сделки (лота) в зависимости от положения, направления и положительного или отрицательного ускорения прироста объема гистограммы.
Второе назначение – использование скрипта при проведении анализа прошедших событий (на истории). При присоединении скрипта к графику для проведения анализа выводится окно свойств, в котором можно задать (изменить) номер начального бара и задать любой анализируемый период графика. При использовании скрипта для торговли в реальном времени номер начального бара должен быть равен нулю (последний текущий бар) или единице (по желанию пользователя), а период графика – тот в котором Вы открываете или держите позиции.
//+------------------------------------------------------------------+ //| TrendMACD v5.mq4 | //|Анализ гистограммы MACD по трем последним барам Genkov | //| genkov@bk.ru | //+------------------------------------------------------------------+ #property copyright "Genkov" #property link "genkov@bk.ru" //если ниже лежащую строку закомментировать, то окно со свойствами не будет выводиться #property show_inputs extern int a = 0; // здесь можно задать любой начальный исследуемый бар //extern int period = 1; // 1 минута //extern int period = 5; // 5 минут //extern int period = 15; // 15 минут extern int period = 30; // 30 минут //extern int period = 60; // раскомментируйте нужный Вам период //extern int period = 240; // 4 часа //extern int period = 1440; // день //extern int period = 10080; // неделя //extern int period = 43200; // месяц //+------------------------------------------------------------------+
Основную переменную для номера начального бара «а» и переменную для периодов «period» поставим в глобальные переменные скрипта. А внутренние переменные для расчетов и сравнений поместим после запускающей функции:int start()
{
int b,c;
b=a+1; c=b+1;
//----
double Macd_h1_a= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,a);
double Macd_h1_b= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,b);
double Macd_h1_c= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,c);
Для визуального контроля расчетов здесь можно поместить оператор Print(), который может пригодиться при проведении анализа прошедших событий (на истории). Множитель «*1000» (можно и другой) нужен для большей читабельности полученных результатов.Print(" Macd_h1_c= ",Macd_h1_c*1000," Macd_h1_b= ",
Macd_h1_b*1000," Macd_h1_a= ",Macd_h1_a*1000);
Если Вам понадобится отключить сообщения (Alert-ов), в операторе «int Message = 1;» надо заменить единицу на ноль. При этом, чтобы информация где-то отражалась, надо закомментировать операторы «int Message = 1;» и « Message == 1;» все последующие операторы Alert() заменить на операторы Print(), тогда информацию можно будет видеть во вкладке терминала «Эксперты».
Скрипт предусматривает возможность расчета времени работы скрипта при помощи функции GetTickCount(). Для этого в начале работы программы помещаем следующий оператор:
int start=GetTickCount(); //… //…, а в конце программы: Alert(" Время вычисления ", GetTickCount()-start," миллсек");Основной программный код скрипта состоит из блоков сравнения состояния (положения и величины отношений разностей значений гистограммы на исследуемых барах).
В скрипте анализируются основные значимые возможные переходные состояния (ситуации). Например:
Всего в программе 6 блоков сравнения: с 1 по 2 - блок для MACD ниже оси // ----------------------для MACD ниже оси-------------------------1--&
if(Macd_h1_c<0.0&&Macd_h1_a<0.0&&Macd_h1_a<0.0)
{
//прирост "0" бара относительно первого
double r1=MathAbs(MathAbs(Macd_h1_a)-MathAbs(Macd_h1_b));
//прирост "1" бара относительно "2"
double r2=MathAbs(MathAbs(Macd_h1_b)-MathAbs(Macd_h1_c));
// -- MACD внизу - тренд идет вниз
if(Macd_h1_c>Macd_h1_b&&Macd_h1_b>Macd_h1_a)
{
if(r1>r2)
{
Alert("На ",a," баре MACD<0 = ",Macd_h1_a,
" Тренд идет вниз \\\'с ускорением");
}
if(r1<r2)
{
Alert("На ",a," баре MACD<0 = ",Macd_h1_a,
" Тренд идет вниз \^с замедлением");
}
if((r1==r2)||MathAbs(r1-r2)<0.000015)
{
Alert("На ",a," баре MACD<0 = ",Macd_h1_a,
" Тренд идет вниз равноускоренно");
}
}
// -- MACD внизу - тренд идет вверх
if(Macd_h1_c<Macd_h1_b&&Macd_h1_b<Macd_h1_a)
{
if(r1>r2)
{
Alert("На ",a," баре MACD<0 =",Macd_h1_a,
" Тренд идет вверх //''с ускорением");
}
if(r1<r2)
{
Alert("На ",a," баре MACD<0 = ",Macd_h1_a,
" Тренд идет вверх /^с замедлением");
}
if((r1==r2)||MathAbs(r1-r2)<0.000015)
{
Alert("На ",a," баре MACD<0 = ",Macd_h1_a,
" Тренд идет вверх равноускоренно");
}
}
// --- MACD внизу -тренд разворачивается вниз
if(Macd_h1_c<Macd_h1_b&&Macd_h1_b>Macd_h1_a)
{
if(r1>r2)
{
Alert("На ",a," баре MACD<0 = ",Macd_h1_a,
" Тренд разворачивается вниз /\\'с ускорением");
}
if(r1<r2)
{
Alert("На ",a," баре MACD<0 = ",Macd_h1_a,
" Тренд разворачивается вниз //^с замедлением");
}
}
// --- MACD внизу -тренд разворачивается вверх
if(Macd_h1_c>Macd_h1_b&&Macd_h1_b<Macd_h1_a)
{
if(r1>r2)
{
Alert("На ",a," баре MACD<0 = ",Macd_h1_a,
" Тренд разворачивается вверх //''с ускорением");
}
if(r1<r2)
{
Alert("На ",a," баре MACD<0 = ",Macd_h1_a,
" Тренд разворачивается вверх \/^с замедлением");
}
}
if(MathAbs(MathAbs(Macd_h1_a)-MathAbs(Macd_h1_b))<0.0002 &&
MathAbs(MathAbs(Macd_h1_c)-MathAbs(Macd_h1_b))<0.0002)
{
Alert("На ",a," баре,однако,Флет! в диапазоне: ",Macd_h1_c,
" ",Macd_h1_b," ",Macd_h1_a);
}
}
Аналогичный с 2 по 3 - блок для MACD выше оси (см. прикрепленные файлы)
с 3 по 4 – блок для перехода через ось снизу вверх:// ------------для перехода через ось снизу вверх------------------3--&
if(Macd_h1_c<0.0 && Macd_h1_b<0.0 && Macd_h1_a>0&& // c<0 b<0
Macd_h1_c<Macd_h1_b&&Macd_h1_b<Macd_h1_a)
{
r1=MathAbs(Macd_h1_a)+MathAbs(Macd_h1_b);
r2=MathAbs(Macd_h1_c)-MathAbs(Macd_h1_b);
if(MathAbs(r1)>MathAbs(r2))
{
Alert("На ",a," баре Тренд пересекает ось снизу вверх //'' с ускорением ");
}
if(MathAbs(r1)<MathAbs(r2))
{
Alert("На ",a," баре Тренд пересекает ось снизу вверх /^ с замедлением ");
}
}
//---
if(Macd_h1_c<0.0 && Macd_h1_b>0.0 && Macd_h1_a>0&& // b>0 a>0
Macd_h1_c<Macd_h1_b&&Macd_h1_b<Macd_h1_a)
{
r1=MathAbs(Macd_h1_a)-MathAbs(Macd_h1_b);
r2=MathAbs(Macd_h1_c)+MathAbs(Macd_h1_b);
if(MathAbs(r1)>MathAbs(r2))
{
Alert("На ",a," баре Тренд пересекает ось снизу вверх //''с ускорением");
}
if(MathAbs(r1)<MathAbs(r2))
{
Alert("На ",a," баре Тренд пересекает ось снизу вверх /^ с замедлением");
}
}
Аналогичный с 4 по 5 – блок для перехода через ось сверху вниз (см. прикрепленные файлы)
Блоки с 5 по 6 - для разворота под осью и с 6 по 7 – для разворота над осью закомментированы и могут пригодиться любителям анализа на истории. (см. прикрепленные файлы)
Пример работы скрипта на истории:
Для скрипта, предназначенного только для торгов, «шапка» скрипта должна выглядеть примерно следующим образом://+------------------------------------------------------------------+
//| TrendMACD v6.mq4 |
//| для торгов |
//+------------------------------------------------------------------+
#property copyright "Genkov"
#property link "genkov@bk.ru"
extern int a = 0; // здесь можно задать начальный исследуемый бар
extern int period = 30; // поставьте значение нужного Вам периода
//+------------------------------------------------------------------+
int start()
{
int b,c; b=a+1; c=b+1;
//----
double Macd_h1_a= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,a);
double Macd_h1_b= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,b);
double Macd_h1_c= iMACD(NULL,period,12,26,9,PRICE_CLOSE,MODE_MAIN,c);
…
….
Далее блоки сравнения такие же, как и в основном варианте.
Пример работы скрипта для торгов:
Имейте в виду, что значения переменных «а» и «period» должны быть заданы до использования скрипта! И еще: в торгующем варианте целесообразнее начальный бар взять равным единице, так как нулевой бар может оказаться не сформированным на момент запроса данных, например в середине или в начале периода.
В заключении хочется надеяться, что применение этого скрипта поможет начинающим трейдерам и не только уменьшит число ошибок при торговле хотя бы процентов на 10. Всем удачного профита!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Спасибо за работу, возможно кому то будет польза.
А нельзя ли сделать так - в момент когда происходит разворот тренда раздаётся звуковой сигнал, и я - лежащий на диване просыпаюсь.
Спасибо, очень интересная статья, но в ней, к сожалению, есть грубая техническая ошибка. Связана она с терменологической разницей производителей платформ.
Дело в том, что доктор А.Элдер под гистограммой-MACD подразумевает разницу между быстрой (отражаемой, как правило, в форме гистограммы) и сигнальной линиями. Такм образом, вместо вызова iMACD следует вызывать iOsMA.
Увы, это очень важно, но нисколько не уменьшает значимость и полезность Вашей работы.
Спасибо.
Это, по-сути, анализ первой производной MACD. На росте скорости входим, на торможении выходим.
Нет, не так!
Во-первых, этот (по сути) индикатор не предназначен для принятия решений типа "входим/выходим". Его предназначение - торможение, то есть предотвращение неправильного входа в рынок или преждевременного выхода. Он показывает основной тренд и дает оценку скорости смены тенденции.
Если Вы, например, работаете на M15, то установленный индикатор на на H1, будет показывать основной, не побоюсь этого слова, глобальный тренд рынка. Самое простое - не вываливайтесть против этого тренда! Хотя есть и более изощренные варианты, кстати, хорошо изложенные доктором А.Элдером.
Во-вторых, как я уже писал автору, это должен быть не анализ первой производной MACD, а анализ первой производной разности быстрой (отражаемой на графике MACD гистограммой) и сигнальной линиями. Эта разность, как правило, опережающий индикатор. Вход и выход по рынку делают на основании MACD (если упрощенно, без точных условий) в моменты пересечения линий, то есть в моменты, когда их разность нулевая, а производная разности в максимуме или близка к нему.
Автор большой молодец. Действительно, его работа позаволяет убрать до 80% неверных выходов. При правильном применении этот скрипт сохранит много денег малоопытных трейдеров.
Во-вторых, как я уже писал автору, это должен быть не анализ первой производной MACD, а анализ первой производной разности быстрой (отражаемой на графике MACD гистограммой) и сигнальной линиями. Эта разность, как правило, опережающий индикатор.
Скорее всего, автор имел в виду именно iMA, но согласен с замечанием - лучше использовать iOsMA. Обратите внимание, кто хочет его использовать.