English 中文 Español Deutsch 日本語 Português
Консультант-советник трейдера на основе расширенного анализа MACD

Консультант-советник трейдера на основе расширенного анализа MACD

MetaTrader 4Примеры | 24 марта 2008, 14:36
2 276 9
Genkov
Genkov

Введение

Одним из лучших признанных индикаторов направления движения цены является гистограмма 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. Всем удачного профита!


Прикрепленные файлы |
TrendMACD_v5.mq4 (10.79 KB)
TrendMACD_v6.mq4 (9.12 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (9)
Genkov
Genkov | 27 мар. 2008 в 13:24
YuriF:

Спасибо за работу, возможно кому то будет польза.

А нельзя ли сделать так - в момент когда происходит разворот тренда раздаётся звуковой сигнал, и я - лежащий на диване просыпаюсь.

      Спасибо за спасибо! А в связи с тем, что в MQL4 есть ограничения в частности: цитата • Скрипт (Script) - программа, предназначенная для одноразового выполнения каких-либо действий. В отличие от экспертов, скрипты запускаются не потиково, а по запросу, и потому будильник из этого не получиться! Для выполнения Вашего желания нужна другая программа. Если есть вопросы как? и т.д. прошу на мыло genkov@br.ru.  
BluesBoy
BluesBoy | 23 сент. 2009 в 11:08

Спасибо, очень интересная статья, но в ней, к сожалению, есть грубая техническая ошибка. Связана она с терменологической разницей производителей платформ.

Дело в том, что доктор А.Элдер под гистограммой-MACD подразумевает разницу между быстрой (отражаемой, как правило, в форме гистограммы) и сигнальной линиями. Такм образом, вместо вызова iMACD следует вызывать iOsMA.

Увы, это очень важно, но нисколько не уменьшает значимость и полезность Вашей работы.

Спасибо.

BluesBoy
BluesBoy | 23 сент. 2009 в 11:44
ArtemRG:

Это, по-сути, анализ первой производной MACD. На росте скорости входим, на торможении выходим.


Нет, не так!

Во-первых, этот (по сути) индикатор не предназначен для принятия решений типа "входим/выходим". Его предназначение - торможение, то есть предотвращение неправильного входа в рынок или преждевременного выхода. Он показывает основной тренд и дает оценку скорости смены тенденции.
Если Вы, например, работаете на M15, то установленный индикатор на на H1, будет показывать основной, не побоюсь этого слова, глобальный тренд рынка. Самое простое - не вываливайтесть против этого тренда! Хотя есть и более изощренные варианты, кстати, хорошо изложенные доктором А.Элдером.

Во-вторых, как я уже писал автору, это должен быть не анализ первой производной MACD, а анализ первой производной разности быстрой (отражаемой на графике MACD гистограммой) и сигнальной линиями. Эта разность, как правило, опережающий индикатор. Вход и выход по рынку делают на основании MACD (если упрощенно, без точных условий) в моменты пересечения линий, то есть в моменты, когда их разность нулевая, а производная разности в максимуме или близка к нему.

Автор большой молодец. Действительно, его работа позаволяет убрать до 80% неверных выходов. При правильном применении этот скрипт сохранит много денег малоопытных трейдеров.

[Удален] | 4 мая 2010 в 23:47
А может было бы полезнее оформить его в качестве индикатора?
[Удален] | 28 авг. 2010 в 20:08
BluesBoy:

Во-вторых, как я уже писал автору, это должен быть не анализ первой производной MACD, а анализ первой производной разности быстрой (отражаемой на графике MACD гистограммой) и сигнальной линиями. Эта разность, как правило, опережающий индикатор. 


Скорее всего, автор имел в виду именно iMA, но согласен с замечанием - лучше использовать iOsMA. Обратите внимание, кто хочет его использовать.
MetaEditor: Опираясь на силу шаблонов MetaEditor: Опираясь на силу шаблонов
Не все знают, что подготовительную работу по написанию советника можно сделать один раз, и потом пользоваться этим постоянно.
Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота (Часть 2) Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота (Часть 2)
В данной статье автор продолжает обзор алгоритмов реализации простейших торговых систем и знакомит с некоторыми, актуальными подробностями использования результатов оптимизаций. Статья будет полезна начинающим трейдерам и начинающим экспертописателям
Как легко и просто опубликовать видео на MQL4.community Как легко и просто опубликовать видео на MQL4.community
Показать обычно легче, чем рассказать. Предлагается простой и бесплатный способ создания видеороликов с помощью CamStudio для публикации на форумах MQL4.community.
Сравнительный анализ 30 индикаторов и осцилляторов Сравнительный анализ 30 индикаторов и осцилляторов
В статье описывается Советник, позволяющий провести сравнительный анализ 30 индикаторов и осцилляторов, с целью формирования эффективного пакета показателей для торговли.